
디스크 및 Java 아카이브 파일 내에서 취약한 Log4j2 버전을 찾습니다 (Log4Shell CVE-2021-44228, CVE-2021-45046, CVE-2021-45105)
파일시스템을 스캔하여 Log4Shell(CVE-2021-44228 & CVE-2021-45046 & CVE-2021-45105)에 취약한 Log4j2를 찾는 Python3 스크립트입니다. 디스크와 Java 아카이브 파일(JAR) 내부(중첩 포함)를 재귀적으로 스캔합니다.

log4j-finder는 log4j2-core-* 패키지에 포함된 특정 파일(현재는 JndiManager.class만 해당)의 알려진 나쁜 및 알려진 좋은 MD5 해시 목록을 사용하여 파일시스템에서 log4j2 라이브러리를 식별합니다. log4shell의 영향을 받는 주요 패키지입니다. Java 아카이브 파일 내부와 파일시스템에서 이러한 파일을 검색합니다. 그런 다음 이 파일의 MD5 해시를 기반으로 log4j2 버전을 식별합니다.
스캔 속도를 최적화하기 위해 파일시스템에서 다음 파일 이름만 처리합니다:
Java ARchive 확장자가 있는 모든 파일(이러한 아카이브 내부 중첩 포함):
*.jar, *.war, *.earJndiManager.class파일이 위에 언급된 확장자 중 하나와 일치하면 이러한 아카이브 내부(모두 메모리에서 처리되며 압축 해제되지 않음)를 확인하여 스크립트가 알려진 해시를 가진 파일 이름을 검색합니다. 또한 중첩된 아카이브 내부도 확인합니다(예: WAR 파일 안의 JAR 파일).
이 스크립트는 7z, RAR, TAR, BZ2 등과 같은 다른 아카이브 파일 확장자는 스캔하지 않습니다. 예를 들어 JAR 파일이 7z 파일 안에 있으면 스크립트가 찾지 못합니다. 그 이유는 Java가 Java ARchive 형식만 로드할 수 있기 때문에 해당 형식만 스캔하기 때문입니다.
알 수 없는 MD5 해시는 UNKNOWN으로 표시됩니다. 이는 log4j2가 아닌 Java 패키지가 이 스크립트가 검색하는 동일한 파일 이름을 사용하는 경우 발생할 수 있습니다. 식별된 파일 경로에 org/apache/logging/log4j에 대한 참조가 포함되어 있지 않다면 log4j2일 가능성이 매우 낮습니다. 그래도 수동 확인을 권장합니다.
다음 방법 중 하나를 사용하여 log4j-finder를 설치할 수 있습니다:
운영 체제에 맞는 올바른 바이너리를 다운로드할 수 있습니다:
Linux를 사용하는 경우 다음 방법 중 하나로 최신 릴리스를 다운로드하여 실행할 수도 있습니다:
curl -L https://github.com/fox-it/log4j-finder/releases/latest/download/log4j-finder -o log4j-finder
chmod +x log4j-finder
sudo ./log4j-finder
wget https://github.com/fox-it/log4j-finder/releases/latest/download/log4j-finder -O log4j-finder
chmod +x log4j-finder
sudo ./log4j-finder
Python 3.6+가 설치된 배포의 경우 다음 방법 중 하나도 작동합니다:
curl -L https://github.com/fox-it/log4j-finder/raw/main/log4j-finder.py -o log4j-finder.py
sudo python3 log4j-finder.py
wget https://github.com/fox-it/log4j-finder/raw/main/log4j-finder.py
sudo python3 log4j-finder.py
git clone https://github.com/fox-it/log4j-finder
cd log4j-finder
sudo python3 log4j-finder.py
리포지토리에는 모든 커밋에서 PyInstaller를 사용하여 Windows 및 Linux 바이너리를 자동으로 생성하는 GitHub Action이 있습니다. 이 워크플로 실행의 빌드 아티팩트는 Releases 페이지에 첨부하는 데 사용됩니다.
일부 안티바이러스 공급업체가 Windows 바이너리를 좋아하지 않는다는 것을 인지하고 있습니다. 이러한 경우 다음 단계를 사용하여 직접 실행 파일을 생성하는 것이 좋습니다(이제 서명된 바이너리도 제공합니다).
Python 3.6 이상이 설치되어 있지 않으면 먼저 https://www.python.org/downloads/ 에서 다운로드하세요.
Python 3.8.10을 선택하세요:
Add Python 3.x to PATH를 선택해야 다음 단계가 훨씬 쉬워집니다.명령 프롬프트를 열고 pip를 사용하여 pyinstaller 패키지를 설치하세요:
pip install pyinstaller
# 출력에서 pyinstaller가 설치된 위치를 확인할 수 있습니다. 예:
# C:\Users\User\AppData\Roaming\Python\Python310\Scripts
#
# --version으로 확인
C:\Users\User\AppData\Roaming\Python\Python310\Scripts\pyinstaller.exe --version
4.7
선택적으로 colorama 패키지를 설치하여 색상 지원을 추가할 수 있습니다:
pip install colorama
최신 버전의 log4j-finder.py 스크립트를 다운로드한 후 PyInstaller를 실행하세요:
pyinstaller --onefile --hidden-import colorama log4j-finder.py
그러면 Windows 실행 파일이 dist 디렉토리에 생성됩니다: dist\log4j-finder.exe
Debian 11을 예시로 들면:
# pip3를 사용하여 PyInstaller 설치
sudo apt update
sudo apt install python3-pip git
pip3 install --user pyinstaller
# Git 클론 및 PyInstaller로 빌드
git clone https://github.com/fox-it/log4j-finder
cd log4j-finder
~/.local/bin/pyinstaller --onefile log4j-finder.spec
# 바이너리 작동 확인
./dist/log4j-finder --help
경로를 스캔하는 예시 (기본값은 /):
$ python3 log4j-finder.py /path/to/scan
또는 JAR 파일 직접 지정:
$ python3 log4j-finder.py /path/to/jarfile.jar
또는 여러 디렉토리 및/또는 파일:
$ python3 log4j-finder.py /path/to/dir1 /path/to/dir2 /path/to/jarfile.jar
파일 또는 디렉토리 제외:
$ python3 log4j-finder.py / --exclude "/*/.dontgohere" --exclude "/home/user/*.war"
Windows에서는 추가 인수를 지정하지 않으면 루트 c:\ 드라이브만 스캔합니다. 명령줄에서 스캔할 드라이브를 지정하는 것이 좋습니다(존재하지 않는 드라이브는 건너뜁니다):
log4j-finder.exe c:\ d:\ e:\ f:\
액세스할 수 없는 파일 또는 디렉토리(권한 거부 오류)는 출력되지 않습니다.
더 많은 출력을 보려면 -v 플래그(상세), 또는 -vv 플래그(디버그 모드, 디버깅 목적으로만 권장)를 사용할 수 있습니다.
애플리케이션 인수:
positional arguments:
PATH 스캔할 디렉토리 또는 파일(들) (재귀적) (기본값:
['/'])
optional arguments:
-h, --help 이 도움말 메시지를 표시하고 종료
-v, --verbose 상세 출력 (-v는 정보, -vv는 디버그) (기본값: 0)
-n, --no-color 색상 출력 비활성화 (기본값: False)
-q, --quiet 더 조용하게, 배너와 요약 비활성화 (기본값:
False)
-b, --no-banner 배너 비활성화 (기본값: False)
-V, --version 프로그램 버전 번호를 표시하고 종료
-e PATTERN, --exclude PATTERN
패턴으로 파일/디렉토리 제외 (여러 번 사용 가능) (기본값: None)
파일은 디스크와 (중첩된) Java 아카이브 파일 내에서 재귀적으로 스캔됩니다.