不能直接全盘扫描,因会遍历/proc、/sys等不可读路径导致报错或I/O阻塞,且命中大量非运行时干扰项;应限定常见部署路径并跳过虚拟文件系统,再通过MANIFEST.MF提取版本号精准识别2.0-beta9至2.17.0脆弱版本。

直接用 find 配合 grep 就能快速定位,但必须加路径限制和版本过滤,否则扫到大量误报或卡死
为什么不能直接 find / -name "log4j-core-*.jar"
全盘扫描会遍历 /proc、/sys、挂载的 NFS/CIFS、Docker overlay2 临时层等不可读或无意义路径,轻则报错刷屏,重则导致系统响应变慢甚至 I/O 阻塞。更关键的是,它会命中大量非 Java 应用的干扰项(比如某些 IDE 缓存、旧构建产物、废弃容器镜像层),而真正要关注的是运行时实际加载的 JAR。
- 优先限定在常见部署路径:
/opt、/usr/share、/var/lib、/app、/home/*/{app,project} - 跳过虚拟文件系统:
-path "/proc" -prune -o -path "/sys" -prune -o -path "/dev" -prune - 用
-type f确保只查文件,避免目录名巧合匹配
怎么确认找到的 jar 是脆弱版本(2.0-beta9 到 2.17.0)
光看文件名不保险——有人会手动改名(如 log4j-core-2.14.1-patched.jar),也有人打包时没带版本号(如 log4j-core.jar)。必须进包里读 META-INF/MANIFEST.MF 或检查类是否存在。
- 读取版本号最准:
unzip -p "$jar" META-INF/MANIFEST.MF 2>/dev/null | grep "Implementation-Version" - 快速判断是否含漏洞核心类(适用于 ≥2.10 版本):
jar tf "$jar" | grep -q "org/apache/logging/log4j/core/lookup/JndiLookup.class" - 注意:2.17.1+ 已移除该类;2.12.4 和 2.3.2 是降级兼容方案,也要单独识别
一个实操可用的单行命令(带路径过滤和版本粗筛)
把下面这行复制粘贴执行,它不会扫全盘,但覆盖了 95% 的真实风险位置:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
find /opt /usr/share /var/lib /app /home -path "/proc" -prune -o -path "/sys" -prune -o -path "/dev" -prune -o -type f -name "log4j-core-*.jar" -print0 | while IFS= read -r -d '' jar; do ver=$(unzip -p "$jar" META-INF/MANIFEST.MF 2>/dev/null | grep "Implementation-Version" | cut -d' ' -f2- | tr -d '\r'); if [[ "$ver" =~ ^[0-9]+(\.[0-9]+)* ]]; then echo "$jar $ver"; fi; done | awk '$2 >= "2.0" && $2 <= "2.17.0" {print}'说明:awk 做字符串比较是可行的,因为版本号格式规整(如 "2.14.1" > "2.10" 在字典序上成立),但无法处理 "2.17.1" 这种三位小数——所以它只做粗筛,后续仍需人工验证或补查 JndiLookup.class。
容器环境要额外查镜像层和运行中容器
宿主机上找不到,不代表没风险。很多服务跑在容器里,JAR 包藏在镜像 layer 或容器 rootfs 中。
- 查本地镜像:
docker image ls --format "{{.ID}}" | xargs -I{} sh -c 'echo {}; docker image inspect {} | grep -i log4j' - 查运行中容器的文件系统:
docker ps -q | xargs -I{} sh -c 'echo "Container: {}"; docker exec {} find /app /lib /opt -name "log4j-core-*.jar" 2>/dev/null' - 更彻底的做法:用
skopeo拉取镜像 tar 并解压后扫描,但需要提前准备存储空间
真正容易被忽略的是那些“没启动但已部署”的容器镜像——它们可能长期躺在 registry 或本地磁盘上,没人清理,却随时可能被拉起并暴露漏洞。

















