《应用系统开发安全管理通则030326v3fd.docx》由会员分享,可在线阅读,更多相关《应用系统开发安全管理通则030326v3fd.docx(46页珍藏版)》请在课桌文档上搜索。
1、应用系统开发安全管理通则030326v3fd编号:PetrOChina中国石油天然气股份有限公司应用系统开发安全管理通则G比阅稿)BearinsPointfr7豪名单马威咨牛将版本号:V3批阅人:王巍中国石油天然股份有F艮公司随着中国石油天然气股份有限公司(下列简称“中国石油”)信息化建设的稳步推进,信息安全日益受到中国石油的广泛关注,加强信息安全的管理与制度无疑成为信息化建设得以顺利实施的重要保障。中国石油需要建立统一的信息安全管理政策与标准,并在集团内统一推广、实施。本规范是根据中国石油信息安全的现状,参照国际、国内与行业有关技术标准及规范,结合中国石油自身的应用特点,制定的适合于中国石油
2、信息安全的标准与规范。目标在于通过在中国石油范围内建立信息安全有关标准与规范,提高中国石油信息安全的技术与管理能力。信息技术安全总体框架如下:物理环境 安全谛用(fJ应用系统安金谛理网络安仝管理概述os,一 (e 不使用strcpy(),使用stmcpy() 不使用StrCat(),使用strncat() 不使用SPriInf(),使用snprintf() 不使用gets(),使用fgets()在上面的前三个中函数中,每个替代函数的“n”表示了使用的缓冲区的大小。最后一个函数的“f”,表示格式,它同意用户指定期望的输入的格式。这些替换方程强制程序员定义使用的缓冲区的尺寸与确定输入的类型。9.1
3、.4,2格式化字符串攻击(FormatStringAttack)该类攻击往往与缓冲区溢出有关,由于它们往往要紧利用了某些函数的假设,比如SPrintfO与VSPrintf()假设缓冲区的长度是无限的。然而即使使用snprintf()替换SPrintf()也无法完全保护程序不受格式化字符串的攻击。这些攻击通过直接将格式说明符(fbrmatspecifiers)(%d,%s,%n等)传递到输出函数接收缓冲区来进行。比如,下列的代码就是不安全的:snrintf(buffer,sizeof(buffer)zstring)这种情况下,能够在字符串中插入格式说明符来操纵内存的栈,来写入攻击者的数据(这些数
4、据中包含小的程序代码,并可由处理器接着执行)。更多关于这些攻击的具体内容请见资源章节。对以上的例子建议使用下面的代码。snprintf(buffer,sizeof(buffer),%s,fstring)进行格式字符串攻击不太容易。首先攻击者务必能获得内存栈的内容情况(从应用导出或者者使用调试器),然后务必明白如何精确访问特定的内存空间来操纵栈中的变量。9.1.4.3执行外部程序推荐使用exec()函数而不是SyStem()函数来执行外部程序。这是由于system()接收整个命令行的随机的缓冲区来执行程序。snprintf(buffer,sizeof(buffer),emacs%s,filena
5、me);systcm(buffer);在以上的例子中,能够通过使用分号利用文件名变量在sehll中插入额外的命令(比如文件名能够是etchosts;rm*,这将在显示etchosts目录文件的同时,删除目录中的所有文件)。而exec()函数只保证第一个参数被执行:execl(,usr/bin/emacs,usrbinemacs,filename,NULL);上面的例子保证文件名仅仅作为一个参数输入Emacs工具,同样它在Emacs命令中使用完全的路径而不是使用能够被攻击者利用的PATH环境变量。9.1.4.4竞争条件(racecondition)进程需要访问资源时(不管是磁盘、内存或者是文件)
6、通常需要执行两个步骤:(1)首先测试资源是否空闲可用(2)假如可用,就访问该资源,否则它等到资源不再使用为止再去访问它当另一个进程在步骤1与2之间想要访问同个资源时将出现问题,导致不可预测的结果。进程可能会被锁定,或者者一个进程籍此获得了另一个进程的较大的权限而导致安全问题。攻击要紧集中在有较大权限的程序上(称之SetUid程序)。竞争条件攻击通常利用程序执行时能够访问到的资源。另外权限低的程序也存在安全风险,由于攻击者可能会等待有较高权限的用户执行那个程序(比如root),然后进行攻击。下面的建议有助于缓解竞争条件(raceCOnditiOn)攻击:在进行文件操作时,利用那些使用文件描述符的
7、函数而不使用那些使用文件路径的函数(比如使用fdopen()而不要使用fopen(),文件描述符使得恶意的用户在文件打开时或者是在原始的进程对文件进行操作前,无法使用文件连接(符号式的或者是物理的)来改变文件。在写文件甚至在读文件时宜使用fcntl()与flock()函数来对文件加锁,这样它们就不能被其他进程访问。它几乎能够建立原子级的操作。应慎重操纵临时文件,由于它往往会导致竞争条件攻击。9. 1.4.5检验有效的返回值检验有效的返回值非常重要。一个例子是旧的binkgin的实现中不检验错误的返回值,导致当它找不到etcpasswd文件时返回root的访问权限。假如该文件损坏了则这种情况是合
8、理的;但假如该文件存在只是无法访问,那么这就是一个大问题。9.2 系统开发安全有关工具管理有许多方法来确保代码符合一定的安全级别。正如前面指出的,最好的方法之一是让尽可能多的人来检查代码(而不是在QA环境中实际进行白箱或者者黑箱测试)。然而,有的时候代码在开始实际环境的应用前往往没有足够的时间,同时即使检查代码也会漏掉些不易发现的错误。这些错误可能会对整个系统导致重大的安全问题。因此(与其他的原因),使用源码分析工具(SOUrCeCodeAnalySiSTool(SCAT)来自动进行某些检查过程很有帮助。本文介绍了一些这方面的工具。每个工具都用同样的测试工具来检验,这些测试工具包含C与JaVa
9、的代码段,而这些代码段存在潜在的安全错误。我们比较了每个工具的测试结果,同时认真检查了下列的属性:a)灵活性-有多种选项并能扫描多种类型的代码的工具得分会较高。b)正确性一要紧目标是发现正确的安全问题,同时不可能出现大量的误报信息,或者者更糟的是没有发现真正的错误信息。c)容易使用一大多数情况下,程序员只需将工具指定到特定的代码上然后选择“扫描”。除非特别需要,程序员通常只做抽样检查,而无需开发复杂的测试机制。d)投表一扫描结果应以一种容易懂得的格式来显示,同时最好同时提示修改每个问题的方法,并附加理由。每个工具在解析代码上的速度能够忽略不计,因此没有进行比较(尽管这并不包含配置扫描的时间,而
10、MoPS在这方面相关于其它工具需要更多的时间)。另外,这些工具都能够免费获得,甚至能够获得它们的源代码,因此不需考虑它们的成本。9.2.1 工具一:PScanPscan是一个有针对性的扫描程序,要紧用于发现C程序中的缓冲区溢出与格式化字符串攻击。该程序检查所有用到标准C程序库中的printf()函数。sprintf(buffer,variable);printf(buffer,variable);关于这些语句在缓冲区溢出与格式化字符串攻击中如何被利用能够查阅有关的C与C+文档。Pscan的一个不足是不能发现由于越界检查不充分而引起的常规性缓冲区溢出。但PSCan关于缓冲区溢出与格式化字符串攻击的定位还是相当精准与快速的。PSCan程序相对简单,它只将结果返回标准输出,当然也能够将其输出到文件,同时除了说明程序员应如何修正错误以外,不给出语句为什么出错等类似信息。该工具一个显著的特点是能够同时扫描多个文件。总体而言PSCan程序相对简单,易于使用,同时针对性很强,但是由于它能够适用的范围过于狭窄因此通常不推荐其在大型商