{"id":"CVE-2026-40913","kind":"vulnerability","aliases":["CVE-2026-40913"],"related":[],"title":"Apache Airflow: Import Errors API leaks parse-failure stack traces to readers","description":"Apache Airflow's public Import Errors API returns the raw parse-failure stack trace to any user with the `ImportError.can_read` permission when the failing file has no registered DAG. This happens when a file fails to parse before any DAG is defined, or when all of its previously registered DAGs are removed but the parse error remains. Users who should not see that file's details can read stack traces that may expose file paths and code.\n\nUsers are advised to upgrade to Apache Airflow 3.4.0 or later, which restricts these stack traces to users with the new `IMPORT_ERRORS_ALL` permission.","summary":"Airflow's public Import Errors API returns the raw stack trace of a DAG file that failed to parse, to any user holding the ImportError.can_read permission, when that file has no registered DAG. An attacker with that read permission can see file paths and code from files they should not see.","severity":"low","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["apache-airflow","rbac","runtime","self-hosted"],"not_affected_if":["managed-hosting","single-user-deployment"],"how_to_check":"- Check the installed version with `airflow version` and compare it to the fixed range below.\n- Look at which roles hold `ImportError.can_read` in the Airflow access control configuration.","fix":"- Apache Airflow: upgrade to `3.4.0` or later, which limits these stack traces to users with the new `IMPORT_ERRORS_ALL` permission.","status":"open","published_at":"2026-11-09T10:17:10+00:00","first_seen_at":"2026-11-09T10:25:49+00:00","triaged_at":"2026-11-09T10:26:44+00:00","updated_at":"2026-11-09T10:26:44+00:00","category":"runtime","confidence":0.6,"triage":{"at":"2026-11-09T10:26:44Z","model":"claude-haiku-5-5","output":{"fix":"- Apache Airflow: upgrade to `3.4.0` or later, which limits these stack traces to users with the new `IMPORT_ERRORS_ALL` permission.","reach":"network","title":"Apache Airflow: Import Errors API leaks parse-failure stack traces to readers","impact":"low","summary":"Airflow's public Import Errors API returns the raw stack trace of a DAG file that failed to parse, to any user holding the ImportError.can_read permission, when that file has no registered DAG. An attacker with that read permission can see file paths and code from files they should not see.","audience":"businesses","category":"runtime","nicknames":[],"who_cares":["apache-airflow","self-hosted","rbac"],"confidence":0.6,"fix_status":"available","needs_auth":"yes","worst_case":"Authenticated readers see file paths and code from unrelated DAG files","analyst_note":"","how_to_check":"- Check the installed version with `airflow version` and compare it to the fixed range below.\n- Look at which roles hold `ImportError.can_read` in the Airflow access control configuration.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["single-user-deployment","managed-hosting"],"who_is_affected":"Teams running Apache Airflow 3.x with role-based access where some users hold ImportError.can_read but should not see every DAG file's details. Exposure requires a DAG file that fails to parse or whose DAGs were all removed, so the stack trace is still served. Installations where every reader can see every file, or where the permission is not granted to anyone outside operators, have little to lose.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"no","severity_if_unknown":"low"},"cost_usd":0.000755,"input_tokens":4635,"output_tokens":583,"severity_before":"unknown"},"analyst_status":null,"analyst_note":null,"search":"'-2026':15A,18A '-40913':16A,19A '3.4.0':167C 'advis':161C 'airflow':2A,22B,28B,81C,166C 'apach':1A,21B,80C,165C 'apache-airflow':20B 'api':5A,33B,86C 'attack':63B 'code':73B,158C 'cve':14A,17A 'dag':41B,61B,110C,121C,131C 'defin':123C 'detail':147C 'error':4A,32B,85C,137C,181C 'expos':154C 'fail':44B,105C,116C 'failur':9A,92C 'file':42B,57B,70B,75B,106C,115C,145C,155C 'happen':112C 'hold':50B 'host':27B 'import':3A,31B,84C,180C 'importerror.can':52B,100C 'later':169C 'leak':6A 'may':153C 'new':179C 'pars':8A,46B,91C,118C,136C 'parse-failur':7A,90C 'path':71B,156C 'permiss':54B,67B,102C,183C 'previous':129C 'public':30B,83C 'raw':36B,89C 'rbac':23B 'read':53B,66B,101C,149C 'reader':13A 'regist':60B,109C,130C 'remain':138C 'remov':133C 'restrict':171C 'return':34B,87C 'runtim':24B 'see':69B,79B,143C 'self':26B 'self-host':25B 'stack':10A,37B,93C,150C,173C 'trace':11A,38B,94C,151C,174C 'upgrad':163C 'user':49B,97C,139C,159C,176C","nicknames":[],"mitigations":[],"who_affected":"Teams running Apache Airflow 3.x with role-based access where some users hold ImportError.can_read but should not see every DAG file's details. Exposure requires a DAG file that fails to parse or whose DAGs were all removed, so the stack trace is still served. Installations where every reader can see every file, or where the permission is not granted to anyone outside operators, have little to lose.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["apacheairflow","low","rbac","runtime","selfhosted"],"campaign_type":null,"search_a":"'-2026':15A,18A '-40913':16A,19A 'airflow':2A 'apach':1A 'api':5A 'cve':14A,17A 'error':4A 'failur':9A 'import':3A 'leak':6A 'pars':8A 'parse-failur':7A 'reader':13A 'stack':10A 'trace':11A","search_b":"'airflow':22B,28B 'apach':21B 'apache-airflow':20B 'api':33B 'attack':63B 'code':73B 'dag':41B,61B 'error':32B 'fail':44B 'file':42B,57B,70B,75B 'hold':50B 'host':27B 'import':31B 'importerror.can':52B 'pars':46B 'path':71B 'permiss':54B,67B 'public':30B 'raw':36B 'rbac':23B 'read':53B,66B 'regist':60B 'return':34B 'runtim':24B 'see':69B,79B 'self':26B 'self-host':25B 'stack':37B 'trace':38B 'user':49B","search_c":"'3.4.0':167C 'advis':161C 'airflow':81C,166C 'apach':80C,165C 'api':86C 'code':158C 'dag':110C,121C,131C 'defin':123C 'detail':147C 'error':85C,137C,181C 'expos':154C 'fail':105C,116C 'failur':92C 'file':106C,115C,145C,155C 'happen':112C 'import':84C,180C 'importerror.can':100C 'later':169C 'may':153C 'new':179C 'pars':91C,118C,136C 'parse-failur':90C 'path':156C 'permiss':102C,183C 'previous':129C 'public':83C 'raw':89C 'read':101C,149C 'regist':109C,130C 'remain':138C 'remov':133C 'restrict':171C 'return':87C 'see':143C 'stack':93C,150C,173C 'trace':94C,151C,174C 'upgrad':163C 'user':97C,139C,159C,176C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-09T10:17:10+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-40913","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-40913","severity":null,"published_at":"2026-11-09T10:17:10+00:00","modified_at":"2026-11-09T10:17:10+00:00","first_seen_at":"2026-11-09T10:25:49+00:00","fetched_at":"2026-11-09T10:25:49+00:00","note":null}],"documents":[],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}