
Python StateMachine 3.0.0 < 3.2.0에서 안전하지 않은 SCXML <data expr> 평가 및 Python eval() 주입을 통한 RCE
심각도: Critical, CVSS 4.0 9.3, CVSS 3.1 9.8 (CNA인 VulnCheck가 할당)
Vector (v4.0): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N
Vector (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
영향받는 버전: Python StateMachine >= 3.0.0, < 3.2.0
수정 버전: 3.2.0
CWE: CWE-95 (동적으로 평가되는 코드의 지시문 부적절한 중화, Eval Injection); CWE-94(코드 생성 제어 부적절, Code Injection)에도 매핑됨
신고자: Sai Teja Erukude
CNA: VulnCheck
게시일: 2026년 6월 17일
Python StateMachine 3.0.0부터 3.2.0 이전 버전은 SCXML 처리 경로에 원격 코드 실행 취약점을 포함합니다.
SCXMLProcessor는 SCXML 문서를 받아들이고 <data expr="...">와 같은 표현식 속성을 유지합니다. 취약한 버전에서는 이러한 표현식 문자열이 SCXML 데이터 모델 처리 경로를 거쳐 결국 샌드박싱 없이 Python 내장 eval()에 도달합니다.
SCXML 문서를 공급하거나 조작할 수 있는 공격자는 <data expr="..."> 속성 안에 Python 코드를 넣을 수 있습니다. 사용 애플리케이션이 SCXML 파일을 파싱하고 프로세서를 시작하면 해당 표현식은 호스팅 Python 프로세스의 컨텍스트에서 평가됩니다.
취약한 애플리케이션이 공격자가 제어하는 SCXML 콘텐츠를 처리하는 경우 공격자는 임의의 Python 코드를 실행할 수 있습니다.
노출 범위는 사용 애플리케이션이 SCXML 문서를 수신하는 방식에 따라 원격 또는 로컬이 될 수 있습니다. 위험한 입력 경로는 다음과 같습니다:
성공적인 악용을 통해 다음이 가능해질 수 있습니다:
VulnCheck에 보고된 취약한 호출 체인은 다음과 같습니다:
SCXMLProcessor.parse_scxml_file()
SCXMLProcessor.process_definition()
create_datamodel_action_callable()
_create_dataitem_callable()
_eval()
eval()
이 문제는 파싱된 SCXML 데이터 모델 항목이 프로세서 시작 중에 평가될 때 트리거됩니다.
취약한 제어 흐름에는 두 가지 신뢰 경계 실패가 있습니다:
eval()로 평가됩니다.PoC는 이 경로가 SCXMLProcessor.start() 동안 실행되므로 <data expr="..."> 속성을 사용합니다. eval()에 빈 globals 사전을 전달해도 Python 내장 기능이 비활성화되지 않습니다. Python은 여전히 평가 컨텍스트에 사용 가능한 내장 기능을 주입할 수 있습니다. 결과적으로 표현식은 __import__에 접근하여 Python 코드를 실행할 수 있습니다.
무해한 증명 페이로드는 로컬 마커 파일을 작성합니다:
<data id="x" expr="__import__('pathlib').Path(...).write_text(...)"/>
마커는 SCXML 문서가 파싱되고 start()가 데이터 모델 표현식을 평가한 후에만 생성됩니다.
package_builder.py는 malicious-charts/data_expr_start.scxml에 공격자가 제어하는 로컬 SCXML 파일을 생성합니다. 생성된 파일에는 이 PoC 디렉터리에 marker.txt를 작성하는 무해한 <data expr> 페이로드가 포함됩니다.
run_poc.py는 후크를 설치하지 않으며 대상 패키지를 수정하지 않습니다. 게시된 python-statemachine==3.1.2 패키지를 가져오고 SCXMLProcessor.parse_scxml_file(...)로 생성된 SCXML 파일을 파싱한 다음 프로세서를 시작하고 전후 마커 증거를 출력합니다.
로컬 테스트 환경에서만 실행하세요:
python -m venv .venv
.venv\Scripts\activate
python -m pip install -r requirements.txt
python run_poc.py
취약한 버전에서 기대되는 증거:
statemachine_version: 3.1.2
installed_package: True
data_marker_before_start: False
data_marker_after_start: True
marker_contents:
python_statemachine_scxml_data_expr_eval_triggered
success: True
중요한 동작은 marker.txt가 start() 이전에는 존재하지 않다가 이후에는 존재한다는 것입니다. 이는 SCXML 표현식이 호스팅 Python 프로세스 내에서 실행되었음을 증명합니다.
페이로드는 의도적으로 무해합니다. 로컬 마커 문자열만 작성합니다:
python_statemachine_scxml_data_expr_eval_triggered
셸을 생성하지 않고, 네트워크 서비스에 연결하지 않으며, 비밀 정보를 읽지 않고, 데이터를 삭제하지 않으며, PoC 디렉터리 외부의 파일을 수정하지 않습니다.
Python StateMachine 3.2.0 이상으로 업그레이드하세요.
지속적인 수정은 공격자가 제어하는 SCXML 표현식 텍스트를 원시 Python eval()로 평가하지 않아야 합니다. 더 안전한 접근 방식은 다음과 같습니다:
eval()을 제한된 표현식 평가기로 대체.즉시 업그레이드가 불가능한 경우:
SCXMLProcessor에 도달하기 전에 검증하세요.| 날짜 | 이벤트 |
|---|---|
| 2026년 5월 22일 | VulnCheck에 취약점 제출 |
| 2026년 5월 26일 | VulnCheck 공개 절차 시작; CVE-2026-47103 잠정 할당 |
| 2026년 6월 17일 | CVE-2026-47103 게시 |
Sai Teja Erukude가 발견하고 보고했으며, VulnCheck를 통해 조정되었습니다.