2021年版OWASP Top 10的编制比以往更受数据驱动,但又并非盲目地受数据驱动,我们从公开收集的数据中选定了8个类别,之后又从Top 10社区调查结果中选择了2个高级别的类别,组成了10个类别。我们这样做是为了一个根本原因——通过查看收集到的数据来回顾过去。因为应用安全研究人员寻找新的漏洞和测试它们的新方法需要时间,将这些测试集成到工具和流程中也需要时间,当我们能够可靠地大规模测试弱点时,可能已经过去了很长时间,为了平衡这种观点,我们使用社区调查来向一线应用程序安全和开发专家征求意见,询问他们认为数据可能尚未体现出来的、极其重要的弱点。
2021年版Top 10产生了三个新类别,原有四个类别的命名和范围也发生了变化且进行了一些 整合,考虑到应关注根本原因而非症状,我们更改了一些类别的名称(*来源于社区调查结果)

2021版本变化说明:



从第五位上升到第一位,94%的应用程序都接受了某种形式的针对"失效的访问控制"测试,该事件的平均发生率为3.81%,该漏洞在提供的数据集中出现漏洞的应用数量最多,总发生漏洞应用数量超过31.8万多次,此类值得注意的常见CWE包括:CWE-200: Exposure of Sensitive Information to an Unauthorized Actor(将敏感信息泄漏给未经授权的参与者)、CWE-201: Exposure of Sensitive Information Through Sent Data(通过发送的数据泄漏敏感信息)、CWE-352: Cross-Site Request Forgery(跨站请求伪造)
访问控制强制实施策略使用户无法在其预期权限之外进行操作,失败的访问控制通常会导致未经授权的信息泄露、修改或销毁所有数据、或在用户权限之外执行业务功能,常见的访问控制脆弱点包括:
访问控制只在受信服务器端代码或无服务器API中有效,这样攻击者才无法修改访问控制检查或元数据
范例1:应用程序在访问帐户信息的SQL调用中使用 了未经验证的数据
pstmt.setString(1, request.getParameter("acct"));
ResultSet results = pstmt.executeQuery( );攻击者只需修改浏览器的"acct"参数即可发送他们想要的任何帐号,如果没有正确验证,攻击者可以访问任何用户帐户
https://example.com/app/accountInfo?acct=not myacct范例2:攻击者仅强制浏览目标URL,访问管理页面一定需要管理员权限
https://example.com/app/getappInfo
https://example.com/app/admin_getappInfo如果一个未经身份验证的用户可以访问任何页面,那么这是一个缺陷,而如果一个非管理员权限的用户可以访问管理页面,那么这同样也是一个缺陷

上升一位到第二名,以前称为"敏感数据泄漏","敏感数据泄漏"更像是一种常见的表象问题而不是根本原因,这项风险重点是与加密机制相关的故障(或缺乏加密机制),这往往会导致敏感数据泄漏,值得注意的常见CWE包括:CWE-259: Use of Hard-coded Password(使用硬编码密码)、CWE-327: Broken or Risky Crypto Algorithm(损坏或有风险的加密算法)、CWE-331 Insufficient Entropy(熵不足)
首先要确认对传输中数据和存储数据都有哪些保护需求,例如:密码、信用卡号、医疗记录、个人信息和商业秘密需要额外保护,尤其是在这些数据属于隐私保护法(如:欧盟GDPR)或法规条例(如:金融数据保护标准PCI DSS)适用范围的情况下,对于这些数据要确定:
范例1:一个应用程序使用自动化的数据加密系统加密存储中数据库中的信用卡号,但是这些数据在检索时会自动解密, 这就使得SQL注入漏洞以明文形式获得信用卡号
范例2:一个网站对所有网页没有使用或对强制使用TLS 或者使用弱加密,攻击者经过监测网络流量(例如:在不安全的无线网络中)将网络连接从HTTPS降级到HTTP,就可以拦截请求并窃取用户会话cookie,之后攻击者重放这个cookie并劫持用户的(经过身份验证的)会话, 访问或修改用户的私人数据,除此之外,攻击者还可以更改所有传输过程中的数据,例如:汇 款的接收人
范例3:密码数据库使用未加盐或弱:哈希算法来存储每个人的密码,一个文件上传漏洞允许攻击者获取密码数据库,所有未加盐哈希的密码都可以 通过预先计算的哈希值彩虹表破解,由简单或快速散列函数生成的加盐哈希也可能通过GPU破解

