
CVE 재현: cve-2026-34486-tomcat_encrypt_bypass_reproduction
| 필드 | 값 |
|---|
| CVE | CVE-2026-34486 |
| CVSS | 7.5 HIGH |
| 유형 | 민감 데이터 암호화 누락 |
| 구성 요소 | Apache Tomcat Cluster EncryptInterceptor |
| 게시일 | 2026 |
CVE-2026-34486은 CVE-2026-29146의 불완전한 수정으로 인해 발생한 회귀입니다. Apache Tomcat의 클러스터 복제에서 EncryptInterceptor는 클러스터 메시지를 암호화하고 인증하는 역할을 담당합니다. CVE-2026-29146 수정 과정의 리팩토링으로 인해 super.messageReceived(msg) 호출이 실수로 복호화 실패를 처리하는 try-catch 블록 외부로 이동되었습니다. 그 결과, 메시지 복호화에 실패할 경우(즉, 인터셉터가 암호화된 데이터를 예상했지만 일반 텍스트로 수신된 경우), 원래 암호화되지 않은 메시지가 폐기되지 않고 핸들러 체인에 그대로 전달됩니다.
EncryptInterceptor.messageReceived() 메서드는 클러스터 메시지가 도착하면 호출됩니다. 예상되는 흐름은 다음과 같습니다:
super.messageReceived(msg)를 호출하여 복호화된 메시지 전달취약한 버전에서는 복호화/검증 로직이 여전히 try-catch로 감싸여 있지만, 호출 체인이 재구성되어 super.messageReceived(msg)가 복호화를 보호하는 try-catch 블록 외부에서 실행됩니다. 변수 msg는 try-catch 이전에 선언되고 내부에서 할당됩니다. 복호화가 예외를 발생시키면 msg는 초기 (암호화되지 않은/원시) 값을 유지하며, catch 블록은 오류만 기록할 뿐 조기 반환하지 않습니다. 실행은 처리되지 않은 원시 데이터와 함께 super.messageReceived(msg)로 계속 진행됩니다.
이는 Tomcat 클러스터 포트에 접근할 수 있는 공격자가 인터셉터가 수락하고 처리할 임의의 암호화되지 않은 메시지를 주입할 수 있음을 의미합니다.
public void messageReceived(Message msg) {
// msg arrives raw
try {
// decrypt and populate msg fields
decrypt(msg);
} catch (Exception e) {
log.error("Decryption failed", e);
// BUG: no return statement here
}
// msg is still the original unencrypted object when catch is hit
super.messageReceived(msg); // outside try-catch → passes raw data
}
수정 사항은 다음 중 하나를 보장해야 합니다:
super.messageReceived(msg)가 복호화 성공 후 try 블록 내에서만 호출되도록 하거나,| 제품 | 버전 |
|---|---|
| Apache Tomcat 11 | 11.0.20 |
| Apache Tomcat 10 | 10.1.53 |
| Apache Tomcat 9 | 9.0.116 |
EncryptInterceptor를 사용하는 클러스터 복제가 활성화된 취약한 Tomcat 인스턴스<Receiver>를 통해 구성된 4000 또는 5000)에 대한 네트워크 액세스server.xml에 EncryptInterceptor가 구성된 Tomcat 클러스터 멤버를 식별합니다.이 디렉토리의 exploit.py 스크립트는 우회를 시연합니다. 이 스크립트는 최소한의 Tomcat 클러스터 메시지(ClusterMessage 직렬화 형식 기반)를 구성하고 암호화 없이 수신기 포트로 직접 전송합니다. 취약한 인터셉터는 암호화가 누락되었음에도 불구하고 메시지를 수락하고 전달합니다.
패치된 버전의 Apache Tomcat으로 업그레이드하세요:
| 제품 | 패치 버전 |
|---|---|
| Apache Tomcat 11 | 11.0.21+ |
| Apache Tomcat 10 | 10.1.54+ |
| Apache Tomcat 9 | 9.0.117+ |
즉시 업그레이드가 불가능한 경우, Tomcat 클러스터 포트에 대한 네트워크 액세스를 신뢰할 수 있는 호스트로만 제한하십시오(예: 방화벽 규칙을 사용하거나 수신기를 루프백 또는 개인 인터페이스에 바인딩).