确认c和c++的安全性和可靠性.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
确认c和c的安全性和可靠性

技术白皮书 确认C/C++的安全性和可靠性 结构化的方法进行代码走查 版本:2.0 日期:2007-3-24 上海:021北京:010成都:028西安:029深圳:0755 前 言 《技术白皮书》是由上海创景计算机系统有限公司翻译整理的高质量软件开发相关的技术白皮书。鉴于目前国内相关行业实施高可靠性软件开发的现状,我们整理该白皮书的目的是为了帮助软件开发人员在实际工作中更好的改进相关工作。 我们希望通过我们的相关工作,辅助客户能够更好更快的实施高质量的软件开发;我们的目标是为您提供一整套的高质量软件的开发和质量保证的解决方案;并通过我们优质的服务保证该方案能够在相关单位按照符合单位现状的方式得到贯彻和实施。 如果您有相关的问题或者建议请和我们联系。 最后,衷心感谢多年来大家对上海创景计算机系统有限公司的关心和支持! 确认C/C++的安全性可靠性—结构化的方法进行代码走查 Rebert C. Seacord是CERT/C资深的缺陷分析家,著有《C和C++的安全性代码》(Addison-Weslay,2005)[1]。可以通过 rcs@联系他。 缓冲器溢出是软件缺陷的主要来源。当数据写在为特定数据结构分配的内存空间之外,就会发生缓冲器溢出。缓冲器溢出是十分麻烦的,因为在软件开发和测试的的过程中很难发现它。除了运行时,通常的C和C++编译器在编译时都不能识别出可能的缓冲器溢出,也不能报告它。 不是所有的缓冲器溢出都导致可掠夺性的软件缺陷。然而,缓冲器溢出能引起程序在用户(潜在地怀有恶意地)大量输入数据时容易受到攻击,那些造成不明显缺陷的缓冲器溢出甚至能引入风险。 代码审查技术为减少程序开发的错误已被使用多年[2]。代码审查主要用于识别和消除安全缺陷,包括可导致掠夺性的缓冲器溢出的缺陷和其他的被认为“源代码安全性审查”的缺陷。这些审查方法在发现和消除一些问题方面是有效的,而利用现有的工具并不能侦测出这些问题。然而,源代码审查技术代表了非结构化的代码走查,很大程度上依赖于程序员的经验和韧性。 任何的人工过程都易于产生错误,而使用更多的结构化方法可以保证更高的质量,从而那些潜在的安全缺陷就能被正确地识别和纠正。这篇论文的剩余部分,我会描述C和C++语言的人工走查过程,这些都基于安全-可靠C/C++ Plum Hall[3]。 安全-可靠C/C++(SSCC)是消除引起缓冲器溢出和其他一些程序错误的缺陷的方法的集合,它是C/C++编译时,链接时和运行时的测试,加上一些设计约束的混合物。SSCC最基本的前提在于大多数掠夺性的机制(尤其是那些arbitrary code的转换控制)需要读写程序定义的数据结构范围之外的内存位置。这就允许进攻者可复写堆栈的返回地址或其他地址,最终就转移去执行进攻者提供的或者已存在系统中的arbitrary code 。通过消除这样可能的写操作,就可能消除这些缺陷。 为了证明人工走查过程是如何工作的,我使用例1所示的hbAssignCodes()函数,它来自标准性能评估组织(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——标记获取和存储 这个函数中有两个下标获取和存储的地方,都在1441行。变量length是个函数参数,被定义为unsigned char型的指针。变量code也是个函数参数,但被定义为int型的指针。当这些变量有了下标,指针的值就会加上各自类型的字节长度i次。在32位的Intel体系结构中,unsigned char类型的字节长度是单字节,而int类型的字节长度是4字节。 在这两种情况下,指针变量都没有清楚地指出指向得是什么

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档