Executive brief
Apache Airflow's Backfill API has an authorization flaw where the system checks permissions using a different data type parser than the actual request handler. An authenticated user with edit permission on any single Directed Acyclic Graph (DAG) can exploit this to read, pause, cancel, or move backfills belonging to other DAGs without proper authorization. The flaw allows attackers to manipulate DAG run states across the entire system.
Technical details
The vulnerability stems from a type-parsing mismatch in FastAPI's dependency injection. The authorization dependency uses Python's `int()` to parse the `backfill_id` path parameter, while the route handler uses Pydantic's `NonNegativeInt` (in lax mode). Pydantic's lax parser accepts decimal spellings like "42.0" and coerces them to integers, whereas `int()` raises ValueError for these inputs. Because FastAPI resolves dependencies before endpoint validation, mismatched backfill IDs cause the authorization check to evaluate one DAG while the handler processes a different one. An authenticated user can supply decimal-formatted IDs (e.g., `/backfills/42.0`) to bypass intended access controls. The fix (Apache Airflow 3.3.1+) uses the same `TypeAdapter(NonNegativeInt)` parser in both the dependency and handler, eliminating the divergence.
Affected products
- Apache Airflow before 3.3.1
Timeline
- 2026-08-12: disclosed: CVE-2026-68968 published
- 2026-08-04: patched: Fix merged in apache/airflow PR #70889
- 2026: other: Apache Airflow 3.3.1 released with patch