此备忘单的目标是提供一个简洁的虚拟修补框架,组织可以遵循该框架以最大限度地及时实施缓解保护。
一个安全策略执行层,可防止和报告已知漏洞的利用尝试。
当安全执行层分析事务并拦截传输中的攻击时,虚拟补丁就会起作用,因此恶意流量永远不会到达 Web 应用程序。虚拟补丁带来的影响是,虽然应用程序本身的实际源代码没有被修改,但利用尝试并没有成功。
从纯粹的技术角度来看,首要的补救策略是让组织更正 Web 应用程序源代码中已识别的漏洞。这个概念得到了 Web 应用程序安全专家和系统所有者的普遍认同。不幸的是,在现实世界的业务情况中,会出现许多情况下更新 Web 应用程序的源代码并不容易,例如:
重要的一点是 -代码级修复和虚拟修补不是相互排斥的。它们是由不同团队(OWASP Builders/Devs vs. OWASP Defenders/OpSec)执行的进程,可以串联运行。
虚拟修补的两个主要目标是:
请注意,上面的定义没有列出任何特定工具,因为有许多不同的选项可用于虚拟修补工作,例如:
出于示例目的,我们将展示使用开源ModSecurity WAF 工具的虚拟修补示例。
与大多数其他安全过程一样,虚拟修补不应随意处理。相反,应该遵循一个一致的、可重复的过程,这将提供最大的成功机会。以下虚拟修补工作流程模仿行业公认的 IT 事件响应实践,包括以下阶段:
让我们以下面的SQL 注入漏洞作为本文其余部分的示例:
- WordPress Shopping Cart Plugin for WordPress
- /wp-content/plugins/levelfourstorefront/scripts/administration/exportsubscribers.php
- reqID Parameter prone to SQL Injection.
说明:
用于 WordPress 的 WordPress 购物车插件包含一个漏洞,可能允许攻击者执行 SQL 注入攻击。
问题是由于/wp-content/plugins/levelfourstorefront/scripts/administration/exportsubscribers.php
脚本未正确清理用户提供的reqID
参数输入。
这可能允许攻击者在后端数据库中注入或操纵 SQL 查询,从而允许操纵或泄露任意数据。
正确利用虚拟修补准备阶段的重要性怎么强调都不为过。在实际处理已识别的漏洞或更糟糕的是,对实时 Web 应用程序入侵做出反应之前,您需要做很多事情来设置虚拟修补过程和框架。关键是,在实时妥协期间不是提议安装 Web 应用程序防火墙和虚拟补丁概念的理想时间。真实事件中的紧张度很高,时间很重要,所以在风平浪静时打好虚拟修补的基础,并在事件发生时做好一切准备。
以下是在准备阶段应解决的一些关键项目:
识别阶段发生在组织意识到其 Web 应用程序中的漏洞时。通常有两种不同的方法来识别漏洞:Proactive
和Reactive
.
当组织自行评估其网络安全状况并执行以下任务时,就会发生这种情况:
由于自定义编码的 Web 应用程序是独一无二的,因此这些主动识别任务非常重要,因为您无法依赖 3rd 方漏洞通知。
识别漏洞的三种主要反应方法:
以下是开始分析阶段的推荐步骤:
创建准确的虚拟补丁的过程受两个主要租户的约束:
应注意尽量减少这两个规则中的任何一个。可能无法 100% 地坚持这些目标,但请记住,虚拟修补是关于降低风险的。企业主应该明白,虽然您获得了缩短修复时间指标的优势,但您可能并未针对该缺陷实施完整的修复。
正向安全模型(白名单)是一种综合安全机制,可为应用程序提供独立的输入验证信封。该模型指定有效输入的特征(字符集、长度等),并拒绝任何不符合要求的内容。通过为应用程序中每个页面中的每个参数定义规则,应用程序受到独立于其代码的附加安全封装的保护。
示例白名单 ModSecurity 虚拟补丁
为了创建白名单虚拟补丁,您必须能够验证正常的预期输入值是什么。如果您在准备阶段实施了适当的审计日志记录,那么您应该能够查看审计日志以确定预期输入类型的格式。在这种情况下,reqID
参数应该只包含整数字符,因此我们可以使用这个虚拟补丁:
- #
- # Verify we only receive 1 parameter called "reqID"
- #
- SecRule REQUEST_URI "@contains /wp-content/plugins/levelfourstorefront/scripts/administration/exportsubscribers.php" "chain,id:1,phase:2,t:none,t:Utf8toUnicode,t:urlDecodeUni,t:normalizePathWin,t:lowercase,block,msg:'Input Validation Error for \'reqID\' parameter - Duplicate Parameters Names Seen.',logdata:'%{matched_var}'"
- SecRule &ARGS:/reqID/ "!@eq 1"
-
- #
- # Verify reqID's payload only contains integers
- #
- SecRule REQUEST_URI "@contains /wp-content/plugins/levelfourstorefront/scripts/administration/exportsubscribers.php" "chain,id:2,phase:2,t:none,t:Utf8toUnicode,t:urlDecodeUni,t:normalizePathWin,t:lowercase,block,msg:'Input Validation Error for \'reqID\' parameter.',logdata:'%{args.reqid}'"
- SecRule ARGS:/reqID/ "!@rx ^[0-9]+$"
此虚拟补丁将检查reqID
指定页面上的参数值,并防止输入除整数以外的任何字符。
负面安全模型(黑名单)基于一组检测特定已知攻击的规则,而不是只允许有效流量。
示例黑名单 ModSecurity 虚拟补丁
以下是公共咨询提供的示例PoC 代码:
http://localhost/wordpress/wp-content/plugins/levelfourstorefront/scripts/administration/exportsubscribers.php?reqID=1' or 1='1
查看有效载荷,我们可以看到攻击者正在插入一个单引号字符,然后在末尾添加额外的 SQL 查询逻辑。根据这些数据,我们可以禁止这样的单引号字符:
- SecRule REQUEST_URI "@contains /wp-content/plugins/levelfourstorefront/scripts/administration/exportsubscribers.php" "chain,id:1,phase:2,t:none,t:Utf8toUnicode,t:urlDecodeUni,t:normalizePathWin,t:lowercase,block,msg:'Input Validation Error for \'reqID\' parameter.',logdata:'%{args.reqid}'"
- SecRule ARGS:/reqID/ "@pm '"
虚拟补丁可以采用正面或负面的安全模型。您决定使用哪一个取决于具体情况和一些不同的考虑因素。例如,负面的安全规则通常可以更快地实施,但可能的规避的可能性更大。
另一方面,积极的安全规则提供了更好的保护,但它通常是一个手动过程,因此不可扩展且难以维护大型/动态站点。虽然针对整个站点的手动正面安全规则可能不可行,但当漏洞警报识别出存在问题的特定位置时,可以选择性地采用正面安全模型。
您想抵制走捷径的冲动,并快速创建特定于漏洞利用的虚拟补丁。
例如,如果经过授权的渗透测试在页面上发现了 XSS 漏洞,并在报告中使用了以下攻击载荷:
- <script>
- alert('XSS Test')
- script>
实现一个简单地阻止确切有效负载的虚拟补丁是不明智的。虽然它可以提供一些即时保护,但其长期价值却大大降低。
随着漏洞数量的增加,手动创建补丁程序可能变得不可行,并且可能需要自动化手段。如果漏洞是使用自动化工具识别的并且有 XML 报告可用,则可以利用自动化流程将此漏洞数据自动转换为保护系统的虚拟补丁。
三个例子包括:
为了准确测试新创建的虚拟补丁,可能需要使用 Web 浏览器以外的应用程序。一些有用的工具是:
瑞安巴尼特 - ryan.barnett@owasp.org
乔什·兹拉丁 - jamuse@gmail.com
克里斯蒂安·福里尼 - christian.folini@netnea.com