Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-40859 — Reproducer for CVE-2026-40859 — Apache Camel camel-netty-http / camel-vertx-http producer-side unsafe deserialization of HTTP response bodies (RCE) | Kitploit
도구/GitHubGitHub/oscerd/cve-2026-40859
Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationPapers & ResearchLearning & EducationPayload DevelopmentBinary Exploitation
GitHuboscerd/cve-2026-40859

CVE-2026-40859

Reproducer for CVE-2026-40859 — Apache Camel camel-netty-http / camel-vertx-http producer-side unsafe deserialization of HTTP response bodies (RCE)

저장소 보기
1개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

camel-netty-http / camel-vertx-http HTTP-응답 안전하지 않은 역직렬화 재현기 (CVE-2026-40859)

이 프로젝트는 Apache Camel의 camel-netty-http 및 camel-vertx-http 컴포넌트에서 Java 역직렬화 취약점을 시연하며, CVE-2026-40859로 추적됩니다. 프로듀서 엔드포인트가 transferException=true(또는 컴포넌트 레벨 allowJavaSerializedObject=true)로 구성된 경우, 백엔드 HTTP 응답이 실패 상태이고 Content-Type: application/x-java-serialized-object를 가질 때, 본문이 raw java.io.ObjectInputStream으로 역직렬화되며 ObjectInputFilter가 없습니다. Camel 프로듀서가 통신하는 백엔드를 제어하는 공격자(손상된 서비스 또는 일반 HTTP 연결에 대한 중간자 공격)는 조작된 직렬화 객체를 반환할 수 있으며, 가젯 체인이 클래스패스에 있으면 Camel 호스트에서 원격 코드 실행을 달성할 수 있습니다.

권고: https://camel.apache.org/security/CVE-2026-40859.html

취약점 요약

기본 구성에서는 악용 불가능 — transferException의 기본값은 false입니다. PoC는 이를 활성화하며, 이는 원격 예외 전파를 원하는 애플리케이션이 할 수 있는 동작입니다.

기술적 세부 사항

비 2xx 응답에서 netty-http 프로듀서(throwExceptionOnFailure=true, 기본값)는 populateNettyHttpOperationFailedException을 통해 응답에서 예외를 생성합니다. transferException이 켜져 있고 응답이 직렬화된 객체 콘텐츠 유형을 전달하면 본문을 역직렬화합니다:

root@kitploit:~
// NettyHttpHelper.populateNettyHttpOperationFailedException(...) - 영향받는 버전
if (transferException) {
    String contentType = response.headers().get(NettyHttpConstants.CONTENT_TYPE);
    if (NettyHttpConstants.CONTENT_TYPE_JAVA_SERIALIZED_OBJECT.equals(contentType)) {   // application/x-java-serialized-object
        InputStream is = exchange.getContext().getTypeConverter().convertTo(InputStream.class, response);
        if (is != null) {
            Object body = deserializeJavaObjectFromStream(is);   // <-- 싱크
            if (body instanceof Exception) {
                return (Exception) body;
            }
        }
    }
}

// NettyHttpHelper.deserializeJavaObjectFromStream(InputStream) - 영향받는 버전
ObjectInputStream ois = new ObjectInputStream(is);   // ObjectInputFilter 없음
answer = ois.readObject();                            // 여기서 가젯 실행

가젯은 readObject() 내부에서 실행되며, instanceof Exception 검사 이전에 실행되므로 페이로드가 반드시 예외일 필요는 없습니다. camel-vertx-http는 VertxHttpHelper.deserializeJavaObjectFromStream에 동일한 싱크가 있습니다.

피해자 라우트

root@kitploit:~
from("direct:call")
    .to("netty-http://backend-host:PORT/path?transferException=true");
    // throwExceptionOnFailure의 기본값은 true

백엔드가 5xx + application/x-java-serialized-object로 응답하는 모든 프로듀서 호출은 싱크를 트리거합니다.

저장소 구조 — 공격자 vs 피해자

피해자는 Camel 프로듀서입니다(역직렬화를 수행). 공격자는 프로듀서가 호출하는 백엔드를 제어합니다. 이 자체 포함된 PoC에서는 두 역할이 동일한 JVM/컨테이너에서 실행됩니다: 임베디드 raw 소켓 HTTP 서버(MaliciousBackend)가 공격자가 제어하는 백엔드 역할을 하고, Camel 라우트(VictimRoute)가 피해자입니다.

