您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 规章制度 > 通用代码安全编程规范
软件安全■文档编号V1.0■密级商业机密■版本编号■日期2009.3.25©2010绿盟科技上海分公司-张杰■版权声明本文中出现的任何文字叙述、文档格式、插图、照片、方法、过程等内容,除另有特别注明,版权均属绿盟科技所有,受到有关产权及版权法保护。任何个人、机构未经绿盟科技的书面授权许可,不得以任何方式复制或引用本文的任何片断。-I-目录一.软件安全简介.................................................................................................................................1二.软件安全设计.................................................................................................................................22.1架构设计....................................................................................................................................22.2输入处理....................................................................................................................................22.3缓冲区溢出.................................................................................................................................32.4字符串格式化问题.....................................................................................................................32.5加密与认证.................................................................................................................................42.6错误和异常处理.........................................................................................................................5软件安全©2007绿盟科技密级:商业机密-1-一.软件安全简介软件主要指计算机系统中的程序(源程序和执行程序)以及程序运行所必须的数据和文档。信息系统中各种软件程序的安全必须得到重视,事实上,系统的硬件和操作系统提供了完成系统设计目标的可能性,而具体的任务需要有各种各样的软件配合来完成。所以有了操作系统的安全,还需要有软件的安全。软件安全的重要性源于软件与其所处理和维护的数据密不可分,而这些数据包含的信息就是建设信息系统的最终目的,也是信息系统的主要资产。要说明一个应用软件是可靠的,一般需要采用形式化的方法,即首先需要对它进行形式化规范的说明,其次还要验证形式化规范与编码实现的一致性。这两者都是极其困难的,更糟糕的状况在于,形式化方法可以通过揭示系统的不一致性、歧义性和不完备性来增加我们对系统的理解程度,从而提高我们对系统可靠性的可信度,但是形式化方法本身也不能确保系统的可靠性。由此可见,要使得一个应用软件具有安全性是极其困难的。事实上,我们可以看到,各种应用软件的漏洞和错误正在不断涌现。软件不断升级同时推出各种补丁包。这方面,微软的IE浏览器可以作为例子,许多黑客入侵事件都是利用了IE的漏洞。关于软件的安全性有两个很著名的例子可以说明其重要性。1996年6月,欧洲宇航局的阿丽亚娜5号火箭由于软件故障,在发射之后爆炸。原因是一个64位数据被装入16位空间引起溢出。三年后,NASA的火星探路者在一次发射中神秘失踪,起因是一个数据转换错误。NASA的工程师没有把火箭冲力的单位从英制“磅”换算成“牛顿”,两种计量单位之间相差4.45倍。这两起灾难虽然与计算机安全无关,但却表明设计和实现无错误故障代码的重要性。软件安全需要保护的内容很广泛,包括软件自身的安全,软件的存储安全,软件的通信安全,软件的使用安全,软件的运行安全等多方面内容。当前的信息系统对软件和数据的依赖性日益严重,软件中任何一个小的纰漏、一种不完善的功能、一次微细的修改都可能对系统造成极大的影响。现实中软件bug的例子比比皆是。对软件的保护和对系统的保护一样至关重要、是十分迫切需要解决的问题。根据CarnegieMellon大学的估计,每1000行代码一般有5至15个bug,大多数的bug是轻微的,并不影响软件的性能,因而不被注意。问题的重点在于,这些确实都是安全隐患。“更深层次的问题是:在任何复杂系统中,如火箭系统的软件、大型数据库、操作系统、网络软件等,它们都有太多的环节可能出问题。复杂性一直在不断突破人类的极限,想要对所有问题进行设计和测试是不现实的。出现故障是不可避免的。”当然软件安全是极其复杂的问题的,软件的正确无错性只是软件安全的一个方面而不是问题的全部。软件安全©2007绿盟科技密级:商业机密-2-二.软件安全设计2.1架构设计l进攻面最小化原则在软件架构中将最少的功能性代码开放给用户。如:功能代码和界面代码分离,内核代码和用户任务处理代码分离等。l深度防卫原则在软件代码开发中注重代码安全性加入安全防护功能代码,如:防溢出处理,防注入代码,防跨站代码等。l最小权限原则对软件用户或软件运行权限进行最小化,防止使用者恶意突破权限限制非法操作。n只为程序中需要特权的部分授与特权n只授与部分绝对需要的具体特权n将特权的有效时间或者可以有效的时间限制到绝对最小l其它安全架构原则2.2输入处理在几乎所有安全的程序中,第一道防线就是检查您所接收到的每一条数据。如果您能不让恶意的数据进入您的程序,或者至少不在程序中处理它,您的程序在面对攻击时将更加健壮。这与防火墙保护计算机的原理很类似;它不能预防所有的攻击,但它可以让一个程序更加稳定。这个过程叫做检查、验证或者过滤您的输入。一个明显的问题是,在何处执行检查?是在数据最初进入程序时,或者是在一个低层次的例程在实际使用这些数据时?通常,最好在这两处都对其进行检查;这样,即使一个攻击者成功地突破了一道防线,他们还会遇到另一条。最重要的规则是所有的数据必须在使用之前被检查。l验证内容n验证所有输入n验证各种来源的输入软件安全©2007绿盟科技密级:商业机密-3-n建立可信边界l验证方法n使用强输入验证n避免使用黑名单法n不混淆可用性和安全性n拒绝不良数据n默认执行严格的输入验证n检验输入数据长度n限制数字输入2.3缓冲区溢出缓冲区溢出通常是向数组中写数据时,写入的数据的长度超出了数组原始定义的大小。比如前面你定义了intbuff[10],那么只有buff[0]-buff[9]的空间是我们定义buff时申请的合法空间,但后来往里面写入数据时出现了buff[12]=0x10则越界了。C语言常用的strcpy、sprintf、strcat等函数都非常容易导致缓冲区溢出问题。对付缓冲区溢出攻击的方法不少,但常见的也是最重要有一下四种方式:l正确的编写代码l非执行的缓冲区l检查数组边界l程序指针完整性检查2.4字符串格式化问题当允许用户输入影响某些字符串格式化函数的格式串参数时,可能会发生格式串错误。譬如要输出一个字符串str,形式printf(%s,str)是相对安全的,而printf(str)就不好了,万一str中掺杂了格式指示符,后面这种形式就会出问题。虽然漏洞利用方式很多也很复杂,但是,如果在下列原则中,选择一个可以在应用程序环境中执行的最严格限制,那么绝大部分格式串漏洞是可以避免的:l对任何接收格式串参数的函数,都只传递静态格式串l如果只传递某个固定的静态格式串的限制太严格,可以定义一个有效的格式串集合,然后从这个安全的集合中选择格式串。l如果应用程序必须要求格式串包括从应用程序外部读入的输入,那么对于从应用程序外部读入的、将要包含在格式串中的值,应执行严格的、基于白名单的输入验证。软件安全©2007绿盟科技密级:商业机密-4-l许多格式串攻击的核心都是利用%n格式化指令,该指令导致将已经处理的字符总数作为一个整数值写入到内存中。因此,应当严格控制%n指令的使用。2.5加密与认证认证就是指用户必须提供他是谁的证明,他是某个雇员,某个组织的代理、某个软件过程。认证的标准方法就是弄清楚他是谁,他具有什么特征,他知道什么可用于识别他的东西。比如说,系统中存储了他的指纹,他接入网络时,就必须在连接到网络的电子指纹机上提供他的指纹,只有指纹相符才允许他访问系统。最普通的就是口令,口令具有共享秘密的属性。例如,要使服务器操作系统识别要入网的用户,那么用户必须把他的用户名和口令送服务器。服务器就将它仍与数据库里的用户名和口令进行比较,如果相符,就通过了认证,可以上网访问。这个口令就由服务器和用户共享。在安全方面最薄弱的一环是网络窃听,如果口令以明码(未加密)传输,接入到网上的规程分析仪就会在用户输入帐户和口令时将它记录下来,任何人只要获得这些信息就可以上网工作。l数据隐私n识别私有信息n处理私有信息l密码n源代码中不能有密码n不存储明文密码n不明文传输密码l随机数n不生成不必要的种子n不要容忍不好的随机性l密码技术n选择一个好的算法n不要自以为是l内存保护n使内存中保持机密信息的时间最短n保守的共享机密信息n安全的删除机密信息n防止不必要的复制机密信息软件安全©2007绿盟科技密级:商业机密-5-2.6错误和异常处理程序在运行过程中可能会出现错误而中断正常的控制流,这就是异常现象。不提供处理异常的代码的程序可能会在不期望终止的时候终止,甚至可能引发严重问题。例如,如果程序试图从存款账户上把钱转移到支票账户上,但是因为运行时错误,在把钱从存款账户上提取之后和把钱存入支票之前,程序被终止,那么用户将会有经济损失。l检查函数和方法返回值l管理异常n捕获顶层方法的任何错误信息n消失的异常n只捕获需要处理的异常n控制已检测的异常l防止资源泄露l日志和调试记录n集中式日志记录n最终成品中不包含调试帮助和访问代码n清除备份文件n不要容忍”彩蛋”
本文标题:通用代码安全编程规范
链接地址:https://www.777doc.com/doc-1241980 .html