使用 Elastic 安全检测对 CVE-2021-44228 (Log4j2) 的利用
重要说明:
- 要了解 Elastic 当前如何评估我们产品中关于该漏洞的内部风险,请参见此处的建议。
- 本博文在最初发布以后,已于 2021 年 12 月 14 日进行了更新,进一步介绍了检测和猎捕方面的改进。
概述
本博文对 CVE-2021-44228 进行了简要介绍,并为 Elastic 安全用户提供了检测方法,以发现他们环境中对该漏洞的主动利用。
在我们了解到更多信息后,我们会在本博文中提供进一步的更新。这一版本的内容截至于 2021 年 12 月 14 日(星期二)。您可以通过 Log4j2 的安全页面直接调查来自 Apache 的更新。
CVE-2021-44228 (Log4Shell) 摘要
Log4j2 是一个开源日志记录框架,可集成到最终用户系统和服务器上的许多基于 Java 的应用程序中。2021 年 11 月下旬,阿里巴巴的陈兆军(音)发现了一个远程代码执行漏洞,最终在 CVE ID:CVE-2021-44228 中报告,于 2021 年 12 月 10 日公布。该漏洞是通过对传入框架的用户输入进行不正确的反序列化而被利用的。它允许远程代码执行,并允许攻击者泄露环境变量等敏感数据,或在目标系统上执行恶意软件。
已发现的漏洞会影响从版本 2.0-beta9 到版本 2.14.1 的所有 Log4j2 版本。早期修补该问题的方法生成了许多候选版本,最终在本博文发布时建议将框架升级到 Log4j2 2.15.0-rc2。
鉴于所观测到的广泛利用的复杂性和性质,在任何已发现软件利用 Log4j2 易受攻击版本的环境中,在采取缓解措施方面应高度重视。
在 Elastic 安全中检测对 Log4Shell 的利用
Elastic 安全用户可以使用以下事件关联检测规则来识别对 Log4j2 漏洞的主动利用。 根据基于主机的事件数据的格式,您可能需要修改此检测规则以匹配数据字段。
使用终端数据时的检测规则
sequence by host.id with maxspan=1m
[network where event.action == "connection_attempted" and
process.name : "java" and
/*
outbound connection attempt to
LDAP, RMI or DNS standard ports
by JAVA process
*/
destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
[process where event.type == "start" and
/* Suspicious JAVA child process */
process.parent.name : "java" and
process.name : ("sh",
"bash",
"dash",
"ksh",
"tcsh",
"zsh",
"curl",
"perl*",
"python*",
"ruby*",
"php*",
"wget")] by process.parent.pid
使用 Auditbeat 数据时的检测规则
sequence by agent.id with maxspan=1m
[network where event.action == "connected-to" and
process.name : "java" and
/*
outbound connection attempt to
LDAP, RMI or DNS standard ports
by JAVA process
*/
destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
[process where event.type == "start" and
/* Suspicious JAVA child process */
process.parent.name : "java" and
process.name : ("sh",
"bash",
"dash",
"ksh",
"tcsh",
"zsh",
"curl",
"perl*",
"python*",
"ruby*",
"php*",
"wget")] by process.parent.pid
使用 Endgame 流式传输事件时的检测规则
sequence by agent.id with maxspan=1m
[network where event.category == "network" and
process.name : "java" and
/*
outbound connection attempt to
LDAP, RMI or DNS standard ports
by JAVA process
*/
destination.port in (1389, 389, 1099, 53, 5353)] by process.pid
[process where event.type == "start" and
/* Suspicious JAVA child process */
process.parent.name : "java" and
process.name : ("sh",
"bash",
"dash",
"ksh",
"tcsh",
"zsh",
"curl",
"perl*",
"python*",
"ruby*",
"php*",
"wget")] by process.parent.pid
此检测规则会查找到 LDAP、RMI 和 DNS 标准端口的出站连接尝试(经常被最近观测到的 JAVA/JNDI 注入攻击滥用),后跟同一 Java 进程实例的子进程。
现在,让我们演示这个规则如何检测对 log42j 漏洞的利用:
上面的屏幕截图显示了攻击者通过 base-64 编码的有效负载利用该漏洞,目标是 Christophe Tafani-Dereeper 创建的易受攻击的示例应用程序。
此屏幕截图显示了在 Elastic Security 中检测到对 CVE-2021-44228 的主动利用,其中详细说明了利用的告警和时间线视图。
上面的屏幕截图显示在检测告警的调查中,Java 执行了一个 shell 脚本来下载并运行 bash 脚本。
更新:检测和猎捕方面的改进
通过 Java 执行可疑的 Shell 命令
根据观测到的通过 log4j 漏洞利用提供服务的公开已知恶意 Java 类,您可以猎捕可疑的 shell 脚本和入口工具传输命令:
process where event.type == "start" and
process.parent.name : "java*" and
/* Ingress tools transfer via common shell command interpreters */
/* linux or macos */
(
(process.name : ("sh", "bash", "python*") and
process.command_line : ("*curl*|*sh*", "*wget*|*bash", "*curl*|*bash*", "*curl*|*bash*", "*http*|*sh*", "*python*http*")) or
/* windows */
(process.name : ("powershell.exe", "pwsh.exe", "cmd.exe") and
process.command_line : ("*.downloadstring*", "*.downloadfile*", "*.downloaddata*", "*BitsTransfer*", "* -enc*", "* IEX*", "*wp-content*", "*wp-admin*", "*wp-includes*", "*$*$*$*$*$*", "*^*^*^*^*^*^*^*^*^*", "*.replace*", "*start-process*", "*http*", "*cmd*powershell*")))
通过 JAVA 执行不受信任的文件
识别 JAVA 解释器何时创建了可执行文件 (PE/ELF) 并随后执行了该文件。
使用终端数据时的检测规则
sequence by host.id with maxspan=5m
[ file where event.type != "deletion" and
process.name : ("java", "java.exe", "javaw.exe") and
(file.extension : ("exe", "com", "pif", "scr") or
/* Match Windows PE files by header data (MZ) */
file.Ext.header_bytes : ("4d5a*", "7f454c46*")) and
not file.path : ("?:\\Program Files\\*",
"?:\\Program Files (x86)\\*") ] by file.path
[ process where event.type == "start" and
not process.code_signature.trusted == true ] by process.executable
sequence by agent.id with maxspan=5m
[ file where event.type != "deletion"
process.name : ("java", "java.exe", "javaw.exe")] by file_path
[ process where event.type == "start" and
not process.code_signature.trusted == true] by process_path
潜在的 CoinMiner 活动
使用加密货币矿工通用的命令行流程(大多数观测到的利用 log4j 漏洞的活动是 coinminers):
process where event.type == "start" and
process.command_line :
("* pool.*", "*-u*--coin*", "*.xmr.*", "*.xmr1.*",
"*stratum*", "*elitter.net*", "*cryptonight*",
"*-a scrypt*", "*stratum1*", "*-userpass*", "*-max-cpu-usage*",
"*qhor.net*", "*-wallet*pool*", "*--donate-level*", "*supportxmr.com*")
社区检测
许多讨论该漏洞广泛利用的社区成员,都发表过一些早期检测方法的见解,分析人员可以利用这些见解来确定他们使用的系统是否已被利用或正在被主动利用:
- GreyNoise 团队分享了一系列有效负载,包括包含编码和解码变体的有效负载,供分析人员探索存储在其系统中的日志。其中还补充了试图利用该漏洞的初始标记 IP 列表。
- Nextron Systems 的 Florian Roth 使用 grep/zgrep 提供了一系列针对本地利用的检查,同时在其 Github 帐户上列出了 Gist 中的一些初始 YARA 签名。Florian 还分享了一种生成 Thinkst CanaryTokens 的方法,可用于对您可能所管理系统的可利用性进行测试。
- Rob Fuller (Mubix) 在此处分享了此框架易受攻击版本的已知文件哈希列表。
其他缓解策略
除了 Apache 团队关于部署 Log4j2 框架的最新已修补版本以进行更新的建议指导外,我们普遍建议采取一些缓解措施来防止漏洞利用:
- 建议尽快检查您的 Log4j 版本是否支持使用 JAVA_OPTS=-Dlog4j2.formatMsgNoLookups=true 执行 JVM,以禁用远程服务器的查找功能。这应该适用于版本 2.10.0 到 2.15.0。
- 为了防止易受攻击主机的横向移动,或通过网络进行利用,建议限制从潜在易受攻击系统到外部资源到受信应用程序和/或服务的连接。
代表 Elastic 安全向您表示感谢。
我们要感谢全球所有安全团队, 感谢他们在今天和整个周末的不懈努力,特别是 本博文中列出的各位。面对如此严重且普遍存在的漏洞, 安全社区的开放性和协作性对于保护所有用户 起到了至关重要的作用。我们想让大家知道,我们 与大家一路同行。
现有的 Elastic 安全可以 使用产品中的这些功能。如果您刚接触 Elastic 安全, 请查看我们的快速入门指南(助您快速入门的培训短视频),或者我们的免费基础知识培训课程。您随时可以开始使用 Elastic Cloud 的 14 天免费试用版。或者,您也可以免费下载 Elastic Stack 的自管型版本。
参考资料
https://www.lunasec.io/docs/blog/log4j-zero-day/
https://www.crowdstrike.com/blog/log4j2-vulnerability-analysis-and-mitigation-recommendations/
https://mbechler.github.io/2021/12/10/PSA_Log4Shell_JNDI_Injection/
https://www.greynoise.io/viz/query/?gnql=CVE-2021-44228