读软件开发安全之道:概念、设计与实施14低级编码缺陷

本文主要是介绍读软件开发安全之道:概念、设计与实施14低级编码缺陷,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 低级编码缺陷

1.1. 在更靠近机器级别的代码中常会出现这类缺陷

  • 1.1.1. 越接近硬件级别越能获得最大效率的诱惑仍然很大

  • 1.1.2. 更接近硬件级别的编程是非常强大的,但其代价是工作量和脆弱性的增加

1.2. 当数据超出了固定的大小,或者超出了分配的内存缓冲区容量时,就会出现这类问题

2. 算术漏洞

2.1. 不同编程语言在定义其算术运算时有所不同,这种不同体现在数学上或处理器的相应指令上

2.2. 浮点数运算的范围比整数运算的范围更大,但其有限的精度也会导致意外的结果

2.3. 定宽整数漏洞

  • 2.3.1. 定宽整数是包括Java和C/C++在内的许多语言中最基本的构建块,如果计算超出了定宽整数的限制范围,你将得到错误的结果

  • 2.3.2. 安全性的底线在于我们要了解语言规范,并且避免出现有可能未定义的计算

    • 2.3.2.1. 不要耍小聪明,试图找到某种方法来检测未定义的结果,因为在不同的硬件或新版本的编译器上,你的代码可能会停止工作
  • 2.3.3. 错误的计算结果会让代码出现各种问题,并且这些问题通常会像雪球一样越滚越大,形成一连串的功能障碍,并最终导致系统崩溃或蓝屏

  • 2.3.4. 程序员最好能在代码执行任何有可能超出范围的计算之前解决这些问题,并且保证所有数字都在范围之内

    • 2.3.4.1. 解决问题最简单的方法是使用比有可能出现的最大值还要大的整数空间,然后检查并确保无效值永远不会悄悄潜入
  • 2.3.5. 将计算分解,以便在乘法和除法中使用64位计算,并向下转换为32位结果

  • 2.3.6. 最干净的解决方案是将所有变量都升级为64位,代价是降低一点效率

  • 2.3.7. 这就是使用定宽整数进行计算所涉及的权衡

2.4. 浮点精度漏洞

  • 2.4.1. 浮点数在很多方面都比定宽整数更强健,并且限制更少

  • 2.4.2. 当超出这个极大的范围时,你会得到一个有符号的无穷大或NaN(Not a Number,不是数字)反馈,而不是像定宽整数那样对值进行截断

  • 2.4.3. 1/10在二进制中是一个无限循环小数(即0.00011001100…以1100无限循环)​,所以最低位会出现错误

    • 2.4.3.1. 这些错误都是在低位引入的,因此称为下溢(underflow)
  • 2.4.4. 错误不会带来重大影响,但是当需要全精度时,或者当计算中纳入不同数量级的值时,优秀的编码人员会格外谨慎

  • 2.4.5. 当无法精确表示结果值时,低位少量的错误也会一直累积

    • 2.4.5.1. 尽可能永远不要使用浮点值来比较值是否相等(或不相等)​,因为这种操作无法容忍计算值的微小差异
  • 2.4.6. 当你必须使用高精度时,请考虑使用超高精度浮点表示法(IEEE 754中定义了128位和256位格式)​

    • 2.4.6.1. 任意精度的十进制或有理数表示都可能是最佳选择

2.5. 安全算术

  • 2.5.1. 整数溢出比浮点下溢更容易出现问题,因为它会带来差别很大的结果,但我们也不能认为浮点下溢很安全而忽略它

  • 2.5.2. 使用类型转换时要谨慎,因为它有可能像执行计算一样导致截断或改变结果

  • 2.5.3. 任何情况下,尽可能限制计算的输入,确保所有可能出现的值都是可以正确表示的

  • 2.5.4. 使用较大的固定的整数来避免可能出现的溢出;在将结果转换为较小的整数之前,检查结果是否在范围内

  • 2.5.5. 要记住,即使最终结果始终在范围内,计算的中间值也有可能会溢出,从而导致问题

  • 2.5.6. 在检查安全敏感代码及其周围的算术正确性时要格外谨慎

3. 内存访问漏洞

3.1. 大多数编程语言都提供了完全托管的内存分配,并设置适当的边界来限制其访问

3.2. 指针允许通过地址直接访问内存,这可能是C语言中最强大的功能

