《应用系统开发安全管理通则_030326_v3_fd精编版[45页].docx》由会员分享,可在线阅读,更多相关《应用系统开发安全管理通则_030326_v3_fd精编版[45页].docx(45页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、最新资料推荐中国石油信息安全标准编号: 中国石油天然气股份有限公司应用系统开发安全管理通则(审阅稿)版本号:V3审阅人:王巍中国石油天然股份有限公司最新精品资料整理推荐,更新于二二一年一月十八日2021年1月18日星期一17:52:16前 言随着中国石油天然气股份有限公司(以下简称“中国石油”)信息化建设的稳步推进,信息安全日益受到中国石油的广泛关注,加强信息安全的管理和制度无疑成为信息化建设得以顺利实施的重要保障。中国石油需要建立统一的信息安全管理政策和标准,并在集团内统一推广、实施。本规范是依据中国石油信息安全的现状,参照国际、国内和行业相关技术标准及规范,结合中国石油自身的应用特点,制定
2、的适合于中国石油信息安全的标准与规范。目标在于通过在中国石油范围内建立信息安全相关标准与规范,提高中国石油信息安全的技术和管理能力。信息技术安全总体框架如下:1) 整体信息技术安全架构从逻辑上共分为7个部分,分别为:物理环境、硬件设备、网络、操作系统、数据和文档、应用系统和通用安全管理标准。图中带阴影的方框中带书名号的为单独成册的部分,共有13本规范和1本通用标准。2) 对于13个规范中具有一定共性的内容我们整理出了7个标准横向贯穿整个架构,这7个标准的组合也依据了信息安全生命周期的理论模型。每个标准都会对所有的规范中相关涉及到的内容产生指导作用,但每个标准应用在不同的规范中又会有相应不同的具
3、体的内容。我们在行文上将这7个标准组合成一本通用安全管理标准单独成册。3) 全文以信息安全生命周期的方法论作为基本指导,规范和标准的内容基本都根据预防保护检测跟踪响应恢复的理论基础行文。本通则讨论了在企业内部自行开发一套应用系统或外包开发所必须考虑到的安全问题。开发应用系统的安全性考虑就好像建设楼房一样,拥有越坚固的地基楼房越是稳定,因此如果在应用系统的开发阶段打好坚实的安全基础,那么以后的日常维护工作就会很轻松。以下我们主要从系统开发的各个阶段入手,阐述在标准的开发流程的各个阶段中所应注意的安全性考虑。本规范由中国石油天然气股份有限公司发布。本规范由中国石油天然气股份有限公司科技与信息管理部
4、归口管理解释。起草部门:中国石油制定信息安全政策与标准项目组。说 明在中国石油信息安全标准中涉及以下概念:组织机构中国石油(PetroChina) 指中国石油天然气股份有限公司有时也称“股份公司”。集团公司(CNPC) 指中国石油天然气集团公司有时也称“存续公司”。为区分中国石油的地区公司和集团公司下属单位,担提及“存续部分”时指集团公司下属的单位。如:辽河油田分公司存续部分指集团公司下属的辽河石油管理局。计算机网络中国石油信息网(PetroChinaNet) 指中国石油范围内的计算机网络系统。中国石油信息网是在中国石油天然气集团公司网络的基础上,进行扩充与提高所形成的连接中国石油所属各个单位
5、计算机局域网和园区网。集团公司网络(CNPCNet) 指集团公司所属范围内的网络。中国石油的一些地区公司是和集团公司下属的单位共用一个计算机网络,当提及“存续公司网络”时,指存续公司使用的网络部分。主干网 是从中国石油总部连接到各个下属各地区公司的网络部分,包括中国石油总部局域网、各个二级局域网(或园区网)和连接这些网络的专线远程信道。有些单位通过拨号线路连接到中国石油总部,不是利用专线,这样的单位和所使用的远程信道不属于中国石油专用网主干网组成部分。地区网 地区公司网络和所属单位网络的总和。这些局域网或园区网互相连接所使用的远程信道可以是专线,也可以是拨号线路。局域网与园区网 局域网通常指,
6、在一座建筑中利用局域网技术和设备建设的高速网络。园区网是在一个园区(例如大学校园、管理局基地等)内多座建筑内的多个局域网,利用高速信道互相连接起来所构成的网络。园区网所利用的设备、运行的网络协议、网络传输速度基本相同于局域网。局域网和园区网通常都是用户自己建设的。局域网和园区网与广域网不同,广域网不仅覆盖范围广,所利用的设备、运行的协议、传送速率都与局域网和园区网不同。传输信息的信道通常都是电信部门建设的。二级单位网络 指地区公司下属单位的网络的总和,可能是局域网,也可能是园区网。专线与拨号线路 从连通性划分的两大类网络远程信道。专线,指数字电路、帧中继、DDN和ATM等经常保持连通状态的信道
7、;拨号线路,指只在传送信息时才建立连接的信道,如电话拨号线路或ISDN拨号线路。这些远程信道可能用来连接不同地区的局域网或园区网,也可能用于连接单台计算机。石油专网与公网 石油专业电信网和公共电信网的简称。最后一公里问题 建设广域网时,用户局域网或园区网连接附近电信部门信道的最后一段距离的连接问题。这段距离通常小于一公里,但也有大于一公里的情况。为简便,同称为最后一公里问题。涉及计算机网络的术语和定义请参见中国石油局域网标准。目 录1概述72目标73适用范围74规范引用的文件或标准85术语和定义96应用系统开发总体原则117系统需求收集和分析阶段127.1可行性研究分析127.2开发人员安全管
8、理147.3建立系统开发安全需求分析报告158系统设计阶段的安全规范178.1单点访问控制且无后门178.2人员职责和权限的定义178.3确保敏感系统的安全性178.4确保访问层的安全性178.5确保日志管理机制健全188.6新系统的容量规划189系统开发阶段安全规范199.1系统开发语言199.2系统开发安全相关工具管理规范279.3控制软件代码程序库299.4在软件开发过程变更管理319.5开发版本管理329.6开发日志审核管理349.7防御后门代码或隐藏通道3410系统测试阶段安全规范3610.1应用系统的安全性检测3610.2控制测试环境3810.3为测试使用真实的数据3910.4在软
9、件转移至生产环境前进行测试3910.5应用系统安全质量鉴定3911系统培训及文档阶段安全规范4011.1新系统的培训4011.2撰写新系统和系统改进的文档4012应用系统开发外包安全控制41附录 1参考文献42附录 2本规范用词说明431 概述信息系统的许多的安全控制或其他安全性保证是通过系统的开发设计予以实现的。因此如果在系统的开发设计阶段没有对系统的安全性给予充分的考虑,那么系统本身一定会存在许多先天不足,系统就会漏洞百出。为确保应用系统的安全,在应用系统开发之前就应确认系统的安全需求,并以此作为开发设计的阶段的基础。本规范主要规定了在系统开发的各个阶段所应遵守的各种安全规范,从需求分析开
10、始,到设计,再到开发和维护以及最后的文档等系统开发的各个阶段分别进行阐述,并将在不同阶段中所需要注意的安全问题和相关的安全规范进行进一步的描述和规定。2 目标本规范的目标为:保护应用系统开发过程的安全。具体地说就是保护应用系统开发过程免受未经授权的访问和更改,保护系统开发中系统软件和信息的安全,确保开发项目顺利正确的实施并对开发环境进行严格的控制。同时确保应用系统开发外包中的各项安全。3 适用范围本套规范适用的范围包括了整个应用系统开发过程中的安全。包括了系统开发可行性和需求分析阶段的安全,系统设计阶段的安全,系统开发阶段的安全,系统测试阶段的安全,系统培训和文档阶段的安全以及系统开发外包的安
11、全规范。主要规定了应用系统开发过程的安全保密,软件的质量的要求,系统和业务需求的符合性,保证敏感信息的安全,系统本身的稳定性和兼容性问题。4 规范引用的文件或标准下列文件中的条款通过本标准的引用而成为本标准的条款。凡是不注日期的引用文件,其最新版本适用于本标准。1. GB17859-1999 计算机信息系统安全保护等级划分准则2. GB/T 9387-1995 信息处理系统 开放系统互连基本参考模型(ISO7498 :1989)3. GA/T 391-2002 计算机信息系统安全等级保护管理要求4. ISO/IEC TR 13355 信息技术安全管理指南5. NIST信息安全系列美国国家标准技
12、术院6. 英国国家信息安全标准BS77997. 信息安全基础保护IT Baseline Protection Manual (Germany)8. BearingPoint Consulting 内部信息安全标准9. RU Secure安全技术标准10. 信息系统安全专家丛书Certificate Information Systems Security Professional5 术语和定义访问控制access control 一种安全保证手段,即信息系统的资源只能由被授权实体按授权方式进行访问,防止对资源的未授权使用。应用系统 application system认证 authentica
13、tion a. 验证用户、设备和其他实体的身份; b. 验证数据的完整性。授权authorization 给予权利,包括信息资源访问权的授予。可用性availability 数据或资源的特性,被授权实体按要求能及时访问和使用数据或资源。缓冲器溢出 buffer overflow指通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。保密性confidentiality 数据所具有的特性,即表示数据所达到的未提供或未泄露给未授权的个人、过程或其他实体的程度。隐藏通道 covert channel 可用来按照违反安全策略的方式传送!数
14、据的传输信道。完整性integrity在防止非授权用户修改或使用资源和防止授权用户不正确地修改或使用资源的情况下,信息系统中的数据与在原文档中的相同,并未遭受偶然或恶意的修改或破坏时所具的性质。敏感信息 sensitive information 由权威机构确定的必须受保护的信息,因为该信息的泄露、修改、破坏或丢失都会对人或事产生可预知的损害。系统测试 system testing用于确定系统的安全特征按设计要求实现的过程。这一过程包括现场功能测试、渗透测试和验证。后门代码 trapdoor 通常为测试或查找故障而设置的一种隐藏的软件或硬件机制,它能避开计算机安全。而且它能在非常规时间点或无需
15、常规检查的情况下进入程序。特洛伊木马Trojan horse 一种表面无害的程序,它包含恶性逻辑程序,导致未授权地收集、伪造或破坏数据,以此破坏计算机安全与完整性的进程。验证 verification 将某一活动、处理过程或产品与相应的要求或规范相比较。例:将某一规范与安全策略模型相比较,或者将目标代码与源代码相比较。压力测试 于确定系统的薄弱环节,确定系统在非正常条件下能够迅速恢复到正常的运行状态的能力。6 应用系统开发总体原则应用系统的开发应遵循一系列的总体原则,以确保开发过程中的安全。其中包括:a) 系统开发应从业务需求的角度出发,不得盲目追求系统的先进性而忽略了系统的实用性。系统的开发
16、是为了更好地满足业务上的需要,而不是技术上的需要。b) 开发的方法和管理必须规范化、合理化、制度化,从而确保开发的质量和进度。c) 应保证开发的进度并按时完成。确保开发工作及时、有效且高质量的完成。d) 系统开发必须具有一定的前瞻性,符合主流系统的发展方向。e) 提高和加强开发人员的安全意识。确保机密信息和关键技术不会泄漏,特别是不可泄漏到竞争对手的手中,否则将会对公司的竞争力产生极大的影响。f) 应充分利用现有的资源。7 系统需求收集和分析阶段7.1 可行性研究分析对于应用系统开发项目应进行一定的可行性分析,以保证只有在确认具备了相当的资源和条件,并且有能力满足业务上的需求的情况下才能开展开
17、发工作。切忌盲目开发,否则既浪费资源,又浪费时间。可行性研究宜从技术、需求面、投入和影响四个方面进行考虑:7.1.1 技术可行性分析根据业务上提出的需求,从技术开发的角度分析现有的技术手段和技术能力是否能够实现业务上所要求的系统功能。通常可从以下三个方面进行分析:a) 人员技术能力分析,指公司内的系统开发队伍或外包的第三方开发公司是否具有足够技术和管理能力来完成系统开发的任务。b) 计算机软件和硬件分析,指公司现有的软件和硬件的性能是否足够满足开发相应的系统的要求。c) 管理能力分析,指现有的技术开发管理制度和管理流程是否成熟且标准化,是否满足系统开发的要求。7.1.2 需求可行性分析系统的开
18、发来源于业务上的需求,因此需要对该需求进行可行性分析,以判断需求是否明确,是否符合实际,是否在一定的时间范围内可以实现。7.1.3 投资可行性分析根据业务需求和技术手段的分析,确认实现系统开发所需的投资,并确认投资的数额是否在可控制和可承受的范围内。7.1.4 影响可行性分析所谓的影响是指社会影响,比如系统开发是否符合法律法规上的要求,是否和相关的管理制度或行业标准相抵触,是否符合人文或道德上的约束等。7.2 开发人员安全管理7.2.1 系统开发人员职责分配在系统开发的过程中,应明确不同人员的身份和职责。在系统开发过程中具体可分以下三种角色: 项目负责人员:确保在整个系统开发的各个阶段都实施了
19、相关的安全措施,同时在整个系统开发的过程中负责整个项目的开发安全管理。 系统开发人员:根据业务需求确保开发的系统能够满足业务上的需求和相应的安全上的需求,同时满足系统质量上和进度上的要求。 系统审核人员:对整个开发的过程进行审核和监督,确保开发的质量和开发的安全。7.2.2 开发人员授权a) 应根据该员工在整个开发项目中所负责的开发内容授予其相应的权限和所应承担的责任。b) 开发人员必须负责其开发内容的保密性,不得私自将开发的相关信息泄漏出去,即使对家人或开发团队中的其他开发人员也不得泄漏。但开发人员有责任将开发的相关信息告诉项目的负责人员或开发小组的负责人员。c) 以书面的方式将员工的权限和
20、相应的责任提交给员工本人。必须严格规定在为企业工作期间,所有和工作相关的开发成果的所属权都归企业所有。d) 应根据员工权限和责任的大小确认是否需要签署相关的保密协议。e) 应在日常工作中记录员工与开发相关的日志信息。f) 员工一旦离职或调动岗位应立即收回或调整其相应的权限。7.2.3 开发人员必须训练开发安全代码的能力a) 在整个开发的过程中必须完整持续地进行代码错误处理所规定的流程。b) 错误问题报告应力求通俗易懂,不应在其中包含任何系统细节问题。c) 应对重要的敏感信息进行加密保护。d) 应使用一些相对复杂的加密和密钥生成机制。e) 应单独编写安全性设计说明概要7.2.4 分离系统开发和运
21、作维护管理层必须确保应用系统的开发和运作管理从组织人事和权限职责上分开。a) 信息技术人员可以现场修复或更改偶然或恶意的数据和软件问题。b) 测试代码中往往包含调试或者查错代码,大大增加了主机系统的性能负担。c) 开发人员不应具有很高的权限,否则将在系统运行中产生很大的风险。7.3 建立系统开发安全需求分析报告a) 安全需求计划应能够达到期望的安全水平。其中包括了成本的预估,完成各个安全相关流程所需的时间。b) 所有关于应用系统的更新或改进都必须基于业务需求,并有业务事件支持。这里的业务需求不仅仅包括了系统的功能、性能、开发费用、开发周期等内容,应明确系统的安全要求。应用系统的任何一次改进或更
22、新都应和该业务系统的所有者密切相关。c) 开发安全需求分析计划应由开发项目经理和公司内部的安全小组共同商议决定。d) 应确保每一个应用系统的用户都意识到系统的更新或改进都与其自身密切相关,所有的更新或改动建议都必须基于业务需求,而不是基于所谓的“信息技术的要求”。e) 系统的每一次更新或改进都必须认真对待,必须进行详细的需求定义、需求分析以及测试评估,以保证不会对业务造成任何不良影响。f) 业务需求是系统更新和改动的基础,因此必须清晰明确地定义业务的需求,禁止在业务需求未经业务部门领导和主要负责人员认可的情况下,盲目地进行开发工作。8 系统设计阶段的安全规范8.1 单点访问控制且无后门任何用户
23、如果希望访问应用系统中的某一部分,则必须通过统一且唯一的认证授权方式及流程。8.2 人员职责和权限的定义由于不是所有的人员对于某一个应用系统都具有同样的访问或使用权限,因此系统必须具有基于人员职责的用户授权管理,以确保每个用户可以访问到其权限范围内的应用系统部分。同时应确保每个用户无法访问其权限范围以外的应用系统部分。8.3 确保敏感系统的安全性将应用系统中敏感的信息保存在服务器端以进行集中的加密的安全管理,确保客户端系统本身并不能存储任何敏感的数据。8.4 确保访问层的安全性应用系统不仅仅要确保系统模块本身的安全性,同时还应考虑模块与模块之间通讯的安全性。这种模块与模块之间通讯的安全性不仅仅
24、包括了应用系统内部模块之间通讯的安全,也包括了应用系统内部模块和外部模块之间的通讯安全性,如主机和客户端之间通讯的安全性、服务器和服务器间通讯的安全性,以及本地系统和异地系统之间通讯的安全性。8.5 确保日志管理机制健全应建立可根据情况自由设置的日志管理机制,也就是说日志记录的范围和详细程度可以根据需求自行定制,且可以实现在应用系统的使用过程中进行日志的定制和记录。保留所有与系统开发相关的程序库的更新审核记录。8.6 新系统的容量规划容量规划是指确定系统的总体规模、性能和系统弹性。容量规划的具体内容可能有所不同,但一般应考虑以下方面:a) 系统的预期存储容量和在给定的周期中获取生成和存储的数据
25、量。b) 在线进程的数量和估计可能的占用资料c) 系统和网络的响应时间和性能,即端对端系统d) 系统弹性要求和设计使用率(峰值,槽值和平均值等)e) 安全措施如加密解密数据对系统的影响。f) 24x7运作要求和可接受的系统宕机次数(维护或者设备更新导致的必须性宕机)规划容量的时候关于系统使用的信息了解的越多越好。近来,由于互联网站的使用以指数形式增长,容量规划的变动效果不是非常显著,有时甚至毫无用处。原因在于很难估计实际的负载。在容量估计的时候应尽量将情况设想得复杂一些。9 系统开发阶段安全规范9.1 系统开发语言程序员可使用很多指导规范来防止应用程序中的普通安全问题。其中许多可以应用于任何一
26、种编程语言,但某些是针对特定的语言的。特定语言的指导规范主要集中在Perl,Java和C/C+语言。大多数情况下,一般的错误可以避免。而这些本可以避免的错误常常会导致很多安全漏洞,从而威胁信息的保密性、完整性和可用性。9.1.1 通用规范9.1.1.1 输入验证在客户机/服务器环境下,进行服务端的验证而不是客户端的验证(例如基于Javascript的验证)。通过在客户端和服务器之间放置一个代理服务器,可以很容易绕过客户端验证。有了代理服务器,攻击者可以在数据被客户端“验证”后修改数据(与“man-in-the-middle”攻击类似)。在实际的校验中,输入校验首先定义一个有效(可接受)的字符集
27、,然后检查每个数据的字符是否在有效范围内。如果输入中包含无效的字符,应用程序应返回错误页面并说明输入中包含无效字符。这样进行验证的原因是定义无效的字符集比较困难,并且一些不应有效的字符通常不会被指出。边界检查(例如字符串的最大长度)应在字符有效性检查以前进行。边界分析可以防止大多数缓冲区溢出漏洞。从环境变量获得的数据也需要进行验证。同时避免在环境变量中存放敏感数据(例如密码)。某些Unix系统(例如FreeBSD)包含ps命令,可以让用户看到任何当前进程的环境变量,这常常会暴露保密性信息。9.1.1.2 SQL语句如果应用程序需要连接后端数据库,不得在代码中使用SQL语句。使用程序以外的嵌入在
28、代码中的SQL语句调用特别危险,难以防止攻击者使用输入域或者配置文件(由应用程序载入)来执行嵌入式的SQL攻击。而输入验证有助于缓解这种风险。 9.1.1.3 注释代码(commented code)当应用程序在实际环境中开始应用时,应删除所有的注释代码。注释代码是用来调试或者测试的,它们不是最终应用程序的一部分。无论如何应在实际的环境中删除它们来避免意外的执行(一般注释标识被删除后就无法激活休眠的代码,但还是存在可能性的,所以应执行这项工作)。9.1.1.4 错误消息所有对用户显示的错误信息都不应暴露任何关于系统、网络或应用程序的敏感信息。如果可能的话,应使用包含编号的一般的错误信息,这种信
29、息只有开发者和/或支持小组才能理解。一般的错误信息的例子是“发生了错误(代码1234),请您与系统维护部门联系。”9.1.1.5 统一资源定位(URL)内容对于web应用,不要在URL上暴露任何重要信息,例如密码、服务器名称、IP地址或者文件系统路径(暴露了web服务器的目录结构)。这些信息可以在攻击时使用。例如下面就是一个不安全的URL:PASSWORD&file=/home/USER/expenses.txt9.1.1.6 设置PATH变量设置PATH为一个已知的值,而不仅仅是使用启动时的缺省值。攻击者可以在攻击应用程序时使用PATH变量,例如试图执行一个任意的程序。这些也可以应用于大多数
30、其他的语言。9.1.2 Perl语言多年以来,Perl已经成为用于系统管理和Web CGI开发的功能最强的编程语言之一(几乎可以使用Perl实现任何功能)。但其扩展应用,即作为Internet上CGI的开发工具,使得它经常成为web服务器上的攻击目标。另外,大多数CGI脚本有着比一般用户更高的权限,导致它更容易受攻击。下面列举了一些开发者(特别是CGI程序员)可以使用的主动的预防性的措施来增强Perl代码的整体安全性(请注意:这不是web服务器CGI脚本安全性的指导原则)。9.1.2.1 Taint验证Perl版本5.x包含一个叫做Taint Checking的数据验证措施。如果起用该功能,它
31、就不允许通过用户输入(任何程序外的输入)来操纵其他的外部程序(例如通过管道将数据导入另一个程序执行)。一般而言,程序员不能信任输入脚本和程序的数据(叫做Tainted数据),因为无法保证它不会产生危害(有意或者无意的)。Taint验证可以通过在命令行参数加入“-T”来开启。例如可以Perl脚本的第一行这样加入“-T”:#!usr/bin/perl5 -T Tainted数据包括命令行参数、环境变量和来自文件的数据。引用tainted数据的变量也成为tainted数据。如果脚本试图通过不安全的方式来使用tainted数据会产生一个致命错误(对这种情况称为“不安全的依赖”(Insecure dep
32、endency)或者其他的说法)。启用tainted验证在有些情况下会导致脚本停止运行,常常是由于Perl解释器要求所有脚本引用的外部程序的完全路径必须在PATH环境变量中列出,同时PATH中包含的每个目录除了目录的所有者及相应的所有者用户组外无法修改。Taint验证对于环境比较敏感,这就可能会导致大多数程序员不愿使用它,但是只要可能就应使用taint验证,特别是代码执行其他程序功能时(例如在CGI脚本的情况下)。9.1.2.2 安全模块如果不但输入数据不可信而且实际的代码也不可信会产生什么情况?例如用户从网站上下载了一个ActiveX控件,而它实际是一个特洛伊木马(Trojan horse)
33、。这种情况下taint验证就不起作用。安全模块让程序员可以在Perl脚本中将不同的代码模块与安全对象相联系。每个安全对象对于运行的每块代码建立了一个限制的环境。这与chroot在一个进程中只能在整体目录结构的一个子目录中运行类似。而saft对象限制perl代码只能在perl包结构的某些特定包中运行。如何使用安全模式超出了本文的范围,但程序员应在任何时候使用这一功能。9.1.2.3 警告参数(-w)使用-w参数可以在Perl解释脚本时显示所有的警告信息。警告可以对以下情况产生:只使用了一次的变量或者完全没有使用过的变量,未定义的文件句柄,未关闭的文件句柄,或将非数值变量传递到数据变量。该功能不是
34、针对安全处理的,但是有助于调试直接或者间接对安全有危害的错误。一般推荐总是使用-w参数。可在taint验证时在第一行这样使用-w参数:#!usr/bin/perl5 -Tw 9.1.3 Java语言自从1995年发布以来,Java成为简单或者复杂网络应用的有效编程语言。它在设计时充分考虑了安全问题,因此它具有的限制特征有:收集不再使用的内存碎片的垃圾收集器,严格的“sandbox”安全模型,以及在特定主机上限制应用程序的活动的安全管理器。以下为使用中的相关的规范:9.1.3.1 不应在标准输出上打印消息在实际的Internet系统中避免使用System.out.println()或者Syste
35、m.err.println()打印日志和错误消息,原因是当消息打印到标准输出时,无法立即确定消息发生的地点,且有可能将敏感信息透露给攻击者。9.1.3.2 封装Java中,如果没有使用访问标识符(access modifier(private、protected或public)来声明类、方法和属性,那么它的默认访问范围是包,并且同一包中的所有类都能访问它。必须记住虽然包有封装功能,但它只有在每部分加载到包的代码都由授权用户控制时才起作用。恶意的用户可以加入他们自己的类,从而对于包中的所有类、方法和属性都有完全的访问权限。Java的政策文件支持两种控制包访问权限的前缀。accessClassIn
36、Package defineClassInPackage 所有标准库中的类都默认是可以公共访问的(除了由“sun”开头的类)。为了保证一个包的安全性,必须修改$JAVA HOME/jre/lib/security文件夹中的java.security文件。该文件中的重要行是:package.access=sun.虽然该方法有作用,但仍存在问题。例如程序员在java.security文件中定义包的安全时必须十分小心。在package.access中的值是字符型的,“sun.”将保护“sun.tools”等包,但是不会对“sun”或者“sunshine”等包进行保护。另一个方法是使用JAR密封(se
37、aling) 。JAR(Java ARchive)文件是一些类的打包压缩格式的文件,与常用的ZIP格式类似。如果从一个密封(sealing)的JAR文件中加载一个类,随后同一个包的类只能从该JAR文件加载。为了起用密封(sealing),必须在建立JAR文件时这样设置密封(seal)参数:Sealed: true 使用密封(sealing)的JAR文件比权限 (permission) 设置更好,因为它不需要安装安全管理器(security manager)。9.1.3.3 政策文件Java内建的安全管理器是对应用程序进行限制的一个方便的工具。很多情况下需要编制一个定制的安全管理器,JDK1.2
38、及以后的版本提供了描述设置的方法而不是实施它们。这是通过Java政策文件实现的。可以用政策文件以相对模块化的方式控制文件系统和网络的访问。例如可以限制应用程序只能修改名字是foo的文件。宜使用Java政策文件和安全管理器而不是重新创建一个类或者系统来限制对主机和网络的访问。9.1.4 C/C+语言C本质上是不安全的编程语言。例如如果不谨慎使用的话,其大多数标准的字符串库函数有可能被用来进行缓冲区攻击或者格式字符串攻击。但是,由于其灵活性、快速和相对容易掌握,它是一个广泛使用的编程语言。下面是针对开发安全的C语言程序的一些规范。9.1.4.1 缓冲区溢出避免使用不执行边界检查的字符串函数,因为它
39、们可能被用来进行缓冲区溢出攻击。下面是应避免使用的函数。同时,也列出了每个函数相应的比较安全的替换方式。 不使用strcpy(),使用strncpy() 不使用strcat(),使用strncat() 不使用sprintf(),使用snprintf() 不使用gets(),使用fgets()在上面的前三个中函数中,每个替代函数的“n”表示了使用的缓冲区的大小。最后一个函数的“f”,表示格式,它允许用户指定期望的输入的格式。这些替换方程强制程序员定义使用的缓冲区的尺寸以及确定输入的类型。9.1.4.2 格式化字符串攻击(Format String Attack)该类攻击往往与缓冲区溢出相关,因为
40、它们往往主要利用了某些函数的假设,例如sprintf()和vsprintf()假设缓冲区的长度是无限的。然而即使使用snprintf()替换sprintf()也无法完全保护程序不受格式化字符串的攻击。这些攻击通过直接将格式说明符(format specifiers)(%d,%s,%n等)传递到输出函数接收缓冲区来进行。例如,以下的代码就是不安全的:snprintf(buffer, sizeof(buffer), string) 这种情况下,可以在字符串中插入格式说明符来操纵内存的栈,来写入攻击者的数据(这些数据中包含小的程序代码,并可由处理器接着执行)。 更多关于这些攻击的具体内容请见资源章节
41、。对以上的例子建议使用下面的代码。snprintf(buffer, sizeof(buffer), “%s”, string) 进行格式字符串攻击不太容易。首先攻击者必须能获得内存栈的内容情况(从应用导出或者使用调试器),然后必须知道如何精确访问特定的内存空间来操纵栈中的变量。9.1.4.3 执行外部程序推荐使用exec()函数而不是system()函数来执行外部程序。这是因为system()接收整个命令行的随机的缓冲区来执行程序。snprintf(buffer, sizeof(buffer), emacs %s, filename); system(buffer);在以上的例子中,可以通过使
42、用分号利用文件名变量在sehll中插入额外的命令(例如文件名可以是/etc/hosts; rm *,这将在显示/etc/hosts目录文件的同时,删除目录中的所有文件)。而exec()函数只保证第一个参数被执行:execl(usr/bin/emacs, usr/bin/emacs, filename, NULL);上面的例子保证文件名仅仅作为一个参数输入Emacs工具,同样它在Emacs命令中使用完全的路径而不是使用可以被攻击者利用的PATH环境变量。9.1.4.4 竞争条件(race condition)进程需要访问资源时(无论是磁盘、内存或是文件)通常需要执行两个步骤:(1)首先测试资源是
43、否空闲可用(2)如果可用,就访问该资源,否则它等到资源不再使用为止再去访问它当另一个进程在步骤1和2之间想要访问同一个资源时将出现问题,导致不可预测的结果。进程可能会被锁定,或者一个进程籍此获得了另一个进程的较大的权限而导致安全问题。攻击主要集中在有较大权限的程序上(称为setuid程序)。竞争条件攻击通常利用程序执行时可以访问到的资源。另外权限低的程序也存在安全风险,因为攻击者可能会等待有较高权限的用户执行那个程序(例如root),然后进行攻击。下面的建议有助于缓解竞争条件(race condition)攻击:在进行文件操作时,利用那些使用文件描述符的函数而不使用那些使用文件路径的函数(例如
44、使用fdopen()而不要使用fopen())。文件描述符使得恶意的用户在文件打开时或是在原始的进程对文件进行操作前,无法使用文件连接(符号式的或是物理的)来改变文件。在写文件甚至在读文件时宜使用fcntl()和flock()函数来对文件加锁,这样它们就不能被其他进程访问。它几乎可以建立原子级的操作。应谨慎操纵临时文件,因为它往往会导致竞争条件攻击。9.1.4.5 检验有效的返回值 检验有效的返回值非常重要。一个例子是旧的/bin/login的实现中不检验错误的返回值,导致当它找不到/etc/passwd文件时返回root的访问权限。如果该文件损坏了则这种情况是合理的;但如果该文件存在只是无法
45、访问,那么这就是一个大问题。9.2 系统开发安全相关工具管理有许多方法来确保代码符合一定的安全级别。正如前面指出的,最好的方法之一是让尽可能多的人来检查代码(而不是在QA环境中实际进行白箱或者黑箱测试)。然而,有时代码在开始实际环境的应用前往往没有足够的时间,并且即使检查代码也会漏掉一些不易发现的错误。这些错误可能会对整个系统导致重大的安全问题。因此(以及其他的原因),使用源码分析工具(Source Code Analysis Tool(SCAT)来自动进行某些检查过程很有帮助。本文介绍了一些这方面的工具。每个工具都用同样的测试工具来检验,这些测试工具包含C和Java的代码段,而这些代码段存在
46、潜在的安全错误。我们比较了每个工具的测试结果,并且仔细检查了以下的属性:a) 灵活性 有多种选项并能扫描多种类型的代码的工具得分会较高。b) 正确性 主要目标是发现正确的安全问题,并且不会出现大量的误报信息,或者更糟的是没有发现真正的错误信息。c) 容易使用 大多数情况下,程序员只需将工具指定到特定的代码上然后选择“扫描”。除非特别需要,程序员一般只做抽样检查,而无需开发复杂的测试机制。d) 报表 扫描结果应以一种容易理解的格式来显示,并且最好同时提示修改每个问题的方法,并附加理由。每个工具在解析代码上的速度可以忽略不计,所以没有进行比较(虽然这并不包括配置扫描的时间,而MOPS在这方面相对于其它工具需要更多的时间)。另外,这些工具都可以免费获得,甚至可以获得它们的源代码,所以不需考虑它们的成本。9.2.1 工具一:PScan Pscan是一个有针对性的扫描程序,主要用于发现C程序中的缓冲区溢出和格式化字符串攻击。该程序检查所有用到标准C程序库中的printf()函数。sprintf(buffer, variable); printf(buffer, variable); 关于这些语句在缓冲区溢出和格式化字符串攻击中怎样被利用可