Apache Airflow
CVE-2026-59245
HIGH
Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
Web/API reachable (AV:N) by an authenticated low-priv user (PR:L), but requires a DAG named 'DAGs' plus an admin-issued grant outside attacker control (AC:H); read/edit of all DAGs gives C:H/I:H, no availability impact (A:N).
Primary rating from Vendor (apache).
CVSS VectorNVD
Lifecycle Timeline
7DescriptionNVD
In the Apache Airflow FAB auth manager, a DAG whose dag_id is DAGs collided with the global all-DAGs permission resource name produced by resource_name(), so a user granted per-DAG access_control on that one DAG was silently granted the global all-DAGs permission (privilege escalation). The escalation triggers when a DAG named DAGs exists and a lower-privileged user is given per-DAG access to it, granting that user read/edit access to every DAG. Users are advised to upgrade to apache-airflow-providers-fab 3.7.2 or later, which disambiguates the resource-name collision.
AnalysisAI
Privilege escalation in the Apache Airflow FAB auth manager (apache-airflow-providers-fab before 3.7.2) lets a low-privileged user who is granted per-DAG access to a DAG literally named 'DAGs' silently receive the global all-DAGs permission, gaining read and edit access to every DAG in the deployment. The flaw stems from a resource-name collision in resource_name(), where the reserved global resource string 'DAGs' is indistinguishable from a legitimate dag_id of the same value. No public exploit identified at time of analysis, and the issue is not listed in CISA KEV.
Technical ContextAI
Apache Airflow's legacy Flask-AppBuilder (FAB) auth manager maps DAG-level authorization onto FAB permission resources. The helper resource_name(dag_id, RESOURCE_DAG) is meant to produce a per-DAG resource such as 'DAG:my_dag', while the singular reserved name 'DAGs' (RESOURCE_DAG) represents the global all-DAGs permission. The vulnerable code short-circuited and returned the raw dag_id whenever it matched an entry in RESOURCE_DETAILS_MAP, so a DAG whose dag_id equals 'DAGs' resolved to the global resource name rather than its own 'DAG:DAGs' resource. This is a classic CWE-269 Improper Privilege Management failure caused by an identifier-namespace collision between attacker-influenceable data (a DAG name) and a trusted, reserved authorization token. The fix (PR #69106) removes the short-circuit so 'DAGs' correctly resolves to 'DAG:DAGs', verified by regression tests asserting resource_name(RESOURCE_DAG, RESOURCE_DAG) == 'DAG:DAGs'. Affected component per CPE is cpe:2.3:a:apache_software_foundation:apache_airflow_fab_provider.
RemediationAI
Vendor-released patch: upgrade apache-airflow-providers-fab to 3.7.2 or later, which disambiguates the resource-name collision so a DAG named 'DAGs' resolves to its own 'DAG:DAGs' resource; this is the primary and recommended fix (see PR https://github.com/apache/airflow/pull/69106 and advisory https://lists.apache.org/thread/70f37q3mwov1vm3zolrfxlzds278c78h). If immediate patching is not possible, a targeted compensating control is to rename any DAG whose dag_id is exactly 'DAGs' to any other identifier, which eliminates the collision entirely with minimal side effects beyond updating references to that DAG. As an additional interim measure, audit and revoke per-DAG access_control grants on any DAG named 'DAGs' and review FAB role assignments to confirm no low-privileged user has been inadvertently escalated to the global all-DAGs permission; the trade-off is administrative overhead and potential disruption to legitimate users who need access to that specific DAG.
More in Apache Airflow Fab Provider
View allAuthentication bypass in the Apache Airflow FAB provider (apache-airflow-providers-fab 3.7.3 through 3.8.0) lets any una
LDAP filter injection in Apache Airflow FAB Auth Manager (apache-airflow-providers-fab < 3.6.4) enables unauthenticated
Same weakness CWE-269 – Improper Privilege Management
View allSame technique Privilege Escalation
View allShare
External POC / Exploit Code
Leaving vuln.today