3.3. 缓冲区溢出

  • 3.3.1. 当代码访问的内存位置在预期的目标缓冲区之外时,就会发生缓冲区溢出(buffer overflow或buffer overrun)​

  • 3.3.2. 缓冲区(buffer)是表示内存中任意区域的通用术语:数据结构、字符串、数组、对象或任何类型的变量

  • 3.3.3. 访问(access)是读取内存或写入内存的统称

  • 3.3.4. 缓冲区溢出指的是在预期内存区域之外,对内存进行读取或写入

  • 3.3.5. 缓冲区溢出并不是堆内存独有的,而是任何类型的变量都有可能发生的,包括静态分配和栈上的局部变量

  • 3.3.6. 缓冲区溢出bug会意外地读取内存,这可能会将信息泄露给攻击者,或者导致代码行为异常

  • 3.3.7. 不要低估执行显式的内存分配、范围内访问,以及精准释放未使用的内存的难度和重要性

    • 3.3.7.1. 使用简单模式来分配、使用和释放是最好的,其中包括异常处理,以确保不会跳过释放操作

    • 3.3.7.2. 当一个组件给其他代码的引用分配内存时,一定要定义随后内存释放的责任,将其释放到接口的一侧或另一侧

  • 3.3.8. 即使是在包含完全范围检查、垃圾收集等功能的语言中,你仍会遇到麻烦

    • 3.3.8.1. 任何直接在内存中修改数据结构的代码都可能会导致与缓冲区溢出类似的问题

3.4. 要想降低这种内存意外泄露的风险并不难,但我们必须覆盖有可能发生泄露的数据结构中的所有字节

  • 3.4.1. 不要试图准确预测编译器会如何分配字段偏移量,因为这可能会随着时间和平台的变化而变化

  • 3.4.2. 避免这些问题最简单的方法是在分配后将缓冲区清零,除非我们可以确保它们被完全覆盖,或者知道它们不会被泄露到信任边界之外

  • 3.4.3. 即使你的代码本身并不使用敏感数据,但通过这种内存泄露路径也可能在进程中的任何位置将其他数据泄露出去

4. Heartbleed漏洞

4.1. Heartbleed是研究低级语言脆弱性的一个很好的对象

  • 4.1.1. 小错误会引发巨大的影响

  • 4.1.2. 如果恰好发生在内存中错误的位置上,则缓冲区溢出可能会暴露具有高价值的秘密

  • 4.1.3. 设计(协议规范)中已经预测到了这个错误,指出代码应该忽略字节长度不正确的心跳请求,但在没有明确测试的情况下,没有人注意到这个漏洞

4.2. Heartbleed是TLS Heartbeat扩展中OpenSSL实践的一个缺陷,于2012年在RFC 6520中一起提出

4.3. Heartbleed漏洞不仅作为“第一个带有徽标的bug”而成为新闻,还在部署了流行的OpenSSL TLS库的服务器中揭示了一个微小的漏洞

4.4. 所谓心跳,就是往返交互心跳请求,其有效载荷是16至16384(214)字节之间的任意数据,与之对应的心跳响应中也携带了相同的载荷

4.5. 格式错误的心跳请求中会发生严重缺陷,这些请求提供了一个小的有效载荷,却声称是一个较大的载荷

4.6. 最终会被泄露的数据取决于内存分配的弱点,攻击者可以重复利用这个漏洞来访问服务器内存,并最终得到各种敏感数据

4.7. 对“会说谎”的心跳请求做出预测

  • 4.7.1. 这些请求会要求比它们所提供的载荷多得多的载荷

4.8. 在格式正常的请求中,一切都可以完美地运行,只有格式错误的请求才会让本无恶意的代码出现问题

4.9. 心跳响应中泄露的服务器内存并不会对服务器造成直接伤害:只有对被泄露的大量数据进行仔细分析后,人们才能看出损失程度

  • 4.9.1. 它不太可能发生,并且返回比接收到的载荷多得多的载荷数据,乍看起来似乎是无害的

这篇关于读软件开发安全之道:概念、设计与实施14低级编码缺陷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1123764

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

2024网安周今日开幕,亚信安全亮相30城

2024年国家网络安全宣传周今天在广州拉开帷幕。今年网安周继续以“网络安全为人民,网络安全靠人民”为主题。2024年国家网络安全宣传周涵盖了1场开幕式、1场高峰论坛、5个重要活动、15场分论坛/座谈会/闭门会、6个主题日活动和网络安全“六进”活动。亚信安全出席2024年国家网络安全宣传周开幕式和主论坛,并将通过线下宣讲、创意科普、成果展示等多种形式,让广大民众看得懂、记得住安全知识,同时还

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return