这是根据OWASP ASVS翻译过来的,可作为WEB应用开发的验收标准(未包含具体细节),值得注意的是,验收标准并非越严格越好,应根据企业自身的业务需求判定。
WEB应用安全验证标准
安全验证等级的定义
文档定义了4个级别的安全验证等级,验证的内容和范围会随着验证等级的增加而增加,如果某WEB应用的安全等级为N( N=0,1,2,3),表示该WEB应用完全通过了等级N(N=0,1,2,3)的安全验证。
注意:必须要完全通过该等级的所有验证,部分通过的不算。
等级0 |
该等级的验证需求由企业自定义,不做强制要求,也可以没有,比如执行安全自动化扫描或者企业内部的安全基线检查等。 |
等级1 |
等级1的安全验证需求在文档中定义,通过该等级的验证可以发现web应用中大部分很容易发现的漏洞,适用于做目标进行快速安全检查的场景。 |
等级2 |
等级2的安全验证需求在文档中定义,通过该等级的验证可以发现web应用中大多数流行的漏洞,属于信息安全行业定义的标准等级,因此,大多数应用系统应达到该标准。 |
等级3 |
等级3的安全验证需求在文档中定义,通过该等级的验证可以发现web应用中难以发现或利用的漏洞,适用于对安全有高要求的场景。 |
1、认证
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
v1.1 |
验证除了认定可以公开的资源,其它资源需要登录认证后才能访问。 |
V |
V |
V |
v1.2 |
验证应用的口令输入框不会回显用户输入的口令,并且口令输入框AUTOCOMPLETE的标签属性设置为”off”。 |
V |
V |
V |
v1.3 |
验证应用的认证机制能够fail securely(安全地处理失效的情况)。 |
V |
V |
V |
v1.4 |
验证应用的敏感信息不会通过明文或弱加密通道进行传输。 |
V |
V |
V |
v1.5 |
验证应用“忘记密码”以及其它取回密码的模块不会将用户当前忘记的密码返回给用户,也不会直接给用户分配一个新的密码。 |
V |
V |
V |
v1.6 |
验证不能通过应用上的登录和密码重置等功能对用户账户进行枚举。 |
V |
V |
V |
v1.7 |
验证应用本身和使用的第三方组件不存在默认口令。 |
V |
V |
V |
v1.8 |
验证应用拥有防暴力破解的手段(参考安全开发指南之暴力破解)。 |
V |
V |
|
v1.9 |
验证应用的认证都是在服务器端执行的。 |
V |
V |
|
v1.10 |
验证应用存在有效的口令复杂度策略(参考安全开发指南之口令策略)。 |
V |
V |
|
v1.11 |
验证应用系统对修改密码等模块(即能够取回对账户的访问权限的模块)实施了和登录认证同等强度的安全策略。 |
V |
V |
|
v1.12 |
验证应用系统对修改用户凭证的机制实施和登录认证同等强度的安全策略。 |
V |
V |
|
v1.13 |
验证应用系统可对认证凭证(口令)的有效期进行配置。 |
V |
V |
|
v1.14 |
验证应用系统的日志对所有认证事件进行记录(比如账户锁定等)。 |
V |
V |
|
v1.15 |
验证应用系统会为每一个账户口令添加独立的salt值(比如userid),并进行hash后再存储。 |
V |
V |
|
v1.16 |
验证应用系统用于访问外部接口或服务的凭证是经过足够安全的可逆算法(比如AES256)进行加密后再存储在安全区域的(不允许存放在源码中)。 |
V |
V |
|
v1.17 |
验证“忘记密码”或者其它可以取回密码的模块不会直接将新密码发送给用户,而是使用有时间限制的随机token或者双因素手段(比如短信验证码) |
V |
V |
|
v1.18 |
验证当用户通过“忘记密码”的验证后,在用户没有修改新的密码之前,应用系统会对账户进行禁用或锁定。 |
V |
V |
|
v1.19 |
验证当应用系统使用回答问题的方式进行密码重置时,答案是难以猜测的。 |
V |
V |
|
v1.20 |
验证应用系统支持记录历史密码和设置使用相同密码的周期。 |
V |
V |
|
v1.21 |
Verify all authentication controls (including libraries that call external authentication services) have a centralized implementation. |
V |
||
v1.22 |
验证用户在执行和应用强相关的敏感操作时,需要进行二次身份认证(可以是双因素的,比如短信验证码,数字证书等)。 |
V |
2、会话
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
V2.1 |
验证应用系统使用的是框架自带的会话管理机制。 |
V |
V |
V |
V2.2 |
验证当用户注销时,服务器会销毁session。 |
V |
V |
V |
V2.3 |
验证当经过一段时间的闲置未操作时,应用系统会自动注销会话。 |
V |
V |
V |
V2.4 |
验证在所有需要认证才能访问的页面上都存在注销功能。 |
V |
V |
V |
V2.5 |
验证session id只存在于cookie字段中,而不会泄漏在URL、错误信息以及日志中。 |
V |
V |
V |
V2.6 |
验证用户注销时session id会被清除或改变。 |
V |
V |
V |
V2.7 |
验证应用系统使用“httponly”属性保护cookie不被JS脚本读取。 |
V |
V |
V |
V2.8 |
验证应用系统使用“secure”属性保护cookie只在加密通道中传输。 |
V |
V |
V |
V2.9 |
验证应用系统会在用户登录后改变session id来防止会话定置攻击。 |
V |
V |
|
V2.10 |
验证应用系统会在用户进行二次身份认证后改变session id。 |
V |
V |
|
V2.11 |
验证应用系统只使用框架产生的session id。 |
V |
V |
|
V2.12 |
验证应用系统使用的session id具有足够的长度、复杂度和随机性。 |
V |
V |
|
V2.13 |
Verify that authenticated session tokens using cookies have their path set to an appropriately restrictive value for that site. The domain cookie attribute restriction should not be set unless for a business requirement, such as single sign on. |
V |
V |
|
V2.14 |
验证应用系统不允许在不同的机器上同时并发相同的session。 |
V |
V |
|
V2.15 |
验证可通过管理接口配置session最长有效期,当session超过有效期时会被强制注销。 |
V |
3、授权
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
V3.1 |
验证用户拥有指定的合法权限去访问他们能够访问的功能和服务。 |
V |
V |
V |
V3.2 |
验证用户拥有指定的合法权限去访问他们能够访问的URL。 |
V |
V |
V |
V3.3 |
验证用户拥有指定的合法权限去访问他们能够访问的数据文件。 |
V |
V |
V |
V3.4 |
验证应用系统不存在“直接对象引用”漏洞,每个用户只允许访问授权给他们访问的对象。(横向越权) |
V |
V |
V |
V3.5 |
验证应用系统的“目录列表”功能已被关闭(除非有特殊需求)。 |
V |
V |
V |
V3.6 |
验证用户拥有指定的合法权限去访问受保护的数据。 |
V |
V |
V |
V3.7 |
验证应用系统的访问控制机制能够fail securely。 |
V |
V |
V |
V3.8 |
Verify that the same access control rules implied by the presentation layer are enforced on the server side for that user role, such that controls and parameters cannot be re-enabled or re-added from higher privilege users. |
V |
V |
|
V3.9 |
验证用户无法篡改用于权限控制的用户属性、数据属性以及策略信息等参数(除非有特殊需求)。 |
V |
V |
|
V3.10 |
验证所有的访问控制都是在服务器端执行的。 |
V |
V |
|
V3.11 |
验证应用系统能够记录所有经过访问控制判断的行为,并且默认对所有无法通过访问控制判断的行为进行记录。 |
V |
V |
|
V3.12 |
验证应用系统能够有效防御CSRF攻击。 |
V |
V |
|
V3.13 |
验证应用系统能够防御单一用户持续访问系统合法资源,避免系统资源被单一用户耗尽。比如,对每小时在能够应用系统进行注册用户数量进行限制。 |
V |
V |
|
V3.14 |
Verify that there is a centralized mechanism (including libraries that call external authorization services) for protecting access to each type of protected resource. |
V |
4、数据校验
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
V4.1 |
验证应用系统存在相关安全控制手段来避免遭受缓冲区溢出攻击。 |
V |
V |
V |
V4.2 |
验证应用系统存在相关安全控制手段来避免遭受SQL注入攻击。 |
V |
V |
V |
V4.3 |
验证应用系统存在相关安全控制手段来避免遭受XSS攻击。 |
V |
V |
V |
V4.4 |
验证应用系统存在相关安全控制手段来避免遭受LDAP注入攻击。 |
V |
V |
V |
V4.5 |
验证应用系统存在相关安全控制手段来避免遭受OS命令注入攻击。 |
V |
V |
V |
V4.6 |
验证应用系统在验证输入数据失败时会默认选择拒绝处理或者对数据进行净化后再使用。 |
V |
V |
V |
V4.7 |
验证应用系统对所有输入数据的验证和编码都是在服务端执行的。 |
V |
V |
V |
V4.8 |
验证应用系统会依据上下文环境对来自非信任域的数据进行转义后再输出到html页面(包括html元素、属性和JS数据等)。 |
V |
V |
|
V4.9 |
验证所有的输入数据都使用指定的字符集,比如UTF-8。 |
V |
V |
|
V4.10 |
Verify that all input data is canonicalized for all downstream decoders or interpreters prior to validation. |
V |
V |
|
V4.11 |
If the application framework allows automatic mass parameter assignment (also called automatic variable binding) from the inbound request to a model, verify that security sensitive fields such as “accountBalance”, “role” or “password” are protected from malicious automatic binding. |
V |
V |
|
V4.12 |
验证应用系统防御HTTP参数污染攻击。 |
V |
V |
|
V4.13 |
Verify that a single input validation control is used by the application for each type of data that is accepted. |
V |
||
V4.14 |
验证应用系统在数据验证失败时会产生日志记录。 |
|||
V4.15 |
Verify that for each type of output encoding/escaping performed by the application, there is a single security control for that type of output for the intended destination. |
V |
5、加密解密
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
V5.1 |
验证用于保护用户敏感数据的加密功能模块均在服务器端实现。 |
V |
V |
|
V5.2 |
验证所有的加密模块都能够fail securely。 |
V |
V |
|
V5.3 |
验证应用系统能够阻止任何对密钥的未授权访问。 |
V |
V |
|
V5.4 |
验证应用系统使用业界认可的随机数发生器来产生随机数、随机文件名、随机GUID和随机字符串。 |
V |
V |
|
V5.5 |
验证应用系统使用的加密模块符合FIPS 140-2标准。 |
V |
||
V5.6 |
验证应用系统根据加密模块的安全建议来使用安全的加密模式。 |
V |
||
V5.7 |
验证应用系统有明确的密钥管理策略(产生、分发、注销和过期等),并且能够正确执行。 |
V |
6、错误处理和日志审计
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
V6.1 |
验证应用系统不会返回对攻击者有用的错误敏感信息,比如session id或者个人信息。 |
V |
V |
V |
V6.2 |
验证所有的错误处理流程都是在受信任的设备上执行的。 |
V |
V |
|
V6.3 |
验证应用系统的日志审计控制是在服务端执行的。 |
V |
V |
|
V6.4 |
验证应用系统在错误处理逻辑中采用“默认拒绝”的原则。 |
V |
V |
|
V6.5 |
验证安全事件发生后,不管结果是成功或是失败,日志系统均能够记录。 |
V |
V |
|
V6.6 |
验证每个事件产生的日志包含以下内容: 1、事件发生的时间。 2、事件的严重级别。 3、能够识别该事件为安全事件的标识。 4、产生该事件的用户信息。 5、产生该事件的源IP。 6、事件执行的结果(成功或失败)。 7、事件的描述。 |
V |
V |
|
V6.7 |
验证日志不会被无授权的访问和修改。 |
V |
V |
|
V6.8 |
验证日志中不存在和应用相关的敏感信息。 |
V |
V |
|
V6.9 |
验证应用系统存在日志分析工具以供分析者对日志进行安全分析。 |
V |
V |
|
V6.10 |
验证通过日志软件查看日志中的非信任数据时,该数据不会被当作代码来执行。 |
V |
||
V6.11 |
Verify that there is a single logging implementation that is used by the application. |
V |
7、数据保护
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
V7.1 |
验证所有包含敏感信息的form页面不会缓存在客户端,同时form的自动完成属性设置为off。 |
V |
V |
V |
V7.2 |
验证应用系统是通过http的消息体而不是URL参数来传输敏感信息的。 |
V |
V |
V |
V7.3 |
验证缓存在客户端的敏感数据不会被无授权地访问,当授权用户结束访问时应使其失效(可以使用no-cache、no-store或cache-control来控制)。 |
V |
V |
|
V7.4 |
验证缓存在服务端的敏感数据不会被无授权地访问,当授权用户结束访问时应使其失效。 |
V |
V |
|
V7.5 |
验证应用系统所需要处理的敏感数据都已经被识别出来,并且存在明确的策略来指导如何对这些敏感数据进行访问,以及何时需要对数据进行加密(包括敏感数据在本地的存储或进行远程传输时)。 |
V |
||
V7.6 |
验证当某种类型的敏感数据使用完毕时,存在可以将该类型敏感数据从系统中移除的方法。 |
V |
||
V7.7 |
验证应用系统总是尽可能少的将参数发送到非信任系统,比如hidden field、AJAX变量和cookie等。 |
V |
||
V7.8 |
验证当用户对信息请求和对敏感数据操作的次数发生异常时,应用系统能够检测并报警,比如每个用户每小时对记录的平均访问量不应超过5,或者日平均访问了不应超过30等。 |
V |
8、通信安全
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
V8.1 |
Verify that a path can be built from a trusted CA to each Transport Layer Security (TLS) server certificate, and that each server certificate is valid. |
V |
V |
V |
V8.2 |
验证应用系统使用TLS进行认证以及传输敏感数据(无论是和外部系统的连接还是应用系统内部服务器之间的连接)。 |
V |
V |
|
V8.3 |
验证应用系统内部服务器产生TLS连接失败事件时会被记录到日志。 |
V |
V |
|
V8.4 |
验证应用系统必须要经过认证才可以连接到外部系统进行敏感数据传输或对接口进行调用。 |
V |
V |
|
V8.5 |
验证应用系统只使用最小权限账户连接到外部系统进行敏感数据传输或对接口进行调用。 |
V |
V |
|
V8.6 |
验证当客户端以TLS方式连接应用系统失败时不会回退到使用不安全的方式进行连接。 |
V |
||
V8.7 |
Verify that certificate paths are built and verified for all client certificates using configured trust anchors and revocation information. |
V |
||
V8.8 |
Verify that there is a single standard TLS implementation that is used by the application that is configured to operate in an approved mode of operation |
V |
||
V8.9 |
验证所有的连接都使用指定的字符集编码方式(比如UTF-8)。 |
V |
9、HTTP安全
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
V9.1 |
验证应用系统只接受预定义的HTTP方法,比如GET和POST,非业务需要的HTTP方法应予以禁止。 |
V |
V |
V |
V9.2 |
验证每一个HTTP响应头内都包含content type字段,该字段用于指定一个安全的字符集(比如UTF-8)。 |
V |
V |
V |
V9.3 |
验证应用系统使用HTTP header或者其它策略来防止老版浏览器遭受点击劫持攻击。 |
V |
V |
V |
V9.4 |
验证HTTP请求头和响应头中只包含可被打印的ASCII字符。 |
V |
V |
10、 业务逻辑
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
V10.1 |
验证应用系统只在受信的环境(比如受保护和监控的服务器)中处理和验证所有关键业务逻辑。 |
V |
V |
|
V10.2 |
验证应用系统在进行敏感操作时不会遭受恶意欺诈攻击,比如用户A通过篡改和重放session、交易状态或者user id来达到攻击用户B的目的。 |
V |
V |
|
V10.3 |
验证应用系统不允许关键业务逻辑的参数被篡改,比如价格、利率、折扣、余额等。 |
V |
V |
|
V10.4 |
验证应用系统实施了防止用户“否认操作”的措施,比如受保护的交易日志,审计跟踪和系统日志等,对于高价交易系统,还应实时监控用户动态和异常的交易。 |
V |
V |
|
V10.5 |
验证应用系统能够阻止信息泄漏类型的攻击,比如直接对象引用攻击、session蛮力破解攻击等。 |
V |
V |
|
V10.6 |
验证应用系统能够有效地检测、控制暴力破解和拒绝服务攻击(比如通过某个功能模块连续不断的发送请求)。 |
V |
V |
|
V10.7 |
验证应用系统能够阻止访问控制类型的攻击,比如匿名用户访问受保护的数据和功能接口,用户相互之间访问各自的数据和使用特权接口等。 |
V |
V |
|
V10.8 |
验证应用系统在多阶段业务逻辑中能够严格按照特定的顺序步骤进行处理,每一个步骤都应当符合人在实际环境中的操作状况。比如拒绝处理非正常顺序的请求、跳过中间步骤的请求以及在某个步骤中切换用户和提交速度过快的情况。 |
V |
V |
|
V10.9 |
Verify the application has additional authorization (such as step up or adaptive authentication) for lower value systems, and / or segregation of duties for high value applications to enforce anti-fraud controls as per the risk of application and past fraud.。 |
V |
V |
|
V10.10 |
验证应用系统在受信环境中(比如受保护的服务器)执行以个人或天为单位的业务限制,并且可配置对自动化和非正常的攻击进行自动化响应和报警,比如:每个用户每天消费的电话费用不会超过10块钱;论坛每天允许新注册的用户不超过100个,或者只有账户通过验证后才可以发帖和上传个人信息;医疗系统不应允许单个医生每天访问病人记录数超过合理范围等等。总之,在任何情况下,业务总量限制应设置在合理业务范围之内。 |
V |
V |
11、 文件和资源
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
v11.1 |
验证应用系统在进行URL重定向时,URL中不包含未经验证的数据。 |
V |
V |
|
v11.2 |
验证应用系统会规范化来自非信任源的文件和路径名,以防止路径遍历攻击。 |
V |
V |
|
v11.3 |
验证应用系统会对来自非信任源的文件进行病毒扫描,避免被上传带恶意代码的文件。 |
V |
V |
|
v11.4 |
验证应用系统接收来自非信任源的参数时,在未经过规范化和输入数据验证的情况下,不会拿来操纵文件和路径名以及其它操作系统对象(避免本地包含攻击)。 |
V |
V |
|
v11.5 |
验证应用系统接收来自非信任源的参数时会对其进行规范化、输入校验和输出编码操作,防止远程文件包含攻击。 |
V |
V |
|
v11.6 |
验证html5的CORS(跨域资源共享)和iframe设置是否安全。 |
V |
V |
|
v11.7 |
验证所有来自非信任源的文件都被存放在web根目录之外。 |
V |
V |
|
v11.8 |
验证web或应用服务器被配置为默认拒绝访问远程资源。 |
V |
V |
|
v11.9 |
验证应用系统不会执行来自非信任域的上传文件中的代码。 |
V |
V |
|
v11.10 |
验证flash和Silverlight的跨域资源共享属性配置可防止无认证和非授权的远程访问。 |
V |
V |
12、 移动应用
Item |
验证内容 |
等级 |
||
1 |
2 |
3 |
||
V12.1 |
验证移动客户端会验证SSL证书的有效性。 |
V |
V |
V |
V12.2 |
验证UDID不会被用来做安全控制。 |
V |
V |
V |
V12.3 |
验证移动APP不会将敏感数据存储在共享的存储设备中(比如SD card或者共享文件夹)。 |
V |
V |
V |
v12.4 |
验证敏感数据不会被存储在移动端的SQLite数据库上。 |
V |
V |
V |
v12.5 |
验证密钥和口令不会被硬编码在可执行文件中。 |
V |
V |
|
v12.6 |
验证移动APP不会通过IOS的快照特性泄漏敏感数据。 |
V |
V |
|
v12.7 |
验证APP无法在被越狱或root过的设备上运行。 |
V |
V |
|
v12.8 |
验证session超时时间设置是合理的。 |
V |
V |
|
v12.9 |
Verify the permissions being requested as well as the resources that it is authorized to access (i.e. AndroidManifest.xml, iOS Entitlements) . |
V |
V |
|
v12.10 |
验证敏感信息不会被记录到crash log中。 |
V |
V |
|
v12.11 |
验证应用程序的二进制文件经过了混淆处理。 |
V |
V |
|
v12.12 |
验证所有测试用的数据都已经从APP容器中移除了(比如.ipa、.apk和.bar)。 |
V |
V |
|
v12.13 |
验证移动APP不会将敏感数据记录到系统日志或文件系统中。 |
V |
V |
|
v12.14 |
验证应用程序未开启敏感数据输入区域(比如口令、个人信息和信用卡信息等)的自动完成属性。 |
V |
V |
|
v12.15 |
Verify that the mobile app implements certificate pinning to prevent the proxying of app traffic. |
V |
||
v12.16 |
验证在配置文件中不存在错误配置项(比如debugging标识位和全局读/写权限等)。 |
V |
||
v12.17 |
验证使用的第三方组件库是最新版本的,不存在任何已知的漏洞。 |
V |
||
v12.18 |
验证web数据(比如 https流量)不会被缓存。 |
V |
||
v12.19 |
验证查询字符串不会被用来传输敏感信息,而是使用SSL+POST+CSRF token的方式来代替。 |
V |
||
v12.20 |
验证(如果可能的话)账号存储到设备前应进行截短。 |
V |
||
v12.21 |
验证应用使用了ASLR(地址空间分布随机化)技术。 |
V |
||
v12.22 |
验证当在(IOS)键盘上输入的数据被记录到日志时,不会包含认证凭证和财务数据等敏感信息。 |
V |
||
v12.23 |
验证如果运行的是android APP,该APP不会创建权限为MODE_WORLD_READABLE或MODE_WORLD_WRITABLE的文件。 |
V |
||
v12.24 |
验证敏感数据安全的加密方式进程存储(即便是存储在IOS的keychain中)。 |
V |
||
v12.25 |
验证APP使用了反调试和反逆向技术。 |
V |
||
v12.26 |
验证android设备的APP不会导出敏感的activities, intents, content Providers等等。 |
V |
||
v12.27 |
验证用于存储敏感数据(比如账号信息)的变量在不再需要使用时会被覆盖掉。 |
V |
||
v12.28 |
验证在android设备中暴露的intent、content providers 和broadcast receivers会对输入数据做严格的验证。 |
V |