Apache Airflow默认DAG导致命令注入分析(CVE-2020-11978)
字数 849 2025-08-22 12:23:36
Apache Airflow 默认DAG命令注入漏洞分析(CVE-2020-11978)
漏洞概述
Apache Airflow 是一个使用Python编写的开源工作流管理平台,通过有向无环图(DAG)来管理任务流程。在默认配置下,Airflow Web UI存在未授权访问风险,结合默认示例DAG中的命令注入漏洞,攻击者可实现远程代码执行。
漏洞环境搭建
快速搭建测试环境
# 启动容器
docker run --rm --entrypoint '' -v /tmp/airflow/:/root/airflow --name airflow -it apache/airflow:master-ci /bin/bash
# 进入容器进行初始化配置
airflow db init
nohup airflow webserver &
nohup airflow scheduler &
数据库配置(可选)
默认使用Sqlite,如需使用MySQL:
- 修改配置文件:
vi /root/airflow/airflow.cfg
修改内容:
sql_alchemy_conn = mysql+mysqldb://root:password@mysqlip:3306/airflow
- 创建数据库(注意字符集):
CREATE DATABASE airflow CHARACTER SET UTF8mb3 COLLATE utf8_general_ci
漏洞分析
漏洞原理
漏洞存在于两个默认示例DAG的组合利用:
- example_trigger_controller_dag.py - 控制器DAG
- example_trigger_target_dag.py - 目标DAG
目标DAG中包含一个BashOperator,其命令通过Jinja模板动态构建:
bash_command='echo "Here is the message: \'{{ dag_run.conf["message"] if dag_run else "" }}\'"'
正常情况下,控制器DAG会传递固定的conf参数:
conf={"message": "Hello World"}
但Airflow提供了多种方式修改dag_run.conf,包括:
- 命令行触发:
airflow dags trigger --conf '{"conf1": "value1"}' example_parametrized_dag
- Web UI直接触发并传递参数
漏洞利用步骤
- 访问Airflow Web UI(默认未授权)
- 启用目标DAG(example_trigger_target_dag)
- 通过Web UI触发该DAG,并在配置中注入恶意命令:
{"message": "'; your_command_here; #"}
修复方案
- 升级版本:升级到Airflow 1.10.11或更高版本
- 禁用示例DAG:在配置文件中设置:
load_examples = False
- 访问控制:配置适当的认证和授权机制
时间线
- 2020-05-31:漏洞发现并上报
- 2020-06-01:Apache Airflow安全团队确认
- 2020-07-10:发布修复版本Airflow 1.10.11
- 2020-07-14:分配CVE-2020-11978
安全建议
- 生产环境中应始终禁用示例DAG
- 实施严格的访问控制策略
- 定期更新Airflow到最新版本
- 最小化Airflow实例的网络暴露面