【星球专享】手把手复现 Apache Airflow 漏洞指南-(CVE-2022–40604)
原文链接: https://mp.weixin.qq.com/s?__biz=MjM5Mzc4MzUzMQ==&mid=2650261384&idx=1&sn=4f91cc15ac8ab344b7d926dd5c872297
【星球专享】手把手复现 Apache Airflow 漏洞指南-(CVE-2022–40604)
原创 骨哥说事 骨哥说事 2025-07-03 03:17
声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由用户承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 |
****# 防走失:https://gugesay.com/
**不想错过任何消息?设置星标↓ ↓ ↓
漏洞介绍
Apache Airflow 是一个用于编排复杂工作流的开放源代码平台,广泛用于数据管道和任务调度。
CVE-2022–40604 漏洞源于
src/airflow/utils/log/file_task_handler.py
中日志 URL 构建中的字符串格式化不当。
具体来说,
log_relative_path
变量包含了用户控制的
run_id
,不安全地传递给了
.format()
调用,使攻击者能够注入恶意格式字符串并提取敏感配置数据。
为什么格式化字符串很重要
格式化字符串漏洞发生在用户输入未经适当清理就直接被包含在字符串格式化函数中(例如 Python 的
.format()
或 C 的
printf
)。
在 Airflow 的情况下,攻击者可以通过
run_id
参数控制
log_relative_path
的部分内容,从而允许他们构建格式化字符串
{ti.task.__class__.__init__.__globals__[conf].__dict__}
来访问内部配置对象。
测试环境搭建
Docker 搭建
docker run -p 8080:8080 apache/airflow:2.3.4
pip 安装方式
pip install apache-airflow==2.3.4
airflow db init
airflow webserver -p 8080
漏洞复现
该漏洞存在于 Airflow 任务处理器的日志机制中。
file_task_handler.py
中的恶意代码为:
url = os.path.join("http://{ti.hostname}:{worker_log_server_port}/log", log_relative_path).format(
ti=ti, worker_log_server_port=conf.get('logging', 'WORKER_LOG_SERVER_PORT')
)
这里的
log_relative_path
包含了用户控制的
run_id
,从而受到格式字符串注入攻击。
复现过程
-
访问 DAGs 菜单:
-
登录 Airflow 的 Web 界面,例如 :
http://localhost:8080
- 导航至 DAGs 并选择一个 DAG(例如:
example_xcom
)
-
查看日志 URL:
-
触发一个 DAG,查看日志(Log)选项卡中的任务
-
捕获
/get_logs_with_metadata
的请求
- 示例 URL:
/get_logs_with_metadata?dag_id=example_xcom&task_id=push_by_returning&map_index=-1&execution_date=2022-08-29T13:25:11+00:00&try_number=1&metadata=null
-
识别用户控制输入:
-
触发 DAG 时设置的
run_id
参数会影响
log_relative_path
- 测试
run_id
是否可以操纵格式化的 URL
漏洞利用
- 加入星球,畅享阅读 –
*(会员统一定价):128元/年(0.35元/天)***
感谢阅读,如果觉得还不错的话,欢迎分享给更多喜爱的朋友~