root@kitploit:~
CVE-2026-40859/
├── pom.xml                 # camel-netty-http 4.18.2 + commons-collections 3.2.1 (가젯)
├── Dockerfile              # 앱 실행 (--add-opens 필요, 가젯 빌드에만 필요)
├── docker-compose.yml
├── README.md
└── src/main/
    ├── java/com/example/
    │   ├── Application.java
    │   ├── VictimRoute.java        # 피해자: netty-http 프로듀서, transferException=true
    │   ├── MaliciousBackend.java   # 공격자 백엔드: 500 + 직렬화 객체 본문 on :9999
    │   ├── Gadget.java             # CommonsCollections6 가젯, readObject() 중 실행
    │   └── ExploitController.java  # /exploit/attack이 프로듀서 호출 실행
    └── resources/
        └── application.properties

실제 공격에서는 직렬화된 바이트가 공격자에 의해 오프라인으로 생성됩니다(예: ysoserial 사용). 피해자만 가젯 체인을 클래스패스에 가지고 있으면 됩니다. 이 PoC는 편의를 위해 가젯을 프로세스 내에서 빌드하므로, JVM이 --add-opens java.base/java.util=ALL-UNNAMED 플래그로 시작됩니다. 이 플래그는 가젯 구성 세부 사항이며 취약점과는 무관합니다.

전제 조건

  • Java 17+ 및 Maven 3.8+
  • Docker (재현기 실행)

재현 단계

1단계: 컨테이너 빌드 및 시작

root@kitploit:~
mvn clean package -DskipTests
docker compose up -d --build

2단계: 역직렬화 트리거 (RCE)

root@kitploit:~
curl -s http://localhost:8080/exploit/attack
# -> 프로듀서가 ...NettyHttpOperationFailedException을 던짐 (예상됨)
#
#    >>> RCE 증명 — /tmp/pwned 존재: true

3단계: 확인

root@kitploit:~
docker exec cve-2026-40859 ls -la /tmp/pwned

정리

root@kitploit:~
docker compose down

공격 벡터

transferException=true(또는 allowJavaSerializedObject=true)로 구성되고 공격자가 제어하거나 가로챌 수 있는 백엔드와 통신하는 모든 camel-netty-http / camel-vertx-http 프로듀서:

  • 암호화되지 않은(http://) 프로듀서 연결에 대한 중간자 공격이 응답을 대체합니다.
  • 손상되었거나 악의적인 백엔드 서비스가 조작된 응답을 직접 반환합니다.

악용 조건

  1. transferException=true(또는 컴포넌트 allowJavaSerializedObject=true)인 프로듀서.
  2. throwExceptionOnFailure=true (기본값).
  3. 5xx + application/x-java-serialized-object를 반환하는 공격자가 제어/가로챌 수 있는 백엔드.
  4. 클래스패스에 가젯 라이브러리 (여기서는 commons-collections:3.2.1).

권장 수정

4.14.8 / 4.18.3 / 4.20.0으로 업그레이드하세요. 수정 사항은 두 헬퍼에 기본 ObjectInputFilter 허용 목록(java.**;javax.**;org.apache.camel.**;!*)을 적용하고, 새로운 deserializationFilter 엔드포인트 옵션 또는 JVM 전체 -Djdk.serialFilter 시스템 속성을 통해 사용자 정의할 수 있습니다.

완화 조치

업그레이드 전까지:

  1. 신뢰할 수 없거나 네트워크 접근 가능한 백엔드와 통신하는 프로듀서에서 transferException=true / allowJavaSerializedObject=true를 활성화하지 마십시오.
  2. TLS (https) 를 사용하여 프로듀서 연결을 암호화하여 전송 중 응답이 대체되지 않도록 하십시오.
  3. 옵션이 필요한 경우 명시적 허용 목록을 설정하십시오: -Djdk.serialFilter=java.**;org.apache.camel.**;!*.
  4. 클래스패스에서 가젯 라이브러리를 제거하십시오(commons-collections 3.x 및 유사 라이브러리를 업그레이드/제거).

면책 조항

이 재현기는 공개적으로 공개되고 수정된 취약점에 대한 보안 연구 및 승인된 테스트 목적으로 제공됩니다. 명시적 허가 없이 시스템에 사용하지 마십시오.

도구 다운로드
속성값
컴포넌트camel-netty-http, camel-vertx-http (프로듀서 측)
영향받는 클래스org.apache.camel.component.netty.http.NettyHttpHelper#deserializeJavaObjectFromStream (및 VertxHttpHelper#deserializeJavaObjectFromStream)
CWECWE-502: 신뢰할 수 없는 데이터의 역직렬화
영향원격 코드 실행 (RCE)
전제 조건transferException=true (또는 allowJavaSerializedObject=true) + throwExceptionOnFailure=true (기본값) + 공격자가 제어하는 백엔드
영향받는 버전4.0.0부터 4.14.8 미만, 4.15.0부터 4.18.3 미만, 4.19.0부터 4.20.0 미만
수정된 버전4.14.8, 4.18.3, 4.20.0
JIRACAMEL-23324
보고자Venkatraman Kumar (Securin)