[방어] 분석 — CVE-2026-41137
Critical RCE via unsanitized Python code injection in CSVAgent's
customReadCSVFunc, requiring immediate restriction of the/api/v1/prediction/*endpoint and input validation.
📋 요약
- 심각도 critical · CVSS 8.8 · EPSS 0.0145 · 악용난이도 hard
🔍 공격 기법
인증된 사용자가 CSVAgent 노드의 customReadCSVFunc 설정값에 악의적인 파이썬 코드를 주입하여 서버 측에서 임의 명령을 실행하는 RCE 취약점입니다.
- 주입:
/api/v1/chatflows를 통해customReadCSVFunc필드에 Pandas 문법과 파이썬 시스템 명령어가 혼합된 페이로드를 삽입합니다. - 트리거: 생성된
chatflowId를 사용하여/api/v1/prediction/[CHATFLOWID]엔드포인트로 요청을 보내 해당 노드를 실행시킵니다. - 실행: 서버 내
pyodide런타임이 입력값을 검증 없이runPythonAsync()함수로 전달하여, 주입된os.system()등의 명령어가 실행됩니다.
악용 가능성: 본 취약점의 공격 난이도는 Hard로 평가됩니다. CVSS 벡터상 AV:N과 AC:L로 네트워크를 통한 원격 실행이 가능하고 복잡도가 낮으나, 결정적으로 PR:L 조건에 따라 유효한 인증 권한을 가진 계정이 필요하기 때문입니다. 공격 표면은 CSVAgent 노드의 customReadCSVFunc 파라미터이며, 사용자가 입력한 Python 코드가 서버 측 pyodide 엔진에서 검증 없이 실행되는 RCE(Remote Code Execution) 구조를 가집니다. EPSS 수치는 0.0145로 낮고 KEV에 등재되지 않아 현재 대규모의 자동화된 공격 흐름은 관찰되지 않는 것으로 분석됩니다. 하지만 인증된 사용자가 DataFrame 생성 구문 뒤에 임의의 OS 명령어를 삽입하는 단순한 페이로드만으로도 시스템 권한 탈취가 가능하므로, 내부 위협이나 계정 유출 시 악용 가능성이 매우 높습니다. 결과적으로 이론적 심각도는 치명적이지만, 실제 공격을 위해서는 '인증된 세션'이라는 전제 조건이 충족되어야 하기에 난이도가 상향 조정되었습니다.
💥 영향 분석
- 원격 코드 실행(RCE): 공격자가 서버 권한으로 임의 시스템 명령어를 실행할 수 있습니다.
- 데이터 유출: Pyodide 샌드박스 환경이라 하더라도, 추정: 메모리 내 비즈니스 데이터나 예측 모델의 민감 정보에 접근하여 외부로 유출(Exfiltration)할 가능성이 큽니다.
- 시스템 장악: 샌드박스 이스케이프 성공 시 호스트 OS 전체 권한 탈취로 이어질 수 있습니다.
🔗 관련 취약점·체이닝
- CWE-94 (Code Injection): 사용자 입력값이 인터프리터에 직접 전달되는 전형적인 코드 주입 패턴입니다.
- 권한 상승 체이닝: 인증된 사용자(PR:L)가 시작점이므로, 낮은 권한의 계정을 탈취한 후 서버 전체 권한을 얻는 권한 상승 경로로 활용될 수 있습니다.
🔎 탐지
공격자는 Chatflow 생성 $\rightarrow$ 실행 $\rightarrow$ 삭제 순으로 빠르게 동작하므로, API 요청 로그의 시퀀스와 페이로드 내 특정 키워드 탐지가 핵심입니다.
1. 탐지 지표 및 로그 위치
- 로그 소스: API Gateway 또는 Application Access Log
- 핵심 필드:
request_body,url_path,http_method - 탐지 패턴:
/api/v1/chatflowsPOST 요청의 body 내customReadCSVFunc필드에 파이썬 예약어(import,os.system,__import__,eval) 포함 여부.- 단시간 내 동일 IP에서
POST /api/v1/chatflows$\rightarrow$POST /api/v1/prediction/*$\rightarrow$DELETE /api/v1/chatflows순서로 발생하는 트랜잭션 시퀀스.
2. 탐지 규칙 예시 (SIEM 의사코드)
1-- Rule 1: Payload-based Detection 2SELECT * FROM api_logs 3WHERE url_path = '/api/v1/chatflows' 4AND http_method = 'POST' 5AND request_body REGEXP 'customReadCSVFunc.*(import\s+os|os\.system|__import__|eval\(|exec\()'; 6 7-- Rule 2: Sequence-based Detection (Behavioral) 8SELECT client_ip, count(*) as event_count 9FROM api_logs 10WHERE url_path REGEXP '/api/v1/(chatflows|prediction/.*)' 11GROUP BY client_ip, window(5m) 12HAVING event_count >= 2;3. 오탐 튜닝 및 고려사항
- 오탐 시나리오: 정당한 사용자가 Pandas의 복잡한 데이터 처리 코드를
customReadCSVFunc에 작성하는 경우. - 튜닝 방법: 단순 키워드 매칭보다는
os,subprocess,socket등 시스템 제어 모듈 호출 패턴을 우선순위로 두고, 정상적인 Pandas 함수(read_csv,DataFrame) 외의 구문이 포함된 빈도를 분석하여 임계값을 설정합니다.
🛡️ 완화 방안
본 리포트는 다중 소스 간 심각도 불일치(Critical vs High)가 발견되었으나, RCE 특성을 고려해 보수적으로 Critical을 채택했습니다. EPSS 실측값 0.0145와 exploit=hard 등급을 근거로 즉각적인 대규모 악용 가능성은 낮으나, 인증된 공격자에 의한 정밀 타격 위험이 있으므로 이번 주 내(scheduled) 조치를 권고합니다.
1. 즉시 (긴급 차단)
- 조치: WAF 또는 API Gateway에서
/api/v1/prediction/*엔드포인트로의 접근을 일시적으로 차단하거나,customReadCSVFunc문자열이 포함된 POST 요청을 Drop 처리합니다. - 난이도/영향: 낮음 / 높음 (해당 기능 사용 불가).
- 검증: 외부에서
/api/v1/prediction/[ID]호출 시 403 Forbidden 응답 확인.
2. 단기 (완화)
- 조치:
- 입력값 필터링:
customReadCSVFunc에import,os,sys등 위험 키워드 포함 시 요청을 거부하는 정규식 기반 검증 로직 추가. - 최소 권한 실행: Pyodide 런타임 프로세스의 OS 권한을 non-privileged 계정으로 격리하고 네트워크 아웃바운드 정책(Egress Filter)을 적용하여 데이터 유출 차단.
- 입력값 필터링:
- 난이도/영향: 중간 / 낮음 (정상 코드 일부 차단 가능성).
- 검증:
os.system('whoami')포함 페이로드 전송 시 서버에서 400 Bad Request 응답 확인.
3. 근본 (해결)
- 조치:
- 취약점이 해결된 최신 버전으로 업데이트.
- 코드 수정:
pyodide.runPythonAsync()에 사용자 입력을 직접 전달하는 구조를 제거하고,ast.literal_eval과 같이 실행 불가능한 안전한 파싱 방식을 도입하거나 화이트리스트 기반의 함수 매핑 테이블을 사용하도록 변경.
- 난이도/영향: 높음 / 낮음 (패치 후 기능 정상화).
- 검증: 패치 버전 적용 후 알려진 PoC 페이로드가 실행되지 않음을 확인하고 회귀 테스트 수행.
⚖️ 위험도 / 우선순위
- 조치: scheduled (이번 주 내)
- 근거: CVSS=8.8 · non-KEV · EPSS=0.0145 · exploit=hard · in_scope=None