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:

  1. 修改配置文件:
vi /root/airflow/airflow.cfg

修改内容:

sql_alchemy_conn = mysql+mysqldb://root:password@mysqlip:3306/airflow
  1. 创建数据库(注意字符集):
CREATE DATABASE airflow CHARACTER SET UTF8mb3 COLLATE utf8_general_ci

漏洞分析

漏洞原理

漏洞存在于两个默认示例DAG的组合利用:

  1. example_trigger_controller_dag.py - 控制器DAG
  2. 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,包括:

  1. 命令行触发:
airflow dags trigger --conf '{"conf1": "value1"}' example_parametrized_dag
  1. Web UI直接触发并传递参数

漏洞利用步骤

  1. 访问Airflow Web UI(默认未授权)
  2. 启用目标DAG(example_trigger_target_dag)
  3. 通过Web UI触发该DAG,并在配置中注入恶意命令:
{"message": "'; your_command_here; #"}

修复方案

  1. 升级版本:升级到Airflow 1.10.11或更高版本
  2. 禁用示例DAG:在配置文件中设置:
load_examples = False
  1. 访问控制:配置适当的认证和授权机制

时间线

  • 2020-05-31:漏洞发现并上报
  • 2020-06-01:Apache Airflow安全团队确认
  • 2020-07-10:发布修复版本Airflow 1.10.11
  • 2020-07-14:分配CVE-2020-11978

安全建议

  1. 生产环境中应始终禁用示例DAG
  2. 实施严格的访问控制策略
  3. 定期更新Airflow到最新版本
  4. 最小化Airflow实例的网络暴露面
Apache Airflow 默认DAG命令注入漏洞分析(CVE-2020-11978) 漏洞概述 Apache Airflow 是一个使用Python编写的开源工作流管理平台,通过有向无环图(DAG)来管理任务流程。在默认配置下,Airflow Web UI存在未授权访问风险,结合默认示例DAG中的命令注入漏洞,攻击者可实现远程代码执行。 漏洞环境搭建 快速搭建测试环境 数据库配置(可选) 默认使用Sqlite,如需使用MySQL: 修改配置文件: 修改内容: 创建数据库(注意字符集): 漏洞分析 漏洞原理 漏洞存在于两个默认示例DAG的组合利用: example_ trigger_ controller_ dag.py - 控制器DAG example_ trigger_ target_ dag.py - 目标DAG 目标DAG中包含一个BashOperator,其命令通过Jinja模板动态构建: 正常情况下,控制器DAG会传递固定的conf参数: 但Airflow提供了多种方式修改dag_ run.conf,包括: 命令行触发: Web UI直接触发并传递参数 漏洞利用步骤 访问Airflow Web UI(默认未授权) 启用目标DAG(example_ trigger_ target_ dag) 通过Web UI触发该DAG,并在配置中注入恶意命令: 修复方案 升级版本 :升级到Airflow 1.10.11或更高版本 禁用示例DAG :在配置文件中设置: 访问控制 :配置适当的认证和授权机制 时间线 2020-05-31:漏洞发现并上报 2020-06-01:Apache Airflow安全团队确认 2020-07-10:发布修复版本Airflow 1.10.11 2020-07-14:分配CVE-2020-11978 安全建议 生产环境中应始终禁用示例DAG 实施严格的访问控制策略 定期更新Airflow到最新版本 最小化Airflow实例的网络暴露面