Conductor 인증 전 원격 코드 실행 취약점


요약
CVE-2026-58138은 Conductor의 워크플로 표현식이 호스트 접근 권한을 가진 GraalVM 컨텍스트에서 평가돼 발생하는 원격 코드 실행 취약점이다. 인증되지 않은 요청으로 자바스크립트 또는 파이썬 표현식을 전달해 Conductor 프로세스 권한으로 운영체제 명령을 실행할 수 있다.
OpenTaint는 2026-07-15에 Conductor 3.23.0의 요청 흐름과 재현 코드를 공개했다. 공개 CVE 정보는 3.21.21 이상 3.30.2 미만을 영향 범위로 명시하며, 3.30.2에서 평가기 권한이 제한됐다. FortiRecon은 2026-09-18에 악용 상태를 Yes로 분류했지만 공개 페이지에는 공격 주체나 침해 지표가 제시되지 않았다.
| 항목 | 내용 |
|---|---|
| 식별자 | CVE-2026-58138 |
| 취약점 유형 | 인증 전 원격 코드 실행, CWE-94 |
| 영향 버전 | 3.21.21 이상 3.30.2 미만 |
| 공격 경로 | 워크플로 시작 요청과 스크립트 평가 작업 |
| 취약 클래스 | ScriptEvaluator, PythonEvaluator |
| 관련 작업 | INLINE, LAMBDA, DO_WHILE, SWITCH |
| 수정 버전 | 3.30.2 |
| 악용 정보 | FortiRecon이 2026-09-18에 악용됨으로 분류 |
외부 노출과 실행 흔적을 함께 조사
워크플로 API가 외부에 노출됐다면 버전 확인만으로 조사를 끝내지 않는다. 워크플로 정의와 실행 이력, Conductor 프로세스의 자식 프로세스, 결과 데이터, 외부 통신을 같은 시간축에서 확인한다.
취약점 분석
Conductor 3.23.0의 POST /api/workflow는 StartWorkflowRequest를 받아 워크플로를 시작한다. 요청에는 워크플로 정의를 직접 넣을 수 있다. 스크립트 평가 작업은 입력에서 evaluatorType과 expression을 꺼내 선택된 평가기의 evaluate() 메서드로 전달한다.
POST /api/workflow
→ WorkflowResource.startWorkflow()
→ 작업 입력에서 evaluatorType과 expression 추출
→ evaluator.evaluate(expression, taskInput)
→ GraalVM Context.eval()
→ Conductor 프로세스 권한으로 명령 실행
자바스크립트 경로의 실행 지점은 ScriptEvaluator.java의 Context.eval("js", script) 호출이다. 취약 버전은 컨텍스트를 allowHostAccess(HostAccess.ALL)로 생성했다. 작업 입력은 직렬화된 사본이 아니라 실제 자바 맵 객체인 $로 바인딩됐다.
이 객체에서 getClass()를 호출하면 자바 리플렉션 경로에 진입할 수 있다. 공개 재현 코드는 java.lang.Runtime을 찾아 Runtime.exec()를 호출하고 명령 결과를 task.outputData.result에서 회수한다. 명령은 Conductor 자바 가상 머신을 실행하는 계정의 권한으로 동작한다.
파이썬 경로는 PythonEvaluator.java가 다음과 같이 전체 접근 권한을 부여한 컨텍스트를 만든 것이 원인이다.
Context.newBuilder("python")
.allowAllAccess(true)
.build();
이 설정은 호스트 접근과 프로세스 생성을 허용한다. 공개 재현 코드에서는 파이썬 표현식이 subprocess를 불러 운영체제 명령을 실행한다.
정적 분석 결과에서 외부 입력은 다음 실행 지점까지 이어졌다.
ScriptEvaluator.java:203
→ Context.eval("js", script)
PythonEvaluator.java:63
→ Context.eval("python", wrappedExpression)
3.30.2에 포함된 수정은 두 평가기를 직접 제한한다. 파이썬 평가기에서는 allowAllAccess(true)가 제거됐다. 자바스크립트 평가기에서는 Class, ClassLoader, 리플렉션 클래스, Runtime, ProcessBuilder, Process, System, 스레드 관련 클래스 접근을 차단한다.
후속 강화 패치는 컨텍스트 생성 시 다음 권한도 명시적으로 비활성화했다.
.allowHostClassLoading(false)
.allowNativeAccess(false)
.allowCreateThread(false)
.allowCreateProcess(false)
.allowIO(IOAccess.NONE)
.allowEnvironmentAccess(EnvironmentAccess.NONE)
패치에는 리플렉션을 이용한 명령 실행과 GraalJS의 load()를 통한 원격 스크립트 실행·로컬 파일 읽기를 차단하는 회귀 시험도 추가됐다.
영향 확인
실행 중인 Conductor가 3.21.21 이상 3.30.2 미만인지 확인한다. 컨테이너 배포에서는 태그뿐 아니라 이미지 다이제스트와 내부 애플리케이션 버전을 기록한다. 정확한 빌드를 식별할 수 없는 외부 노출 인스턴스도 조사 범위에 포함한다.
다음 접근 조건과 기능 사용 여부를 확인한다.
POST /api/workflow에 인증 없이 접근할 수 있는지- 워크플로 등록·수정·실행 경로가 외부에 노출됐는지
- 프록시나 API 게이트웨이가 해당 경로에 인증을 적용하는지
INLINE,LAMBDA,DO_WHILE,SWITCH작업을 사용하는지- 자바스크립트 또는 파이썬 평가기가 활성화돼 있는지
탐지 포인트
네트워크
워크플로 요청과 그 직후 발생한 외부 통신을 연결해 확인한다.
- 낯선 출발지의
POST /api/workflow요청 INLINE,LAMBDA,DO_WHILE,SWITCH작업을 포함한 요청evaluatorType이javascript또는python인 워크플로- 길거나 난독화된
expression - 평가기 오류가 반복된 뒤 성공한 워크플로 실행
- 실행 직후 시작된 DNS 조회나 외부 연결
프록시 로그에서는 요청 시각, 출발지 주소, 메서드, 경로, 응답 코드, 인증 주체를 확보한다. 요청 본문이 남지 않는 환경에서는 워크플로 정의와 실행 이력을 별도로 보존한다.
엔드포인트
Conductor 자바 프로세스에서 생성된 자식 프로세스를 우선 조사한다.
java
├─ sh | bash | dash
├─ cmd.exe | powershell.exe
├─ python | python3
└─ curl | wget | nc
다음 흔적을 워크플로 실행 시각과 대조한다.
- 서비스 계정이 실행한 셸과 명령 해석기
- 자바 프로세스에서 생성된 비정상 프로세스
- 임시 스크립트나 새 실행 파일
- 애플리케이션 작업 디렉터리 밖에 생성된 파일
- 서비스 계정이 읽은 토큰, 키, 자격 증명 파일
- 압축 도구, 대량 파일 읽기, 외부 전송 도구 실행
정상 워크플로가 명령을 실행하는 환경에서는 기존 프로세스 계보를 기준으로 새 실행 파일, 인수, 경로를 구분한다.
서버
워크플로 정의와 실행 결과에서 다음 패턴을 확인한다.
getClass,Class.forName,Runtime,ProcessBuilder,exec를 사용하는 자바스크립트subprocess,os.system또는 프로세스 생성 호출을 사용하는 파이썬$입력 객체에서 자바 클래스와 리플렉션 메서드를 탐색하는 표현식- 알 수 없는 주체가 등록하거나 실행한 인라인 워크플로
- 오류가 발생할 때마다 표현식이 조금씩 바뀐 실행 기록
- 명령 출력이나 시스템 정보가 들어 있는
task.outputData.result load()를 사용한 외부 스크립트 또는 로컬 파일 접근 시도
키워드만으로 악용 여부를 판단하지 않는다. 워크플로 생성 주체, 실행 시각, 평가 결과, 프로세스 계보, 외부 통신이 연결되는지 확인한다.
대응
- Conductor를 3.30.2 이상으로 갱신한다.
- 모든 배포 위치에서 실제 버전과 이미지 다이제스트를 기록한다.
- 워크플로 API에 대한 외부 직접 접근을 차단한다.
- API를 인증 프록시 뒤에 배치하고 워크플로 등록·수정·실행 권한을 제한한다.
- 워크플로 정의, 변경 이력, 실행 결과, 프록시 로그를 보존한다.
- Conductor 프로세스의 자식 프로세스와 외부 통신을 조사한다.
- 명령 실행이 발견된 호스트를 격리하고 서비스 계정의 토큰, API 키, 연결된 비밀 정보를 교체한다.
- Conductor를 비관리자 계정으로 실행하고 파일 및 네트워크 권한을 필요한 범위로 제한한다.
참고 자료
- NVD CVE-2026-58138
- OpenTaint Conductor 취약점 분석
- CVE-2026-58138 재현 코드와 분석 자료
- Conductor 평가기 접근 제한 패치
- Conductor GraalJS 추가 제한 패치
- Conductor 3.30.2 릴리스
- FortiRecon 취약점 경보