OWASP Top 10 2021 是全新的,具有新的图形设计和一页有用的信息图。
有三个新类别,四个类别的命名和范围发生了变化,并且 2021 年的前 10 名中进行了一些合并。
A01:2021-Broken Access Control 失效的访问控制
从第五位上升;94% 的应用程序都经过了某种形式的破坏访问控制的测试。映射到 Broken Access Control 的 34 个 CWE 在应用程序中出现的次数比任何其他类别都多。
A02:2021-Cryptographic Failures 加密失败
上移一位至 #2,以前称为敏感数据泄露,这是广泛的症状而不是根本原因。此处重新关注与密码学相关的漏洞,这些漏洞通常会导致敏感数据泄露或系统受损。
A03:2021-Injection 注入
下滑到第三位。94% 的应用程序都针对某种形式的注入进行了测试,映射到此类别的 33 个 CWE 在应用程序中的出现次数排名第二。跨站点脚本攻击现在是此版本中此类别的一部分。
A04:2021-不安全的设计
是2021 年的一个新类别,重点关注与设计缺陷相关的风险。如果我们真的想作为一个行业“安全左移”,就需要更多地使用威胁建模、安全设计模式和原则以及参考架构。
A05:2021-安全配置错误
从上一版的第 6 位上升;90% 的应用程序都经过了某种形式的错误配置测试。随着更多定制性高度可配置的软件,看到这一类别上升也就不足为奇了。XML 外部实体 (XXE) 的前一个类别现在属于此类别。
A06:2021-Vulnerable and Outdated Components 易受攻击和过时的组件
之前的标题是 使用具有已知漏洞的组件,在行业调查中排名第二,但也有足够的数据通过数据分析进入前 10 名。该类别从 2017 年的第 9 位上升,是我们难以测试和评估风险的已知问题。它是唯一没有任何 CVE 映射到包含的 CWE 的类别,因此默认的利用和影响权重 5.0 被计入他们的分数。
A07:2021-Identification and Authentication Failures 认证和授权失败
以前是 Broken Authentication 失效的身份认证并且从第二位下滑,现在包括与识别失败更多相关的 CWE。这个类别仍然是前 10 名的一个组成部分,但标准化框架的可用性增加似乎有所帮助。
A08:2021-软件和数据完整性故障
是 2021 年的一个新类别,专注于在不验证完整性的情况下做出与软件更新、关键数据和 CI/CD 管道相关的假设。CVE/CVSS 数据的最高加权影响之一映射到该类别中的 10 个 CWE。2017 年的不安全反序列化现在是这一更大类别的一部分。
A09:2021-安全日志记录和监控失败
以前是 日志记录和监控不足,是从行业调查 (#3) 中添加的,从之前的 #10 上升。此类别已扩展为包括更多类型的故障,难以测试,并且在 CVE/CVSS 数据中没有得到很好的体现。但是,此类故障会直接影响可见性、事件警报和取证。
A10:2021-Server-Side Request Forgery 服务器请求伪造
是从行业调查 (#1) 中添加的。数据显示发生率相对较低,测试覆盖率高于平均水平,并且利用和影响潜力的评级高于平均水平。此类别代表行业专业人士告诉我们这很重要的场景,即使目前数据中没有说明。
前 10 名的这一部分比以往任何时候都更受数据驱动,但并非盲目地受数据驱动。我们从贡献的数据中选择了十个类别中的八个,从高水平的行业调查中选择了两个类别。我们这样做的根本原因是,查看贡献的数据就是回顾过去。AppSec 研究人员花时间寻找新的漏洞和测试它们的新方法。将这些测试集成到工具和流程中需要时间。当我们能够可靠地大规模测试漏洞时,可能已经过去了很多年。为了平衡这种观点,我们使用行业调查来询问一线人员他们认为数据可能尚未显示的漏洞。
有很多关于十大风险之间重叠的讨论。根据每个(包括 CWE 列表)的定义,确实没有任何重叠。但是,从概念上讲,可能存在基于更高级别命名的重叠或交互。维恩图多次用于显示这样的重叠。
上面的维恩图代表了 2017 年十大风险类别之间的相互作用。这样做时,几个要点变得明显:
有人可能会争辩说,跨站点脚本最终属于注入,因为它本质上是内容注入。看看 2021 年的数据,XSS 需要进入注入变得更加明显。
重叠仅在一个方向。我们通常会根据最终表现或“症状”而不是(可能很深的)根本原因对漏洞进行分类。例如,“敏感数据暴露”可能是“安全配置错误”的结果;但是,您不会从另一个方向看到它。因此,在交互区域中绘制了箭头以指示发生的方向。
有时这些图表是用A06:2021 Using Components with known Vulnerabilities 中的所有内容绘制的。虽然其中一些风险类别可能是第三方漏洞的根本原因,但它们的管理方式和责任通常不同。其他类型通常代表第一方风险。
从第五位上升,94% 的应用程序都经过了某种形式的访问控制损坏测试。值得注意的CWE包括CWE-200:将敏感信息暴露给未经授权的参与者、CWE-201:通过发送的数据暴露敏感信息和CWE-352:跨站点请求伪造。
描述
访问控制强制执行策略,使用户不能在其预期权限之外采取行动。故障通常会导致未经授权的信息泄露、修改或破坏所有数据或执行超出用户限制的业务功能。常见的访问控制漏洞包括:
如何预防
访问控制仅在受信任的服务器端代码或无服务器 API 中有效,攻击者无法修改访问控制检查或元数据。
攻击场景示例
场景 #1:应用程序在访问帐户信息的 SQL 调用中使用未经验证的数据:
pstmt.setString(1, request.getParameter("acct"));
结果集结果 = pstmt.executeQuery();
攻击者只需修改浏览器的“acct”参数即可发送他们想要的任何帐号。如果没有正确验证,攻击者可以访问任何用户的帐户。
https://example.com/app/accountInfo?acct=notmyacct
场景#2:攻击者只是强制浏览到目标 URL。访问管理页面需要管理员权限。
https://example.com/app/getappInfo
https://example.com/app/admin_getappInfo
如果未经身份验证的用户可以访问任一页面,则这是一个缺陷。如果非管理员可以访问管理页面,这是一个缺陷。
上移一个位置到#2,以前称为敏感数据暴露,这更像是一个广泛的症状而不是根本原因,重点是与密码学相关的失败(或缺乏密码学)。这往往会导致敏感数据的暴露。值得注意的CWE包括CWE-259:使用硬编码密码、CWE-327:损坏或风险的加密算法和CWE-331 熵不足。
描述
首先是确定传输中和静止数据的保护需求。例如,密码、信用卡号、健康记录、个人信息和商业秘密需要额外保护,主要是如果该数据属于隐私法(例如欧盟的通用数据保护条例 (GDPR))或法规(例如金融数据保护)例如 PCI 数据安全标准 (PCI DSS)。对于所有此类数据:
如何预防
至少执行以下操作,并查阅参考资料:
攻击场景示例
场景#1:应用程序使用自动数据库加密对数据库中的信用卡号进行加密。但是,此数据在检索时会自动解密,从而允许 SQL 注入缺陷以明文形式检索信用卡号。
场景#2:站点不使用或对所有页面强制执行 TLS 或支持弱加密。攻击者监视网络流量(例如,在不安全的无线网络中),将连接从 HTTPS 降级为 HTTP,拦截请求并窃取用户的会话 cookie。然后攻击者重放这个 cookie 并劫持用户的(经过身份验证的)会话,访问或修改用户的私人数据。除了上述之外,他们还可以更改所有传输的数据,例如,汇款的接收者。
场景#3:密码数据库使用未加盐或简单的哈希来存储每个人的密码。文件上传缺陷允许攻击者检索密码数据库。所有未加盐的哈希值都可以通过预先计算的哈希值彩虹表公开。由简单或快速散列函数生成的散列可能会被 GPU 破解,即使它们被加盐。
注射向下滑动到第三个位置。94% 的应用程序都针对某种形式的注入进行了测试。值得注意的CWE包括 CWE-79:跨站点脚本、CWE-89:SQL 注入和CWE-73:文件名或路径的外部控制。
应用程序在以下情况下容易受到攻击:
一些更常见的注入是 SQL、NoSQL、OS 命令、对象关系映射 (ORM)、LDAP 和表达式语言 (EL) 或对象图导航库 (OGNL) 注入。这个概念在所有口译员中都是相同的。源代码审查是检测应用程序是否容易受到注入攻击的最佳方法。强烈建议对所有参数、标头、URL、cookie、JSON、SOAP 和 XML 数据输入进行自动化测试。组织可以将静态源 (SAST) 和动态应用程序测试 (DAST) 工具包含到 CI/CD 管道中,以在生产部署之前识别引入的注入缺陷。
场景 #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=' 或 '1'='1
这将更改两个查询的含义以返回帐户表中的所有记录。更危险的攻击可能会修改或删除数据,甚至调用存储过程。
2021 年的新类别侧重于与设计和架构缺陷相关的风险,并呼吁更多地使用威胁建模、安全设计模式和参考架构。值得注意的CWE包括 CWE-209:生成包含敏感信息的错误消息、 CWE-256:未受保护的凭证存储、CWE-501:信任边界违规和CWE-522:受保护的凭证不足。
不安全设计是一个广泛的类别,代表许多不同的弱点,表现为“缺失或无效的控制设计”。缺少不安全的设计是缺少控制的地方。例如,想象一下应该加密敏感数据的代码,但没有方法。无效的不安全设计是可以实现威胁的地方,但域(业务)逻辑验证不足会阻止该操作。例如,假设域逻辑应该根据收入等级处理流行病税收减免,但不验证所有输入都已正确签名并提供比应授予的更重要的减免收益。
安全设计是一种文化和方法,它不断评估威胁并确保代码经过稳健设计和测试,以防止已知的攻击方法。安全设计需要安全的开发生命周期、某种形式的安全设计模式或铺砌道路组件库或工具,以及威胁建模。
场景 #1:凭证恢复工作流程可能包括“问答”,这是 NIST 800-63b、OWASP ASVS 和 OWASP Top 10 所禁止的。不能将问答作为多个人身份的证据可以知道答案,这就是为什么它们被禁止。此类代码应删除并替换为更安全的设计。
场景#2:连锁影院允许团体预订折扣,并且在要求押金之前最多有 15 名参与者。攻击者可以对该流程进行威胁建模,并测试他们是否可以在几次请求中一次预订 600 个座位和所有电影院,从而造成巨大的收入损失。
场景 #3:零售连锁店的电子商务网站没有针对由黄牛运行的机器人提供保护,这些机器人购买高端显卡以转售拍卖网站。这对视频卡制造商和零售连锁店主造成了可怕的宣传,并与无法以任何价格获得这些卡的爱好者之间产生了仇恨。仔细的反机器人设计和域逻辑规则,例如在可用性的几秒钟内进行的购买,可能会识别出不真实的购买并拒绝此类交易。
从上一版的第 6 位开始,90% 的应用程序都经过了某种形式的错误配置测试。随着更多转向高度可配置的软件,看到这一类别上升也就不足为奇了。值得注意的CWE包括CWE-16 Configuration和CWE-611 Improper Restriction of XML External Entity Reference。
如果应用程序是:
如果没有协调一致的、可重复的应用程序安全配置过程,系统将面临更高的风险。
应实施安全安装过程,包括:
场景#1:应用程序服务器带有未从生产服务器中删除的示例应用程序。这些示例应用程序具有攻击者用来破坏服务器的已知安全漏洞。假设这些应用程序之一是管理控制台,并且默认帐户未更改。在这种情况下,攻击者使用默认密码登录并接管。
场景#2:服务器上没有禁用目录列表。攻击者发现他们可以简单地列出目录。攻击者找到并下载已编译的 Java 类,对其进行反编译和逆向工程以查看代码。然后攻击者发现应用程序中存在严重的访问控制缺陷。
场景#3:应用服务器的配置允许将详细的错误消息(例如堆栈跟踪)返回给用户。这可能会暴露敏感信息或潜在缺陷,例如已知易受攻击的组件版本。
场景#4:云服务提供商拥有其他 CSP 用户对 Internet 开放的默认共享权限。这允许访问存储在云存储中的敏感数据。
它在行业调查中排名第二,但也有足够的数据通过数据进入前 10 名。易受攻击的组件是我们难以测试和评估风险的已知问题,并且是唯一没有任何 CVE 映射到包含的 CWE 的类别,因此使用默认的漏洞利用/影响权重 5.0。值得注意的CWE包括CWE-1104:使用未维护的第三方组件和来自 2013 年和 2017 年前 10 名的两个 CWE。
你可能很脆弱:
应该有一个补丁管理流程来:
每个组织都必须确保在应用程序或产品组合的生命周期内制定持续的监控、分类和应用更新或配置更改的计划。
场景#1:组件通常以与应用程序本身相同的权限运行,因此任何组件中的缺陷都可能导致严重影响。此类缺陷可能是偶然的(例如,编码错误)或有意的(例如,组件中的后门)。发现的一些可利用组件漏洞的示例是:
有一些自动化工具可以帮助攻击者找到未打补丁或配置错误的系统。例如,Shodan IoT 搜索引擎可以帮助您找到仍然存在 2014 年 4 月修补的 Heartbleed 漏洞的设备。
以前称为Broken Authentication,此类别从第二位下滑,现在包括与识别失败相关的 CWE。包括的值得注意的CWE包括CWE-297:不正确的证书验证与主机不匹配、CWE-287:不正确的身份验证和 CWE-384:会话固定。
确认用户的身份、身份验证和会话管理对于防止与身份验证相关的攻击至关重要。如果应用程序存在以下情况,则可能存在身份验证漏洞:
场景#1:凭证填充(使用已知密码列表)是一种常见的攻击。假设应用程序没有实施自动化威胁或凭证填充保护。在这种情况下,应用程序可以用作密码预言机来确定凭证是否有效。
场景#2:大多数身份验证攻击是由于继续使用密码作为唯一因素而发生的。一经考虑,最佳实践、密码轮换和复杂性要求会鼓励用户使用和重复使用弱密码。建议组织按照 NIST 800-63 停止这些做法并使用多因素身份验证。
场景 #3:应用程序会话超时设置不正确。用户使用公共计算机访问应用程序。用户没有选择“注销”,而是简单地关闭浏览器选项卡并走开。攻击者在一个小时后使用同一个浏览器,而用户仍然通过身份验证。
2021 年的新类别侧重于在不验证完整性的情况下做出与软件更新、关键数据和 CI/CD 管道相关的假设。来自 CVE/CVSS 数据的最高加权影响之一。著名的CWE包括CWE-502:不可信数据的反序列化、 CWE-829:包含不受信任的控制领域的功能和 CWE-494:下载没有完整性检查的代码。
软件和数据完整性故障与不能防止完整性违规的代码和基础设施有关。例如,在对象或数据被编码或序列化为攻击者可以看到和修改的结构的情况下,很容易受到不安全的反序列化的影响。另一种形式是应用程序依赖来自不受信任的来源、存储库和内容交付网络 (CDN) 的插件、库或模块。不安全的 CI/CD 管道可能会导致未经授权的访问、恶意代码或系统受损。最后,许多应用程序现在包括自动更新功能,其中更新在没有充分完整性验证的情况下被下载并应用于以前受信任的应用程序。攻击者可能会上传自己的更新以分发并在所有安装上运行。
场景 #1 不安全的反序列化: React 应用程序调用一组 Spring Boot 微服务。作为函数式程序员,他们试图确保他们的代码是不可变的。他们提出的解决方案是序列化用户状态并在每个请求中来回传递它。攻击者注意到“R00”Java 对象签名并使用 Java Serial Killer 工具在应用服务器上获取远程代码执行权。
场景 #2 无需签名即可更新:许多家用路由器、机顶盒、设备固件和其他固件不通过签名固件验证更新。未签名固件是攻击者越来越多的目标,预计只会变得更糟。这是一个主要问题,因为很多时候除了在未来版本中修复并等待以前的版本过时之外,没有任何补救机制。
场景#3 SolarWinds 恶意更新:众所周知,国家会攻击更新机制,最近的一次著名攻击是 SolarWinds Orion 攻击。开发该软件的公司拥有安全的构建和更新完整性流程。尽管如此,这些还是能够被破坏,并且在几个月的时间里,该公司向 18,000 多个组织分发了一个高度针对性的恶意更新,其中大约 100 个组织受到了影响。这是历史上此类性质最深远、最重大的违规行为之一。
安全日志记录和监控来自行业调查(#3),比 2017 年 OWASP 前 10 名中的第十位略有上升。日志记录和监控可能很难测试,通常涉及采访或询问是否在渗透测试期间检测到攻击。此类别的 CVE/CVSS 数据不多,但检测和响应漏洞至关重要。尽管如此,它对于可见性、事件警报和取证仍然非常有影响力。此类别扩展到CWE-778 日志记录不足之外,包括CWE-117 日志的不当输出中和、CWE-223 安全相关信息的遗漏和 CWE-532 将敏感信息插入日志文件。
回到 2021 年 OWASP 前 10 名,该类别旨在帮助检测、升级和响应主动违规行为。如果没有日志记录和监控,就无法检测到漏洞。任何时候都会发生日志记录、检测、监控和主动响应不足的情况:
通过使用户或攻击者可以看到日志记录和警报事件,您很容易受到信息泄漏的影响(请参阅 A01:2021 – 损坏的访问控制)。
开发人员应实施以下部分或全部控制措施,具体取决于应用程序的风险:
有商业和开源应用程序保护框架(例如 OWASP ModSecurity 核心规则集)和开源日志关联软件(例如 ELK 堆栈)具有自定义仪表板和警报功能。
场景#1:由于缺乏监控和日志记录,一家儿童健康计划提供商的网站运营商无法检测到违规行为。外部方通知健康计划提供者,攻击者访问并修改了超过 350 万儿童的数千份敏感健康记录。事后审查发现网站开发人员没有解决重大漏洞。由于没有对系统进行日志记录或监控,数据泄露可能自 2013 年以来一直在进行,时间超过七年。
场景#2:印度一家大型航空公司发生数据泄露事件,涉及数百万乘客超过十年的个人数据,包括护照和信用卡数据。数据泄露发生在第三方云托管服务提供商处,该提供商在一段时间后将泄露事件通知了航空公司。
场景 #3:一家主要的欧洲航空公司遭遇了 GDPR 可报告的违规行为。据报道,该漏洞是由攻击者利用的支付应用程序安全漏洞引起的,他们收集了超过 400,000 条客户支付记录。该航空公司因此被隐私监管机构罚款 2000 万英镑。
此类别是从行业调查 (#1) 中添加的。数据显示发生率相对较低,测试覆盖率高于平均水平,利用和影响潜力评级高于平均水平。由于新条目可能是用于关注和意识的单个或一小部分 CWE,因此希望它们受到关注,并且可以在未来版本中纳入更大的类别。
每当 Web 应用程序在未验证用户提供的 URL 的情况下获取远程资源时,就会出现 SSRF 缺陷。它允许攻击者强制应用程序将精心设计的请求发送到意外目的地,即使受到防火墙、VPN 或其他类型的网络 ACL 的保护也是如此。
随着现代 Web 应用程序为最终用户提供方便的功能,获取 URL 成为一种常见情况。因此,SSRF 的发病率正在增加。此外,由于云服务和架构的复杂性,SSRF 的严重性越来越高。
开发人员可以通过实施以下部分或全部深度防御控制来防止 SSRF:
不要通过使用拒绝列表或正则表达式来缓解 SSRF。攻击者拥有有效负载列表、工具和技能来绕过拒绝列表。
攻击者可以使用 SSRF 攻击受 Web 应用程序防火墙、防火墙或网络 ACL 保护的系统,使用的场景包括:
场景#1:端口扫描内部服务器。如果网络架构是未分段的,攻击者可以绘制内部网络,并根据连接结果或连接或拒绝 SSRF 负载连接所用的时间来确定内部服务器上的端口是打开还是关闭。
场景#2:敏感数据暴露。攻击者可以访问本地文件,例如 或内部服务以获取敏感信息。
场景#3:访问云服务的元数据存储。大多数云提供商都有元数据存储,例如http://169.254.169.254/。攻击者可以读取元数据来获取敏感信息。
场景#4:破坏内部服务——攻击者可以滥用内部服务进行进一步的攻击,例如远程代码执行 (RCE) 或拒绝服务 (DoS)。
来源:利刃信安
评论已关闭。