漏洞介绍
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
-
漏洞利用
原文始发于微信公众号(骨哥说事):【星球专享】手把手复现 Apache Airflow 漏洞指南-(CVE-2022–40604)
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论