更新于 2021年12月19日:Log4j 中不断发现新的漏洞及利用方式。我们在 git 仓库中添加了三个流程图(思维导图),分别描述 Log4j 的易受攻击版本、如何检查是否易受攻击 以及 针对不同漏洞的缓解措施。
识别使用 Log4j 2.x 版本的软件
缓解 Log4j 中的漏洞
如果上述操作不可行
Pattern Layouts 里的 Context Lookups识别使用 Log4j 1.x 版本的软件。
如果企业中使用了 Log4j 1.x 版本,请与供应商沟通并要求其
Log4j 漏洞中最大的恶狼。当 Log4j 记录字符串 ${jndi:ldap://\<攻击代码>/a} 的变体时,漏洞被利用。CVSS 10.0,远程代码执行(RCE)。
不如 CVE-2021-44228 严重,但同样危险。需要 Log4j 的非标准配置。CVSS 9.0,远程代码执行(RCE)和拒绝服务(DoS)。
不如 CVE-2021-44228 严重,危险性也稍低。CVSS 7.5,拒绝服务(DoS)。
仅影响 Log4j 1.x 版本。需要 Log4j 使用 JMSAppender。CVSS 6.6,远程代码执行(RCE) 利用条件:Log4j 使用 JMSAppender。要么直接配置了 JMSAppender(这很不常见),要么攻击者自行将其添加到 Log4j 配置中。 此外,攻击者必须有权修改 JMSAppender 的配置。如果满足此条件,攻击者通常已经拥有系统访问权限。因此,该漏洞被认为不太相关。
仅影响 Log4j 1.x 版本。需要 Log4j 使用 SocketServer。CVSS 9.8,远程代码执行(RCE) 允许具有网络访问权限的攻击者通过对应套接字执行代码。利用代码已公开可用。
对于 Java 8,Log4j 2.17.0 是最新版本,它缓解了上述所有漏洞。
版本 2.16.0 缓解了最严重的漏洞。
对于 Java 7,Log4j 发布了 2.12.2 版本。该版本不能缓解 CVE-2021-45105。Log4j 团队表示 Java 6 和 Java 7 均已不再受支持。他们是否还会为 Java 7 提供额外的 Log4j 安全更新尚不确定。
流程图“Mind map #1”清晰概述了是否存在各漏洞的条件。

由 Loïc Castel 制作。来自 github。
部分挑战在于,并非直接暴露在互联网上的服务器才易受攻击。漏洞可能存在于“链条”更后端的服务器中,该服务器接收相同数据并记录下来。这可能使得确定哪些系统已暴露、哪些未暴露变得困难。
流程图“Mind map #2”清晰概述了如何检查自身系统是否存在这些漏洞。
由 Loïc Castel 制作。来自 github。


- User-agent
- 搜索字段
- 用户名
- ...
4. 跟踪蜜罐命中并找出 log4j 运行的位置。
以下命令扫描所有磁盘,包括映射的网络驱动器:
Get-PSDrive -PSProvider FileSystem | foreach {(gci ($_.Root) -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path)}
参考:https://twitter.com/0gtweet/status/1469661769547362305
如果只想检查本地磁盘:
Get-CimInstance win32_volume | Where-Object { $_.DriveType -eq 3 -and $_.DriveLetter -ne $null} | ForEach-Object {(gci ($_.DriveLetter+"\") -rec -force -include *.jar -ea 0 | foreach {select-string "JndiLookup.class" $_} | select -exp Path)}
参考:https://twitter.com/webmastir/status/1470386184052486155?s=20
如果还想检查计算机的事件日志:
Get-WinEvent -ListLog * |
foreach { get-winevent @{logname=$_.logname; } -ea 0 } |
where message -match 'jndi'
#!/bin/bash
find / -name '*log4j*.jar' -print0 2>/dev/null -print0 | while read -d $'\0' log4j; do
echo -en "${log4j}: "$(unzip -p "${log4j}" | strings | grep -Po '^Implementation-Version:\s+([0-9\.]+)' | awk '{ print $NF }')"\n"
done
exit 0
以 root 身份运行
lsof | grep log4j-core
流程图“Mind map #3”概述了缓解措施的可能性。
由 Loïc Castel 制作。来自 github。
下面我们列出了一些用于执行缓解措施的资源。
将 Log4j 更新到 2.17.0 版本
将 Log4j 更新到 2.12.2 版本 注意:不能缓解 CVE-2021-45105
⚠️ 此方法不再被认为是完全修复方案,因为它不能在所有情况下缓解所有漏洞。
[Environment]:https://raw.githubusercontent.com/helsecert/cve-2021-44228/main/:SetEnvironmentVariable(%22LOG4J_FORMAT_MSG_NO_LOOKUPS%22,%22true%22,%22Machine%22)
注意:需要重启
来自 https://twitter.com/CyberRaiju/status/1469505680138661890
"‐Dlog4j2.formatMsgNoLookups=True"
命令行示例:
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" teku --network mainnet
或者与 -Xmx 值一起使用:
JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true -Xmx4g" teku
Systemd 配置示例:
Environment='JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true"'
或者与 -Xmx 值一起使用:
Environment='JAVA_OPTS="-Dlog4j2.formatMsgNoLookups=true" "-Xmx4g'
此设置在应用程序重启时加载 来自 https://github.com/ConsenSys/teku/security/advisories/GHSA-mwfw-vm54-g3p7
jar 文件是一个归档文件(zip 文件),可以打开。然后可以删除文件。此操作可以使用 7-zip 等工具手动完成(见图),或通过脚本完成。
需要重启应用程序
参考:https://mogwailabs.de/en/blog/2021/12/vulnerability-notes-log4shell/9

[Reflection.Assembly]:https://raw.githubusercontent.com/helsecert/cve-2021-44228/main/:LoadWithPartialName(%27System.IO.Compression%27)
$JarFilLokasjon = 'C:\temp\log4j-core-2.13.0-test.jar'
$Filnavn = 'JndiLookup.class' #此文件将被删除!
$Stream = New-Object IO.FileStream($JarFilLokasjon, [IO.FileMode]::Open)
$ZipMode = [IO.Compression.ZipArchiveMode]::Update
$Zip = New-Object IO.Compression.ZipArchive($stream, $ZipMode)
($zip.Entries | Where-Object { $Filnavn -contains $_.Name }) | ForEach-Object { $_.Delete() }
$zip.Dispose()
$stream.Close()
$stream.Dispose()
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
https://github.com/NCSC-NL/log4shell/tree/main/software
https://gist.github.com/SwitHak/b66db3a06c2955a9cb71a8718970c592