
CVE-2026-85243에 대한 실행 가능한 Spring Boot 및 Quarkus 개념 증명으로, Apache Camel camel-crypto-pgp 무결성 검증 다운그레이드와 그 수정 사항을 시연합니다.
PGP 데이터 형식의 unmarshal()이 메시지가 OpenPGP 대칭 암호화 무결성 보호 데이터 패킷을 사용한 경우에만 수정 감지 코드를 검증했던 Apache Camel 취약점에 대한 실행 가능한 개념 증명(PoC) 재현기입니다. 구형 대칭 암호화 데이터 패킷에는 그러한 코드가 없으며, OpenPGP의 CFB 모드는 그것 없이는 변조 가능하므로, 해당 레거시 패킷을 사용하는 메시지는 무결성 검사를 완전히 건너뛰었습니다. 패킷 유형은 메시지를 생성한 주체가 선택하기 때문에, 발신자 — 또는 전송 중에 메시지를 다시 작성할 수 있는 누구든 — 가 무결성 검사 적용 여부를 결정했습니다. 기존 integrity 옵션은 마샬링만 제어하며 복호화 측 대응 옵션이 없었으므로, 배포 환경은 수용하는 메시지에 무결성 보호를 요구할 수 없었습니다.
| 런타임 | 디렉터리 | 스택 |
|---|---|---|
| Camel Spring Boot | camel-spring-boot/ | Spring Boot 3.5.13 + camel-crypto-pgp 4.22.0 (영향받음; 4.22.1에서 수정됨) |
| Camel Quarkus | camel-quarkus/ | Quarkus 3.29.0 + camel-quarkus-crypto-pgp (Camel 4.15.0, 영향받음; 수정된 대조군 CQ 3.40.0 / Camel 4.22.1) |
두 모듈 모두 영향받는 동작 및 수정된 동작을 보여줍니다.
익스플로잇 드라이버는 integrity=false로 암호화하여 레거시 패킷으로 PGP 메시지를 생성하는 발신자(또는 중개자) 역할을 합니다 — 결과 암호문에는 수정 감지 코드가 없습니다. 그런 다음 해당 메시지를 비밀 키로 복호화하는 라우트에 전달합니다.
BENIGN-PGP-PAYLOAD-MARKER-5E1F)이 반환됩니다 — 발신자가 레거시 패킷을 선택했기 때문에 무결성 검사가 완전히 건너뛰어졌습니다. 배포 환경은 검증할 수 없는 암호문을 수용했습니다.PGPException과 함께 메시지를 거부합니다 — "PGP message is not integrity protected…" — 새 requireIntegrityProtection 옵션이 기본값 true이기 때문입니다.키링(pubring.gpg, secring.gpg, 사용자 ID와 비밀번호 모두 sdude)은 Apache Camel 자체의 camel-crypto-pgp 테스트에서 가져온 공개 RSA-2048 테스트 픽스처입니다 — 비활성 자료이며, 왕복 테스트가 자체 포함되도록 번들로 제공됩니다.
# Camel Spring Boot
cd camel-spring-boot
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected: legacy message decrypts; >>> PROVEN
docker compose down
# Patched control
mvn clean package -Dcamel.version=4.22.1
java -jar target/cve-2026-85243-crypto-pgp-integrity-downgrade-0.0.1-SNAPSHOT.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rejected "not integrity protected"; >>> Not exploited
# Camel Quarkus
cd camel-quarkus
mvn clean package
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack # affected (Camel 4.15.0): legacy message decrypts
docker compose down
# Patched control: CQ 3.40.0 ships Camel 4.22.1
mvn clean package -Dcamel-quarkus.version=3.40.0 -Dquarkus.platform.version=3.40.0
java -jar target/quarkus-app/quarkus-run.jar &
curl -s http://localhost:8080/exploit/attack # fixed: rejected "not integrity protected"
| 속성 | 값 |
|---|---|
| 구성 요소 | camel-crypto-pgp (PGPKeyAccessDataFormat.unmarshal) |
| CWE | CWE-354 (무결성 검사 값의 부적절한 검증) |
| 심각도 | MEDIUM |
| 공격 벡터 | 레거시 대칭 암호화 데이터 패킷(수정 감지 코드 없음)으로 생성된 메시지 |
| 영향 | 무결성 검증 다운그레이드: 발신자/중개자가 무결성 검사 실행 여부를 결정하며, 변조 가능한 암호문이 검증 없이 수용됨 |
| 영향받는 버전 | 4.0.0부터 4.18.5 이전, 4.19.0부터 4.22.1 이전 |
| 수정된 버전 | 4.18.5, 4.22.1, 4.23.0 |
| JIRA | CAMEL-24441 |
| 크레딧 | Claude Security Scan Tool |
권고문: https://camel.apache.org/security/CVE-2026-85243.html
PGPKeyAccessDataFormat.unmarshal은 requireIntegrityProtection
옵션(기본값 true)을 추가합니다. 메시지가 무결성 보호 패킷이 아니고 해당 옵션이 활성화된 경우, unmarshal은
이제 복호화하는 대신 PGPException("PGP message is not integrity protected…")을 발생시킵니다. 참고로
signatureVerificationOption은 여전히 기본값이 optional이므로 서명이 없는 메시지는 여전히 수용됩니다. 이 두
옵션이 함께 작용해야 복호화된 메시지가 기밀성뿐 아니라 진정성까지 갖추게 됩니다. 레거시 패킷을 여전히 내보내는
발신자와 상호 운용해야 하는 경우에만 requireIntegrityProtection=false로 설정하고, 복호화된 콘텐츠를 인증되지
않은 것으로 취급하십시오.
무결성 보호 패킷을 사용하지 않는 메시지가 데이터 포맷에 도달하기 전에 거부하십시오(예: unmarshal 앞의
프로세서에서 OpenPGP 패킷 헤더를 검사).
이 저장소는 교육 및 방어 목적으로 게시됩니다: Apache Camel 사용자가 취약점을 이해하고, 영향을 받는지 확인하며, 업그레이드가 문제를 해결하는지 검증할 수 있도록 돕기 위함입니다. 키링과 평문은 무해한 공개 테스트 픽스처입니다. 소유하거나 운영하지 않는 시스템에 이 자료를 사용하지 마십시오.