确认C和C++的安全和可靠.doc_第1页
确认C和C++的安全和可靠.doc_第2页
确认C和C++的安全和可靠.doc_第3页
确认C和C++的安全和可靠.doc_第4页
确认C和C++的安全和可靠.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

确认 C C 的安全性和可靠性结构化方法进行代码走查 1 上海创景计算机系统有限公司 技术白皮书 确认 C C 的安全性和可靠性 结构化的方法进行代码走查 版本 2 0日期 2007 3 24 上海 021 58380789北京 010 62131690 成都 028 86527582西安 029 88323529深圳 0755 83581788 确认 C C 的安全性和可靠性结构化方法进行代码走查 1 上海创景计算机系统有限公司 前前 言言 技术白皮书 是由上海创景计算机系统有限公司翻译整理的高质量软件开发相关的 技术白皮书 鉴于目前国内相关行业实施高可靠性软件开发的现状 我们整理该白皮书的 目的是为了帮助软件开发人员在实际工作中更好的改进相关工作 我们希望通过我们的相关工作 辅助客户能够更好更快的实施高质量的软件开发 我 们的目标是为您提供一整套的高质量软件的开发和质量保证的解决方案 并通过我们优质 的服务保证该方案能够在相关单位按照符合单位现状的方式得到贯彻和实施 如果您有相关的问题或者建议请和我们联系 最后 衷心感谢多年来大家对上海创景计算机系统有限公司的关心和支持 确认 C C 的安全性和可靠性结构化方法进行代码走查 2 上海创景计算机系统有限公司 确认确认 C C C C 的安全性可靠性的安全性可靠性 结构化的方法进行代码走查结构化的方法进行代码走查 Rebert C Seacord 是 CERT C 资深的缺陷分析家 著有 C 和 C 的安全性代码 Addison Weslay 2005 1 可以通过 rcs cert org 联系他 缓冲器溢出是软件缺陷的主要来源 当数据写在为特定数据结构分配的内 存空间之外 就会发生缓冲器溢出 缓冲器溢出是十分麻烦的 因为在软件开 发和测试的的过程中很难发现它 除了运行时 通常的 C 和 C 编译器在编 译时都不能识别出可能的缓冲器溢出 也不能报告它 不是所有的缓冲器溢出都导致可掠夺性的软件缺陷 然而 缓冲器溢出能 引起程序在用户 潜在地怀有恶意地 大量输入数据时容易受到攻击 那些造 成不明显缺陷的缓冲器溢出甚至能引入风险 代码审查技术为减少程序开发的错误已被使用多年 2 代码审查主要用于 识别和消除安全缺陷 包括可导致掠夺性的缓冲器溢出的缺陷和其他的被认为 源代码安全性审查 的缺陷 这些审查方法在发现和消除一些问题方面是有 效的 而利用现有的工具并不能侦测出这些问题 然而 源代码审查技术代表 了非结构化的代码走查 很大程度上依赖于程序员的经验和韧性 任何的人工过程都易于产生错误 而使用更多的结构化方法可以保证更高 的质量 从而那些潜在的安全缺陷就能被正确地识别和纠正 这篇论文的剩余 部分 我会描述 C 和 C 语言的人工走查过程 这些都基于安全 可靠 C C Plum Hall 3 安全 可靠 C C SSCC 是消除引起缓冲器溢出和其他一些程序错误的 缺陷的方法的集合 它是 C C 编译时 链接时和运行时的测试 加上一些设 计约束的混合物 SSCC 最基本的前提在于大多数掠夺性的机制 尤其是那些 arbitrary code 的转换控制 需要读写程序定义的数据结构范围之外的内存位置 这就允许进攻者可复写堆栈的返回地址或其他地址 最终就转移去执行进攻者 提供的或者已存在系统中的 arbitrary code 通过消除这样可能的写操作 就可 能消除这些缺陷 为了证明人工走查过程是如何工作的 我使用例 1 所示的 hbAssignCodes 确认 C C 的安全性和可靠性结构化方法进行代码走查 3 上海创景计算机系统有限公司 函数 它来自标准性能评估组织 SPEC 的 C 语言基准程序 例例 1 hbAssignCodes 函数函数 void hbAssignCodes int code unsigned char length int minLen int maxLen int alphaSize int n vec i vec 0 for n minLen n maxLen n for i 0 i alphaSize i if length i n code i vec vec vec 1 为了简化过程和审查的认知工作量 人工走查分为一系列的步骤执行 因 为 SSCC 基于防止用户读写程序定义的数据结构范围之外的空间 步骤 1 就是 要识别出涉及到下标和废弃指针的获取和存储操作 显示如表 1 右边的 hbAssignCodes 函数 表表 1 1 步骤 步骤 1 1 标记获取和存储标记获取和存储 这个函数中有两个下标获取和存储的地方 都在 1441 行 变量 length 是 个函数参数 被定义为 unsigned char 型的指针 变量 code 也是个函数参数 但被定义为 int 型的指针 当这些变量有了下标 指针的值就会加上各自类型 的字节长度 i 次 在 32 位的 Intel 体系结构中 unsigned char 类型的字节长度 是单字节 而 int 类型的字节长度是 4 字节 在这两种情况下 指针变量都没有清楚地指出指向得是什么 所以都有可 能越界 因此 在表 1 的左边两个下标操作都被标注了 SUB4 符号是针对下 确认 C C 的安全性和可靠性结构化方法进行代码走查 4 上海创景计算机系统有限公司 标合适的速记方法 也是一种需要和保证 这就意味着为了消除可能的缓冲器 溢出 开发者 编译器和运行系统必须保证 1441 行执行前要满足这样的要求 步骤 2 我们寻找和标记计数循环 计数循环指大多数基本类型的循环 它 包括单调的增加或减少的循环计数 直到计数达到最大值或最小值 如果循环 计数在增加 这个循环被称作 counted plus loop 当循环计数在减少 这个循 环被称作 counted minus loop 表 2 标记了 hbAssignCodes 函数中出现的两 次 counted plus 循环 表表 2 2 步骤 步骤 2 2 识别和标记计数循环识别和标记计数循环 计数循环是有意义的 因为它能帮助我们识别界限 变量 i 作为索引在 1441 行使用两次 是 1440 行 counted plus 循环的循环计数 我们从这条语句可 以看出 i 的值从 0 开始单调递增直到小于 alphasize 的值 这意味着 i 值的上限 是 alphasize 1 它 必须与 length 和 code 数组的下标相配 这些界限在走查过 程的步骤 3 被标识 表 3 显示注解的 hbAssignCodes 函数 表明步骤 3 完成 表表 3 3 步骤步骤 3 3 标识界限标识界限 确认 C C 的安全性和可靠性结构化方法进行代码走查 5 上海创景计算机系统有限公司 表 3 为 1441 行添加注解 对于 length 和 code 数组 alphasize 都是 SUB5 SUB5 表示比作为匹配的数组索引的值要大 即就是 SUB4 加 1 在第 4 步 我们标识函数的声明部分 指出该函数是否存在有争议的要求 因为对于 length 和 code 数组 alphasize 必须是 SUB5 我们在例 2 中将标识这 个要求 例例 2 步骤步骤 4 注释声明注释声明 void hbAssignCodes int code unsigned char length int minLen int maxLen int alphaSize SUB5 length SUB5 code 在第 5 步我们分析每个对该函数的调用 来确定由新注释强加的要求是否 被保证 在现在的例子里 只在程序的 1907 行有对该函数的调用 如表 4 所示 的程序 这个函数的有争议的地方包括 code 和 len 数组 它们各自在 1012 行和 1021 行声明 还有 alphasize 表表 4 4 步骤 步骤 5 5 分析函数调用分析函数调用 确认 C C 的安全性和可靠性结构化方法进行代码走查 6 上海创景计算机系统有限公司 在第 3 步里 已经确定对于 len alphasize 必须是 SUB5 1902 行的注释 根据分析可以看出在 1736 行后 alphasize 等于 258 这向在 1907 行调用 hbAssignCodes 函数提供了预先的保证 这里 alphasize 对于 len 是 SUB5 因 为 len 数组和 code 数组具有相同的边界 这就保证 alphasize 对于 code 也是 SUB5 这意味着在 1907 行调用 hbAssignCodes 是安全的 并且没有额外地 运行时必需的保证 这是理想的结果 因为没有附加的能引入运行时缺陷的代 码被引入 一个函数 qSort3 的缩减版就不能保证是安全的 如表 5 所示 表表 5 qSort3 函数函数 确认 C C 的安全性和可靠性结构化方法进行代码走查 7 上海创景计算机系统有限公司 这个函数表明通过 2496 行时 2446 行下标运算的数目 宏扩展后 函数的 控制流允许在编译时就分析下标 sp 的最小最大范围 分析表明 2446 行的下标 通过 2495 行时是有效的 但是潜在的缓冲器溢出发生在 2496 行 因此 必须修改代码 在 2496 行前插入一个预先的检查来保证 sp 对于 stack 是个有效的下标 或者 在 2437 行将 stack 的边界增加到 1001 有时程序员可能会在 不大会发生真实情形的角落里 分散对缓冲器溢出的 注意力 然而 软件安全需要开发者预见

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论