{
  "entrypoint_kind": "endpoint",
  "entrypoint_detail": "Airflow api-server HTTP GET /ui/grid/structure/{dag_id}?offset=0&limit=100 causes API server to load SerializedDagModel.dag and deserialize attacker-controlled serialized DAG fields",
  "service_started": true,
  "healthcheck_passed": true,
  "target_path_reached": true,
  "runtime_stack": [
    "python3",
    "apache-airflow",
    "airflow api-server",
    "uvicorn",
    "sqlite"
  ],
  "proof_artifacts": [
    "logs/reproduction_steps.log",
    "logs/attempt_3.2.2_1.json",
    "artifacts/airflow_api_3.2.2_1/airflow_api_server.log",
    "artifacts/airflow_api_3.2.2_1/endpoint_headers.txt",
    "artifacts/airflow_api_3.2.2_1/endpoint_response.json",
    "artifacts/airflow_api_3.2.2_1/health_response.json",
    "artifacts/airflow_api_3.2.2_1/seed_serialized_dag.log",
    "artifacts/airflow_api_3.2.2_1/airflow_home/dags/evil_trigger_module.py",
    "artifacts/airflow_api_3.2.2_1/api_server_rce_marker.txt",
    "logs/attempt_3.2.2_2.json",
    "artifacts/airflow_api_3.2.2_2/airflow_api_server.log",
    "artifacts/airflow_api_3.2.2_2/endpoint_headers.txt",
    "artifacts/airflow_api_3.2.2_2/endpoint_response.json",
    "artifacts/airflow_api_3.2.2_2/health_response.json",
    "artifacts/airflow_api_3.2.2_2/seed_serialized_dag.log",
    "artifacts/airflow_api_3.2.2_2/airflow_home/dags/evil_trigger_module.py",
    "artifacts/airflow_api_3.2.2_2/api_server_rce_marker.txt",
    "logs/attempt_3.3.0_1.json",
    "artifacts/airflow_api_3.3.0_1/airflow_api_server.log",
    "artifacts/airflow_api_3.3.0_1/endpoint_headers.txt",
    "artifacts/airflow_api_3.3.0_1/endpoint_response.json",
    "artifacts/airflow_api_3.3.0_1/health_response.json",
    "artifacts/airflow_api_3.3.0_1/seed_serialized_dag.log",
    "artifacts/airflow_api_3.3.0_1/airflow_home/dags/evil_trigger_module.py",
    "logs/attempt_3.3.0_2.json",
    "artifacts/airflow_api_3.3.0_2/airflow_api_server.log",
    "artifacts/airflow_api_3.3.0_2/endpoint_headers.txt",
    "artifacts/airflow_api_3.3.0_2/endpoint_response.json",
    "artifacts/airflow_api_3.3.0_2/health_response.json",
    "artifacts/airflow_api_3.3.0_2/seed_serialized_dag.log",
    "artifacts/airflow_api_3.3.0_2/airflow_home/dags/evil_trigger_module.py"
  ],
  "notes": "Two vulnerable Airflow 3.2.2 API-server attempts and two fixed Airflow 3.3.0 API-server attempts ran through the live HTTP endpoint. Vulnerable attempts returned 200 and wrote api_server_rce_marker.txt from the API-server process; fixed attempts reached the endpoint without creating the marker."
}