注入降至第三,94%的统计应用针对某种形式的注入进行了测试,最大发生率为19%,平均发生率为3%,共计发生了27.4万次,值得注意的常见弱点枚举(CWE)包括CWE-79: Cross-site Scripting(跨站点脚本)、CWE-89:SQL Injection(SQL注入)和CWE-73:External Control of File Name or Path(文件名或路径的外部控制)
在以下情况下,应用程序易受攻击:
常见的注入包括:SQL、NoSQL、OS命令、对象关系映射(ORM)、LDAP和表达式语言(EL)或对象图导航库(OGNL)注入,这一概念在所有解析器中都是相同的,源代码审查是检测应用程序是否易受注入攻击的最佳方法,强烈鼓励针对所有参数、标题、URL、cookies、 JSON、SOAP和XML数据输入的自动测试,组织可以在CI/CD管道中引入静态(SAST)、动态(DAST)和交互式(IAST)应用程序安全测试工具,以在产品部署之前识别引入的注入缺陷
防止注入需要将数据与命令和查询分开:
范例1:应用程序在构造以下易受攻击的:SQL调用时使用不受信任的数据:
String query = "SELECT \* FROM accounts WHERE custID='" + request.getParameter("id") + "'";范例2::类似地应用程序对框架的盲目信任可能会导致易受攻击的查询(例如:Hibernate查询语言(HQL))
Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");在这两种情况下攻击者都会修改浏览器中的"id"参数值, 以发送'或'1'='1,例如
http://example.com/app/accountView?id=' or '1'='1这将更改两个查询的含义,以返回accounts表中的所有记录,更危险的攻击可能会修改或删除数据,甚至调用存储过程

