
컴파일된 Java 클래스(중첩된 아카이브 포함)를 분석하여 취약한 Log4J 버전(CVE-2021-44228, CVE-2021-45046)을 감지하는 파일 시스템 스캐너입니다. Linux, Windows, Mac에서 작동합니다.

취약한 Log4J 버전을 탐지하여 팀이 CVE-2021-44228 (심각), CVE-2021-45046, CVE-2021-45105, CVE-2021-44832에 대한 노출을 평가할 수 있도록 도와주는 스캐너입니다. 완전한 파일 시스템(설치된 모든 애플리케이션 포함)을 면밀히 조사하여 Log4J 인스턴스를 검색합니다. 여러 계층 깊이 숨겨진 Log4J 인스턴스도 찾을 수 있습니다. Linux, Windows, Mac 및 Java가 실행되는 모든 곳에서 작동합니다!
현재 log4j-core 2.3.2, 2.12.4, 2.17.1 버전을 _SAFE_로, 2.3.1, 2.12.2, 2.12.3, 2.15.0, 2.16.0, 2.17.0 버전을 _OKAY_로 보고하며, 다른 모든 버전은 _VULNERABLE_로 보고합니다(단, 2.0-beta9 미만은 _POTENTIALLY_SAFE_로 보고). 이전 log4j-1.x 버전은 _OLD_로 보고합니다.
실행 가능한 spring-boot jar/war, uber jar에 혼합된 의존성, shaded jar, 심지어 압축 풀린 상태로 파일 시스템에 있는 jar 파일(일명 *.class) 내의 log4j도 올바르게 탐지할 수 있습니다.
테스트를 위해 사용하는 log4j-samples 컬렉션을 유지 관리하고 있습니다.
java -jar log4j-detector-2021.12.29.jar ./samples
-- github.com/mergebase/log4j-detector v2021.12.29 (by mergebase.com) analyzing paths (could take a while).
-- Note: specify the '--verbose' flag to have every file examined printed to STDERR.
false-hits/log4j-core-2.12.2.jar contains Log4J-2.x == 2.12.2 _OKAY_
false-hits/log4j-core-2.12.3.jar contains Log4J-2.x == 2.12.3 _OKAY_
false-hits/log4j-core-2.12.4.jar contains Log4J-2.x == 2.12.4 _SAFE_
false-hits/log4j-core-2.15.0.jar contains Log4J-2.x == 2.15.0 _OKAY_
false-hits/log4j-core-2.16.0.jar contains Log4J-2.x == 2.16.0 _OKAY_
false-hits/log4j-core-2.17.0.jar contains Log4J-2.x == 2.17.0 _OKAY_
false-hits/log4j-core-2.17.1.jar contains Log4J-2.x >= 2.17.1 _SAFE_
false-hits/log4j-core-2.3.1.jar contains Log4J-2.x == 2.3.1 _OKAY_
false-hits/log4j-core-2.3.2.jar contains Log4J-2.x == 2.3.2 _SAFE_
true-hits/log4j-core-2.0-beta9.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
true-hits/log4j-core-2.10.0.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.10.0.zip contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.11.0.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.11.1.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.11.2.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.12.0.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.12.1.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.14.0.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.14.1.jar contains Log4J-2.x >= 2.10.0 _VULNERABLE_
true-hits/log4j-core-2.2.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
true-hits/log4j-core-2.3.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
true-hits/log4j-core-2.4.1.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
true-hits/log4j-core-2.4.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
true-hits/log4j-core-2.9.1.jar contains Log4J-2.x >= 2.0-beta9 (< 2.10.0) _VULNERABLE_
old-hits/log4j-1.1.3.jar contains Log4J-1.x <= 1.2.17 _OLD_
old-hits/log4j-1.2.17.jar contains Log4J-1.x <= 1.2.17 _OLD_
old-hits/log4j-core-2.0-beta2.jar contains Log4J-2.x <= 2.0-beta8 _POTENTIALLY_SAFE_ (Did you remove JndiLookup.class?)
_VULNERABLE_ -> 이 파일을 업그레이드하거나 제거해야 합니다.
_OKAY_ -> Log4J 2.3.1, 2.12.2, 2.12.3, 2.15.0, 2.16.0, 2.17.0 버전에 대해 이 결과를 보고합니다. 2.17.1로 업그레이드할 것을 권장합니다.
_SAFE_ -> 현재 Log4J 2.3.2, 2.12.4, 2.17.1 (및 그 이상) 버전에 대해서만 이 결과를 보고합니다.
_OLD_ -> CVE-2021-44228로부터 안전하지만, Log4J 1.2.x는 7년 동안 EOL 상태이며 여러 알려진 취약점이 있으므로 업그레이드 계획을 세워야 합니다.
_POTENTIALLY_SAFE_ -> "JndiLookup.class" 파일이 존재하지 않습니다. Log4J 버전이 매우 오래되었거나(2.0-beta9 이전), 이미 누군가 이 파일을 제거했기 때문입니다. 만약 그렇다면 "JndiLookup.class"를 제거한 사람이 팀이나 회사 사람인지 확인하세요. 공격자가 손상된 시스템에 대한 추가 경쟁 공격자의 접근을 막기 위해 직접 이 파일을 제거하는 경우가 알려져 있기 때문입니다.
java -jar log4j-detector-2021.12.29.jar
Usage: java -jar log4j-detector-2021.12.29.jar [--verbose] [--json] [--stdin] [--exclude=X] [paths to scan...]
--json - Output STDOUT results in JSON. (Errors/warning still emitted to STDERR)
--stdin - Read STDIN for paths to explore (one path per line)
--exclude=X - Where X is a JSON list containing full paths to exclude. Must be valid JSON.
Example: --exclude='["/dev", "/media", "Z:\TEMP"]'
Exit codes: 0 = No vulnerable Log4J versions found.
1 = At least one legacy Log4J 1.x version found.
2 = At least one vulnerable Log4J version found.
About - MergeBase log4j detector (version 2021.12.29)
Docs - https://github.com/mergebase/log4j-detector
(C) Copyright 2021 Mergebase Software Inc. Licensed to you via GPLv3.
git clone https://github.com/mergebase/log4j-detector.git
cd log4j-detector/
mvn install
java -jar target/log4j-detector-latest.jar
log4j 샘플 컬렉션을 이곳에서 유지 관리합니다: https://github.com/mergebase/log4j-samples
GPL 버전 3.0
Java 컴파일러는 String 리터럴을 컴파일된 *.class 파일에 직접 저장합니다. log4j-detector가 파일 시스템에서 "JndiManager.class"라는 이름의 파일을 감지하면, 해당 파일에서 "Invalid JNDI URI - {}" 문자열을 찾습니다. 이 특정 String 리터럴은 패치된 Log4J 버전(2.15.0)에만 존재하는 것으로 밝혀졌습니다. 해당 문자열이 없는 모든 Log4J 버전은 취약합니다.
*.class 파일에서 String 리터럴을 검사하는 이 동일한 기법은 안전한 버전 2.3.2, 2.12.4, 2.17.1을 정확하게 탐지하도록 더 확장되었습니다.
log4j-core 라이브러리만 적중합니다. log4j-api는요? 많은 스캐너(GitHub 자체 Dependabot 포함)가 현재 "log4j-core"와 "log4j-api" 라이브러리 모두를 취약하다고 보고합니다. 이 스캐너들은 잘못되었습니다. 현재 "log4j-api" 라이브러리 중 이러한 취약점에 의해 악용될 수 있는 버전은 존재하지 않습니다.
MergeBase에서는 스캔 정확성을 자랑스럽게 생각합니다. 시스템을 패치하고 방어하는 것만으로도 충분히 바쁘십니다. 가양성(false positive)으로 시간을 낭비하게 하고 싶지 않습니다. 그렇기 때문에 log4j-api에 대한 적중 결과는 보고하지 않습니다.
버전 2.10.0은 Log4J의 취약한 "메시지 조회 기능"을 Log4J 구성을 통해 비활성화할 수 있는 첫 번째 버전이기 때문에 중요합니다.
버전 2.12.2는 CVE-2021-44228에 취약하지 않은 Java 7 호환 Log4J 버전이기 때문에 중요합니다.
버전 2.15.0과 2.16.0은 Log4J의 기본 구성을 변경하지 않은 상태에서 CVE-2021-44228에 취약하지 않은 첫 번째 버전이기 때문에 중요합니다.
그리고 버전 2.3.2, 2.12.4, 2.17.1은 최근에 발견된 CVE-2021-45046 및 CVE-2021-45105와 같은 CVE에 취약하지 않기 때문에 중요합니다. 이것들이 훨씬 덜 심각한 취약점임에도 불구하고, 모든 사람이 2.3.2, 2.12.4, 2.17.1 중 하나로 패치하기를 원할 것으로 예상합니다.
"!" 기호는 log4j-detector가 zip 아카이브(예: *.zip, *.ear, *.war, *.aar, *.jar)에 진입했음을 의미합니다. zip 파일은 zip 파일을 포함할 수 있으므로, 하나의 결과에 "!" 표시가 두 개 이상 포함될 수 있습니다.
참고: log4j-detector는 zip 아카이브만 재귀적으로 진입합니다. tar, gz, bz2 등에는 진입하지 않습니다. 주된 이유는 Java 시스템이 종종 jar 내부의 jar를 실행하도록 구성되지만, 다른 파일 형식을 실행하도록 구성되는 경우는 없기 때문입니다(알려진 바에 따르면!). 따라서 *.tar.gz 내부의 log4j 복사본은 실행 중인 Java 시스템에서 접근할 수 없을 가능성이 높으므로 보고할 가치가 있는 취약점이 아닙니다.
두 번째 참고: zip 내부의 zip의 경우, 스캐너는 내부 zip을 스캔하기 전에 완전히 메모리(ByteArrayInputStream 사용)에 로드합니다. 시스템에 매우 큰 내부 zip(예: 1GB 이상)이 있는 경우 Java에 추가 메모리를 할당해야 할 수도 있습니다.
Log4J 2.x 버전(2.0-beta9에서 2.14.1까지)만 CVE-2021-44228에 취약합니다.
좋은 질문입니다! 여기 Github에 전체 소스 코드(Java 2500줄)와 빌드 단계를 포함하고 있으며, 이 도구는 의존성이 전혀 없으므로 코드를 충분히 주의 깊게 연구하는 데 시간이 많이 걸리지 않을 것입니다. Maven을 신뢰하지 않는다면 "src/main/java/com/mergebase/log4j" 디렉토리로 직접 이동하여 "javac *.java"를 입력하세요. 그것도 작동합니다!
또한 저장소 루트(./log4j-detector-2021.12.29.jar)에 있는 사전 컴파일된 jar를 MergeBase 코드 서명 키로 서명했습니다. 확인을 위해 "jarsigner -verbose -verify log4j-detector-2021.12.29.jar"를 실행해 주십시오.

MergeBase는 캐나다 밴쿠버에 기반을 둔 SCA(Software Composition Analysis) 회사입니다. Snyk, Sonatype, Blackduck 등과 유사하게 소프트웨어의 취약한 오픈 소스 라이브러리를 탐지하고 관리하는 데 도움을 줍니다. 확인해 보세요! 뛰어난 정확성, 훌륭한 언어 지원, 그리고 가격도 너무 비싸지 않습니다: mergebase.com/pricing.
누구든지 SCA 제품의 2주 무료 평가판을 사용해 보시면 기쁠 것입니다! 그리고 저희 CEO([email protected])에게 제목에 "log4j-detector"를 포함하여 이메일을 보내시면 무료 평가판을 4주로 연장해 드립니다.