{"id":"CVE-2026-40961","kind":"vulnerability","aliases":["CVE-2026-40961","GHSA-6hcw-qqr8-pjj8"],"related":[],"title":"Apache Airflow: Authenticated users can bypass the `is_safe_url` check","description":"A bug in the login redirect route in Apache Airflow allowed authenticated users to craft URLs that bypassed the `is_safe_url` check, enabling redirection from a trusted Airflow domain to an attacker-controlled origin. Users are advised to upgrade to `apache-airflow` 3.2.2 or later. As a defense-in-depth mitigation, deployment operators can place Airflow behind a reverse proxy that strips off-domain `next=` query parameters before they reach the login endpoint.","summary":"Apache Airflow's login redirect route let an authenticated user craft a URL that skipped the is_safe_url check, so Airflow would redirect from its own domain to an attacker-chosen site. The sources describe an open redirect (CWE-601), not code execution or data theft.","severity":"high","cvss":7.2,"epss":0.00649,"exploited":false,"exploited_at":null,"products":[{"name":"apache-airflow","fixed":["3.2.2"],"affected":">= 3.0.0b3, < 3.2.2","ecosystem":"pypi"},{"name":"apache airflow","fixed":["3.2.2"],"affected":">= 3.0.0, < 3.2.2","ecosystem":"vendor"}],"ecosystems":["pypi","vendor"],"tags":["apache-airflow","cwe-601","package","python","self-hosted"],"not_affected_if":["auth-required","managed-hosting"],"how_to_check":"- Check the installed version with `pip show apache-airflow` and compare it to the affected range.\n- Confirm the deployment is one of the affected versions: `>= 3.0.0b3` and `< 3.2.2`.","fix":"- `apache-airflow` `3.2.2` or later.\n- As a defense-in-depth measure, the sources say a reverse proxy can strip off-domain `next=` query parameters before they reach the login endpoint.","status":"open","published_at":"2026-06-01T09:16:18+00:00","first_seen_at":"2026-11-02T23:09:41+00:00","triaged_at":"2026-11-02T23:11:10+00:00","updated_at":"2026-11-02T23:35:57+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-02T23:11:10Z","model":"claude-haiku-5-5","output":{"fix":"- `apache-airflow` `3.2.2` or later.\n- As a defense-in-depth measure, the sources say a reverse proxy can strip off-domain `next=` query parameters before they reach the login endpoint.","reach":"network","title":"Apache Airflow: logged-in users can bypass redirect check and send victims off-site","impact":"low","summary":"Apache Airflow's login redirect route let an authenticated user craft a URL that skipped the is_safe_url check, so Airflow would redirect from its own domain to an attacker-chosen site. The sources describe an open redirect (CWE-601), not code execution or data theft.","audience":"developers","category":"package","nicknames":[],"who_cares":["apache-airflow","python","self-hosted"],"confidence":0.8,"fix_status":"available","needs_auth":"yes","worst_case":"victims get redirected from the Airflow domain to an attacker site","analyst_note":"","how_to_check":"- Check the installed version with `pip show apache-airflow` and compare it to the affected range.\n- Confirm the deployment is one of the affected versions: `>= 3.0.0b3` and `< 3.2.2`.","plain_action":"","needs_analyst":false,"not_affected_if":["managed-hosting","auth-required"],"who_is_affected":"Teams running self-hosted Apache Airflow 3.x between 3.0.0b3 and 3.2.1 are affected. The flaw needs an authenticated user, so deployments where only trusted staff can log in carry less risk, but any account holder can use it.","user_interaction":"yes","needs_special_setup":"unknown","severity_if_unknown":"high"},"cost_usd":0.000714,"input_tokens":4290,"output_tokens":570,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':13A,21A '-40961':14A,22A '-601':32B,79B '3.2.2':131C '6hcw':17A 'advis':124C 'airflow':2A,25A,27A,30B,39B,59B,95C,114C,130C,145C 'allow':96C 'apach':1A,29B,38B,94C,129C 'apache':24A,26A 'apache-airflow':23A,28B,128C 'attack':69B,119C 'attacker-chosen':68B 'attacker-control':118C 'authent':3A,46B,97C 'behind':146C 'bug':87C 'bypass':6A,103C 'check':11A,57B,108C 'chosen':70B 'code':81B 'control':120C 'craft':48B,100C 'cve':12A,20A 'cwe':31B,78B 'data':84B 'defens':137C 'defense-in-depth':136C 'deploy':141C 'depth':139C 'describ':74B 'domain':65B,115C,154C 'enabl':109C 'endpoint':163C 'execut':82B 'ghsa':16A 'ghsa-6hcw-qqr8-pjj8':15A 'host':37B 'later':133C 'let':44B 'login':41B,90C,162C 'mitig':140C 'next':155C 'off-domain':152C 'open':76B 'oper':142C 'origin':121C 'packag':33B 'paramet':157C 'pjj8':19A 'place':144C 'proxi':149C 'python':34B 'qqr8':18A 'queri':156C 'reach':160C 'redirect':42B,61B,77B,91C,110C 'revers':148C 'rout':43B,92C 'safe':9A,55B,106C 'self':36B 'self-host':35B 'site':71B 'skip':52B 'sourc':73B 'strip':151C 'theft':85B 'trust':113C 'upgrad':126C 'url':10A,50B,56B,101C,107C 'user':4A,47B,98C,122C 'would':60B","nicknames":[],"mitigations":[],"who_affected":"Teams running self-hosted Apache Airflow 3.x between 3.0.0b3 and 3.2.1 are affected. The flaw needs an authenticated user, so deployments where only trusted staff can log in carry less risk, but any account holder can use it.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["airflow","apacheairflow"],"ptokens":["airflow","apache"],"labels":["apacheairflow","cwe601","high","package","pypi","python","selfhosted","vendor"],"first_public_at":"2026-06-01T09:16:18+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:L/I:L/A:N","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-6hcw-qqr8-pjj8","url":"https://github.com/advisories/GHSA-6hcw-qqr8-pjj8","severity":"high","published_at":"2026-06-01T09:31:13+00:00","modified_at":"2026-11-02T23:08:07+00:00","first_seen_at":"2026-11-02T23:09:41+00:00","fetched_at":"2026-11-02T23:19:57+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-40961","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-40961","severity":null,"published_at":"2026-06-01T09:16:18+00:00","modified_at":"2026-07-21T19:10:00+00:00","first_seen_at":"2026-11-02T23:35:57+00:00","fetched_at":"2026-11-02T23:35:57+00:00","note":null}],"documents":[{"id":54392,"url":"https://github.com/apache/airflow/pull/65557","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":54393,"url":"https://github.com/apache/airflow/commit/555f35576e3143dec65a7fb9acd95891841b45f2","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":54394,"url":"https://github.com/apache/airflow/commit/bfd1881fa0cb1193f49dbac72d7462e66aaf8f25","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":54426,"url":"https://lists.apache.org/thread/qmt8ksh7gty6b8hr9w294t94j36jdv1q","title":"Vendor advisory: lists.apache.org","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Vendor advisory: lists.apache.org"},{"id":54427,"url":"http://www.openwall.com/lists/oss-security/2026/05/31/2","title":"Third-party advisory: www.openwall.com","kind":"advisory","source":"nvd","publisher":"research","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Third-party advisory: www.openwall.com"}],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}