2021年版的一个新类别,侧重于与设计和体系结构缺陷相关的风险,呼吁更多地使用威胁建模、 安全设计模式和参考体系结构,作为一个应用安全技术社区,我们需要超越软件开发过程编码空间中的"左移",转向对设计安全原则至关重要的预编码活动,值得注意的常见弱点枚举(CWE)包括CWE209:Generation of Error Message Containing Sensitive Information(生成包含敏感信息的错误消息)、CWE-256:Unprotected Storage of Credentials(凭证的未保护存储)、CWE-501:Trust Boundary Violation(信任边界冲突)和CWE-522:Insufficiently Protected Credentials(凭证保护不足)
不安全设计是一个广泛的类别,代表不同的弱点,表示为“缺少或无效的控制设计”,不安全设计不是所有其他前10个风险类别的来源,不安全设计和不安全的实现之间存在差异,我们区分设计缺陷和实现缺陷是有原因的,它们有不同的根本原因和补救措施,安全设计仍然可能存在实现缺陷,从而导致可能被利用的漏洞,一个不安全设计不能通过一个完美的实现来修复,因为根据定义所需的安全控制从未被创建来抵御特定的攻击,导致不安全设计的因素之一是开发的软件或系统中缺乏固有的业务风险分析,因此无法确定需要何种级别的安全设计
A、安全设计
安全设计是一种文化和方法,它不断评估威胁并确保代码经过稳健的设计和测试,以防止已知的攻击方法。威胁建模应整合到细化会议(或类似活动)中,查看数据流和访问控制或其他安全控制中的更改,在用户故事开发中确定正确的流程和故障状态,确保责任方和受影响方充分理解并同意这些状态,分析预期和故障流的假设和条件,确保其仍然准确和可取,确定如何验证正确行为所需的假设和实施条件,确保结果记录在用户故事中,从错误中吸取教训,并提供积极的激励以促进改进,安全设计既不是附加 组件也不是可以添加到软件中的工具
B、需求和资源管理
收集应用程序的业务需求并与业务部门协商,包括所有数据资产和预期业务逻辑的机密性、完整性、可用性和真实性方面的保护需求,考虑应用程序的公开程度以及是否需要租户隔离(除访问控制外),编制技术要求包括功能性和非功能性安全要求,计划和协商所有设计、建造、测试和运营的预算,包括安全活动
C、安全开发生命周期
安全的软件需要安全开发生命周期、某种形式的安全设计模式、AppSec规划方法、安全的组件库、工 具和威胁建模,在整个项目和软件维护过程中,在软件项目开始时联系您的安全专家,考虑利用OWASP软件保证成熟度模型(SAMM)来帮助构建您的安全软件开发工作
范例1:身份凭证恢复工作流可能包括NIST 800-63b 、 OWASP ASVS和OWASP Top 10中已禁止的"问题和答案"功能,"问题和答案"不能作为可信的证据来证明身份,因为不止一个人知道答案,这就是为什么它们被禁止的原因,应删除此类代码,并用更安全的设计替换
范例2: 一家连锁电影院允许团体预订折扣,支持最多15名观众而不要押金。攻击者可以对这种流量进行威胁建模,并测试他们是否可以在几个请求中同时预订600个座位和所有电影院,从而造成巨大的收入损失
范例3:零售连锁店的电子商务网站没有针对黄牛党运行的机器人的保护,黄牛党购买高端显卡然后在拍卖网站上销售,这给显卡制造商和零售连锁店老板创造了糟糕的形象,并与那些无法以任何价格获得这些卡的爱好者产生了持久的伤害,适当的反机器人设计和域逻辑规则, 例如在可用的几秒钟内进行的购买可能会被识别为不可信的购买并拒绝此类交易

从上一版本的第六名提升,90%的调查应用都进行了某种形式的配置错误测试,平均发生率为4%,并且在此风险类别的CWE出现了超过20.8万次,随着当今软件正转向高度可配置,看到这一类别上升也就不足为奇了,需要注意的是CWE包括: CWE-16 Configuration(配置)和CWE-611 Improper Restriction of XML External Entity Reference(XML外部实体引用的不当限制)
您的应用程序可能受到攻击,如果应用程序是:
应实施安全的安装过程包括:
范例1:应用程序服务器附带了未从产品服务器中删除的应用程序样例,这些样例应用程序具有已知的安全漏洞,攻击者利用这些漏洞来攻击服务器,假设其中一个应用程序是管理员控制台,并且没有更改默认账户,攻击者就可以通过默认密码登录,从而接管服务器
范例2:目录列表在服务器端未被禁用,攻击者发现他们很容易就能列出目录列表,攻击者找到并下载所有已编译的Java类,他们通过反编译来查看代码,然后攻击者在应用程序中找到一个严重的访问控制漏洞
范例3:应用程序服务器配置允许将详细的错误信息(如:堆栈信息)返回给用户,这可能会暴露敏感信息或潜在的漏洞,例如:已知含有漏洞的组件的版本信息
范例4:云服务提供商向其他CSP用户提供默认的网络共享权限,这允许攻击者访问存储在云端的敏感数据

它在Top 10社区调查中排名第二,也有足够的数据让它进入前十,不安全的组件是我们努力测 试和评估风险的已知问题,并且它是在CWE中唯一没有任何CVE对应的类别,因此使用默认的利用/影响加权值为5.0,值得注意的是CWE包括:CWE-1104 Use of Unmaintained Third-Party Components(使用未维护第三方组件),以及2013年和2017年Top 10中关于此问题的两个CWE
如果满足下面的某个条件,那么您的应用就易受此类攻击:
应制定一个补丁管理流程:
范例1:通常组件都是以与应用相同的权限运行的,这使得组件里的缺陷可能导致各式各样的问题,这些缺陷可能是偶然的(例如:编码错误),也可能是蓄意的(例如:组件里的后门),下面是一些已被利用的漏洞:

