2012 年 8 月
中文版 Version 1.0 2
目录
序言 ................................................................................................................................ 3
软件安全与风险原则概览 ........................................................................................... 4
输入验证: ................................................................................................................ 5
输出编码: ................................................................................................................ 5
身份验证和密码管理: ............................................................................................ 6
会话管理: ................................................................................................................ 7
访问控制: ................................................................................................................ 7
加密规范: ................................................................................................................ 8
错误处理和日志: .................................................................................................... 8
数据保护: ................................................................................................................ 9
通讯安全: .............................................................................................................. 10
系统配置: .............................................................................................................. 10
数据库安全: .......................................................................................................... 10
文件管理: .............................................................................................................. 11
内存管理: .............................................................................................................. 11
通用编码规范: ...................................................................................................... 12
附录 A: ......................................................................................................................... 13
外部的参考资料: .................................................................................................. 13
附录 B: 术语表 ............................................................................................................ 14
2012 年 8 月
中文版 Version 1.0 3
序言
本项与技术无关的文档以清单列表的形式,定义了一套可以集成到软件开发生命周期中的通
用软件安全编码规范。采用这些规范将减少最为常见的软件漏洞。
一般来说,开发安全的软件要比在软件包完成以后再纠正安全问题的成本低很多,且还没涉
及到因为安全问题而造成的损失。
保护关键软件资源的安全性,比以往任何时候都更为重要,因为攻击者的重点已逐步转向了
应用层。2009 年 SANS 的一项研究
1
表明,针对 Web 应用程序的攻击已占据了在互联网上
观察到攻击总数的 60%以上。
在使用本指南时,开发团队应该从评估他们的安全软件开发生命周期成熟度和开发人员知识
水平着手。由于本指南不涉及如何实现每个编码规范的具体细节,因此,开发人员需要了解
相关知识,或者有足够可用资源来提供必要的指导。通过本指南,开发人员可在无需深入了
解安全漏洞和攻击的情况下,将编码规范转换成编码要求。当然,开发团队的其他成员应该
有责任,通过提供适当的培训、工具和资源,以验证整个系统的设计和开发是安全的。
本文档中使用的重要术语,包括部分标题和文字,都以
斜体字
标注,并列举在附录 B 的术语列表
中。
关于安全软件开发框架的指南不属于本文讨论的范围。但是,我们推荐以下额外的常用规范和资
源:
明确定义角色和职责。
为开发团队提供足够的软件安全培训。
采用一个安全软件开发生命周期。
o OWASP CLASP 项目
建立安全编码标准。
o OWASP 开发指南项目
建立一个可重用的对象库文件。
o OWASP Enterprise Security API (ESAPI) 项目
验证安全控制的有效性。
o OWASP Application Security Verification Standard (ASVS) 项目
建立外包开发安全规范,包括在建议书(RFP)和合同中定义安全需求和验证方法。
o OWASP Legal 项目
2012 年 8 月
中文版 Version 1.0 4
软件安全与风险原则概览
开发安全的软件需要对安全原则有基本的了解。虽然对于安全原则的全面评估超出了本指南的范
围,但是我们还是提供了一个快速的概览。
软件安全的目标是要维护信息资源的
保密性
,
完整性
,和
可用性
,以确保业务的成功运作。该目标
通过实施
安全控制
来实现。本指南重点介绍具体的技术控制,以
缓解
常见软件
漏洞
的发生。虽然主
要的关注点是 Web 应用程序及其配套的基础设施,但是本指南的大部分内容可应用于任意软件部署
平台。
为了保护业务免受来自与软件相关的不能接受的风险,了解风险的意义是很有帮助的。风险是一组
威胁业务成功因素的集合。它可以被定义为:一个
威胁代理
与一个可能含有
漏洞
的
系统
交互,该漏
洞可被
利用
并造成
影响
。虽然这可能看起来象是一个抽象的概念,但可以这样想象它:一个汽车盗
窃犯(威胁代理)来到一个停车场(系统)寻找没有锁车门(漏洞)的车,当找到一个时,他们打
开门(利用)并拿走里面任何的东西(影响)。所有这些因素在安全软件开发时都扮演了一个角
色。
开发团队采用的方法和攻击者攻击应用程序所采用的方法之间有一个根本区别。开发团队通常采用
的方法是基于应用程序的目的行为。换句话说,开发团队根据功能需求文档和用例设计一个应用程
序以执行特定的任务。而另一方面,攻击者,基于“没有具体说明应拒绝的行为,则被认为是可行
的”原则,对于应用程序可以做什么更感兴趣。为了解决这个问题,一些额外的元素需要被集成到软
件生命周期的早期阶段。这些新元素是
安全需求
和
滥用实例
。本指南旨在帮助明确高等级的安全需
求,并解决许多常见的滥用情况。
Web 开发团队应当明白,基于客户端的输入验证、隐藏字段和界面控件(例如,下拉键和单选按
钮)的客户端控制,所带来的安全性收益是有限的,这一点非常重要。攻击者可以使用工具,比
如:客户端的 Web 代理(例如,OWASP WebScarab,Burp)或网络数据包捕获工具(例如,
Wireshark),进行应用程序流量分析,提交定制的请求,并绕过所有的接口。另外,Flash,Java
Applet 和其它客户端对象可以被反编译并进行漏洞分析。
软件的安全漏洞可以在软件开发生命周期的任何阶段被引入,包括:
最初没有明确的安全需求;
创建有逻辑错误的概念设计;
使用糟糕的编码规范,从而带来了技术漏洞;
软件部署不当;
在维护或者更新过程中引入缺陷。
此外,还有重要的一点需要明白,软件漏洞可以超出软件本身的范围。根据不同的软件、漏洞和配
套基础设施的性质,一次成功的攻击会影响下面任何或者所有的方面:
软件和其相关的信息;
相关服务器的操作系统;
后端数据库;
在共享环境中的其它应用程序;
用户的系统;
与用户交互的其它软件。
2012 年 8 月
中文版 Version 1.0 5
安全编码规范检查列表
输入验证:
在可信系统(比如:服务器)上执行所有的数据验证。
识别所有的数据源,并将其分为可信的和不可信的。验证所有来自不可信数据源(比如:数
据库,文件流,等)的数据。
应当为应用程序应提供一个集中的输入验证规则。
为所有输入明确恰当的字符集,比如:UTF-8。
在输入验证前,将数据按照常用字符进行编码(
规范化
)。
丢弃任何没有通过输入验证的数据。
确定系统是否支持 UTF-8 扩展字符集,如果支持,在 UTF-8 解码完成以后进行输入验证。
在处理以前,验证所有来自客户端的数据,包括:所有参数、URL、HTTP 头信息(比如:
cookie 名字和数据值)。确定包括了来自 JavaScript、Flash 或其他嵌入代码的 post back 信息。
验证在请求和响应的报头信息中只含有 ASCII 字符。
核实来自重定向输入的数据(一个攻击者可能向重定向的目标直接提交恶意代码,从而避开
应用程序逻辑以及在重定向前执行的任何验证)。
验证正确的数据类型。
验证数据范围。
验证数据长度。
尽可能采用“白名单”形式,验证所有的输入。
如果任何潜在的
危险字符
必须被作为输入,请确保您执行了额外的控制,比如:输出编码、
特定的安全 API、以及在应用程序中使用的原因。部分常见的危险字符包括:
< > " ' % ( ) & + \ \' \" 。
如果您使用的标准验证规则无法验证下面的输入,那么它们需要被单独验证:
o 验证空字节 (%00);
o 验证换行符 (%0d, %0a, \r, \n);
o 验证路径替代字符“点-点-斜杠”(../或 ..\)。如果支持 UTF-8 扩展字符集编码,验证替
代字符: %c0%ae%c0%ae/ (使用
规范化
验证双编码或其他类型的编码攻击)。
输出编码:
在可信系统(比如:服务器)上执行所有的编码。
为每一种输出编码方法采用一个标准的、已通过测试的规则。
通过语义输出编码方式,对所有返回到客户端的来自于应用程序信任边界之外的数据进行编
码。HTML 实体编码是一个例子,但不是在所有的情况下都可用。
除非对目标编译器是安全的,否则请对所有字符进行编码。
针对 SQL、XML 和 LDAP 查询,语义净化所有不可信数据的输出。
对于操作系统命令,净化所有不可信数据输出。
- 1
- 2
前往页