
Log4Shell (CVE-2021-44228) 취약점 완화 조치를 시험해볼 수 있는 놀이터
치명적인 log4j (일명 Log4Shell) (CVE-2021-44228) 취약점 완화 방안을 실험하기 위한 놀이터입니다.
이 특정 문제는 JndiLookup 기능과 log4j가 로깅 호출의 모든 인수를 해석하는 기능에 있습니다.
형식 메시지(로깅 호출의 첫 번째 인수), 예를 들어 log.info("Hello {}", "${jndi:ldap://127.0.0.1:8081}")에서 Hello {}만 해석할 것으로 예상했지만, 모든 인수를 해석합니다.
완화 방안은 log4j가 jndi 조회를 트리거하지 못하게 하지만, ${java:version}과 같은 다른 조회는 여전히 허용합니다.
참고: log4j 2.16.0 (LOG4J2-3211; diff)부터 형식 메시지는 더 이상 해석되지 않습니다.
이 취약점은 대상 애플리케이션이 사용자가 제공한 데이터를 로깅할 때 원격으로 트리거될 수 있습니다. 예를 들어, 다음과 같은 일반적인 HTTP 헤더에서 발생합니다:
AcceptCookieLocationOriginRefererUser-AgentX-Api-VersionX-Forwarded-ForX-Forwarded-HostX-Requested-With빌드:
sudo apt-get install -y openjdk-11-jdk-headless
wget https://archive.apache.org/dist/logging/log4j/2.10.0/apache-log4j-2.10.0-bin.tar.gz
wget https://archive.apache.org/dist/logging/log4j/2.16.0/apache-log4j-2.16.0-bin.tar.gz
tar xf apache-log4j-2.10.0-bin.tar.gz
tar xf apache-log4j-2.16.0-bin.tar.gz
javac -Werror -cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar Server.java
취약한 log4j 버전 시도:
java \
-cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar:apache-log4j-2.10.0-bin/log4j-core-2.10.0.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
클래스패스에서 JndiLookup 클래스를 제거하는 완화 방법 시도:
cp apache-log4j-2.10.0-bin/log4j-core-2.10.0.jar log4j-core-2.10.0-without-jndi-lookup.jar
zip -q -d log4j-core-2.10.0-without-jndi-lookup.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
java \
-cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar:log4j-core-2.10.0-without-jndi-lookup.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
환경 변수 완화 방법 시도:
참고 2021년 12월 15일 (약 log4j 2.16.0 / CVE-2021-45046 릴리스 날짜) 이후로 이 방법은 더 이상 권장되지 않습니다.
LOG4J_FORMAT_MSG_NO_LOOKUPS=true \
java \
-cp apache-log4j-2.10.0-bin/log4j-api-2.10.0.jar:apache-log4j-2.10.0-bin/log4j-core-2.10.0.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
취약하지 않은 log4j 버전 시도:
java \
-cp apache-log4j-2.16.0-bin/log4j-api-2.16.0.jar:apache-log4j-2.16.0-bin/log4j-core-2.16.0.jar:. \
Server
curl -H 'X-Api-Version:${jndi:ldap://127.0.0.1:8081}' http://localhost:8080
curl -H 'X-Api-Version:${java:version}' http://localhost:8080
grype를 사용하여 취약점을 탐지하는지 확인:
wget https://github.com/anchore/grype/releases/download/v0.27.2/grype_0.27.2_linux_amd64.tar.gz
tar xf grype_0.27.2_linux_amd64.tar.gz grype
./grype dir:.
trivy를 사용하여 취약점을 탐지하는지 확인:
wget https://github.com/aquasecurity/trivy/releases/download/v0.21.2/trivy_0.21.2_Linux-64bit.tar.gz
tar xf trivy_0.21.2_Linux-64bit.tar.gz trivy
./trivy fs --security-checks vuln .