很早之前被称之为"无效的身份认证",此类别从第二名下滑,现在包含了与身份识别失效相关的CWE,如知名的"CWE-297: Improper Validation of Certificate with Host Mismatch(与不匹配的服务端进行不适当的凭证确认)", "CWE-287: Improper Authentication(不适当的认证)", "CWE-384: Session Fixation(会话固定攻击)"
情境1: 使用已知列表密码的撞库攻击是一种常见的攻击方式,假设应用沒有实施自动化威胁或撞库攻击的保护,在这种情況下应用会被利用为密码预报的工具来判断认证凭据是否有效
情境2: 大多数身份验证攻击都是由于密码作为单一因素持续使用而发生的,一旦考虑最佳实践、 密码轮换和复杂性要求鼓励用户使用和重用弱密码,建议组织按照NIST 800-63停止这些做法并使用多因素认证
情境3: 应用会话超时设置错误,一个用户使用公用电脑来访问应用时,用户没有选择"登出"而是简单的关闭浏览器标签页就离开,一小时后一个攻击者使用同一个浏览器,而那个应用仍处于前面用户认证通过的状态

2021年版本的一个新类别,聚焦于在未验证完整性的情况下做出与软件更新、关键数据和CI/CD管道相关的假设,这是来自漏洞披露/通用漏洞评估系统(CVE/CVSS)数据的最高权重影响之一,值得注意的是CWE包括:CWE-829:Inclusion of Functionality from Untrusted Control Sphere(包含来自不受信任控制领域的功能),CWE-494:Download of Code Without Integrity Check(不进行完整性检查的代码下载)和CWE-502:Deserialization of Untrusted Data(不可信数据的反序列化)
软件和数据完整性故障与无法防止违反完整性的代码和基础设施有关,这方面的一个例子是应用程序依赖于不受信任的源、存储库和内容分发网络(CDN)的插件、库或模块,不安全的CI/CD管道可能会带来未经授权的访问、恶意代码或系统安全风险,最后许多应用程序现在包括 自动更新功能,其中更新包在没有进行充足完整性验证的情况下被下载,并应用于以前受信任的应用程序,攻击者可能会上传自己的更新包,以便在所有安装上分发和运行,另一个例子是对象或数据被编码或序列化为攻击者可以看到和修改的结构,很容易受到不安全的反序列化的影响
范例1:无需签名既可更新许多家庭路由器、机顶盒、设备固件和其他设备通过没有签 名的固件进行更新,未签名固件是越来越多的攻击者的目标, 预计情况只会变得更糟,这是 一个主要问题,因为很多时候除了在未来的版本中修复和等待以前的版本过期之外,没有任何其他补救措施
范例2:SolarWinds恶意更新众所周知一种新的攻击机制, 即最近值得注意的SolarWinds Orion攻击,开发该软件的公司具有安全的构建和更新完整性流程,尽管如此,这些都能够被颠覆,几个月来,该公司向18,000多个组织分发了一个高度针对性的恶意更新,其中大约100个组织受到影响,这是历史上同类性质中影响最深远和最严重的违 规行为之一
范例3:不安全的反序列化一个React应用程序调用一组Spring Boot微服务,作为函数程序员,他们试图确保他们的代码是不可变的,他们提出的解决方案是将用户状态序列化,并在每个请求中来回传递,攻击者注意到"rO0"Java 对象签名(在base64中),并使用Java Serial Killer工具在 应用服务器上获取远程代码执行权

安全日志和监控故障来自于Top 10的社区调查(排名第3位),比2017年OWASP Top 10社区调查时的第10位略有上升,日志记录和监控是一项具有挑战性的测试,通常涉及访谈或询问渗透测试期间是否检测到攻击,这个类别的CVE/CVSS数据不多,但检测和应对违规行为是至关重要的,同时它对问责制、可见性、事件告警和取证仍有很大的影响,这个类别除了CWE-778 Insufficient Logging(日志记录不足)外,还包括CWE-117 Improper Output Neutralization for Logs(日志输出不当),CWE-223 Omission of Security-relevant Information(安全事件信息漏报),以及CWE-532 Insertion of Sensitive Information into Log File(在日志文件中包含敏感信息)
2021年版OWASP Top 10中,该类别是为了帮助检测、升级和应对活跃的违规行为,如果不进行日志记录和监测就无法发现违规行为,任何时候都会发生日志记录、检测、监视和主动响应不足的情况
开发人员应根据应用的风险,实施以下部分或全部控制:
范例1:一家儿童健康计划供应商的 网站运营者由于缺乏安全监控和记录而无法发现漏洞,一个外部团体告知儿童健康 计划供应商,某恶意攻击者已经获取并修改了超过350万 儿童的数千份敏感健康记录, 事后审查发现网站开发人员没有修复重大漏洞,由于没有对系统进行日志记录或监控,因此数据泄露可能自2013年以来一直在进行,时间超过7年
范例2:印度一家大型航空公司发生数据泄露事件,涉及数百万乘客十多年的个人信息,包括护照和信用卡信息,数据泄露发生在一家第三方云托管服务提供商,该提供商在一段时间后通知了航空公司此次泄露事件
范例3:欧洲一家大型航空公司遭遇一起可报告的GDPR违规事件,据报道攻击者利用支付应用程序的安全漏洞,获取了超过40万客户的支付记录,从而导致了此次攻击,该航空公司因此被隐私监管机构处以2000万英镑的罚款

这个类别是从Top 10社区调查(排名第1位)中新添加的,数据显示该类别安全事件发生率相对较低,测试覆盖率高于平均水平,平均漏洞利用脚本数和影响潜力等级高于平均水平,因为新类别可能是单一或小型集群的CWE,为了引起关注和认识希望这个类别能受到关注并且在未来的版本可以推出一个更大的类别
Web应用在获取远程资源时没有验证用户提供的URL就会出现SSRF缺陷,它允许攻击者强制应用程序发送一个精心构建的请求到一个意外目的地,即使是在有防火墙、VPN或其他类型的网络访问控制列表(ACL)保护的情况下
随着现代Web应用为终端用户提供便利的功能,获取URL成为一种常见的场景,因此SSRF安全攻击事件也在不断增加,此外由于云服务和架构的复杂性,SSRF的严重性也越来越高
开发者可以通过实现以下部分或全部防御手段,纵深防御来阻止SSRF:
A、网络层防御建议:
在隔离的网络中设置多个远程资源访问功能的网段以减少SSRF的影响
执行"默认拒绝"防火墙策略或网络访问控制规则以阻止除必要的内部网通信外的所有通信
B、应用层防御建议:
C、需额外考虑的措施
范例1:内部服务器端口扫描如果网络架构未进行网络隔离,攻击者可以访 问并绘制出内部网络地图并根据连接结果或SSRF有效载荷连接的运行时间和拒绝时间判断内部服务器端口是打开还是关闭
范例2:敏感数据泄露攻击者可以访问本地文件或内部服务以获得敏感信息,例如: file:///etc/passwd http://localhost:280 17/
范例3:访问云服务的元数据存储大多数云服务提供商都有元数据存储,比如:通过http://169.254.169.254/访问,攻击者可以通过读取元数据来获取敏感信息
范例4:危害内部服务攻击者可以滥用内部服务进行进一步的攻击,比如:远程代码执行(RCE)或者拒绝服务攻击(DoS)