{"id":"CVE-2026-101031","kind":"vulnerability","aliases":["CVE-2026-101031"],"related":[],"title":"Apache Airflow: example DAG lets a crafted URL run shell commands","description":"The `example_dag_decorator` example Dag shipped with Apache Airflow validated an IP address fetched over HTTP with Python's `ipaddress` module and then placed it into a shell command. `ipaddress` accepts IPv6 zone identifiers containing arbitrary characters, so when example Dags are loaded (`load_examples` enabled), a user who can trigger that Dag with a custom `url` parameter could point it at a server whose response injects shell commands run on the worker. This is an incomplete fix for CVE-2025-54941; users who upgraded for CVE-2025-54941 should upgrade again. Users are advised to upgrade to apache-airflow 3.4.0 or later, or to disable example Dags (`load_examples = False`), which is recommended for production.","summary":"The bundled example_dag_decorator DAG validates an HTTP-fetched IP address with Python's ipaddress module and then puts it into a shell command, but ipaddress accepts IPv6 zone identifiers with arbitrary characters. A user who can trigger that DAG with a custom url parameter can have a malicious server's response inject shell commands that run on the Airflow worker.","severity":"high","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["apache-airflow","python","runtime","self-hosted"],"not_affected_if":["load-examples-disabled","managed-hosting"],"how_to_check":"- Check whether example DAGs are loaded: look for `load_examples = True` in airflow.cfg or `AIRFLOW__CORE__LOAD_EXAMPLES` set to true.\n- Check the installed version with `airflow version` and compare against `3.4.0`.\n- Look for the example_dag_decorator DAG in the DAG list.","fix":"- apache-airflow: upgrade to `3.4.0` or later, per the advisory; users who upgraded for CVE-2025-54941 must upgrade again.\n- Alternatively, set `load_examples = False`, which the advisory recommends for production.","status":"open","published_at":"2026-11-09T10:17:02+00:00","first_seen_at":"2026-11-09T10:25:47+00:00","triaged_at":"2026-11-09T10:26:55+00:00","updated_at":"2026-11-09T10:26:55+00:00","category":"runtime","confidence":0.7,"triage":{"at":"2026-11-09T10:26:55Z","model":"claude-haiku-5-5","output":{"fix":"- apache-airflow: upgrade to `3.4.0` or later, per the advisory; users who upgraded for CVE-2025-54941 must upgrade again.\n- Alternatively, set `load_examples = False`, which the advisory recommends for production.","reach":"network","title":"Apache Airflow: example DAG lets a crafted URL run shell commands","impact":"high","summary":"The bundled example_dag_decorator DAG validates an HTTP-fetched IP address with Python's ipaddress module and then puts it into a shell command, but ipaddress accepts IPv6 zone identifiers with arbitrary characters. A user who can trigger that DAG with a custom url parameter can have a malicious server's response inject shell commands that run on the Airflow worker.","audience":"businesses","category":"runtime","nicknames":[],"who_cares":["apache-airflow","python","self-hosted"],"confidence":0.7,"fix_status":"available","needs_auth":"yes","worst_case":"Shell commands run on the Airflow worker via a crafted server response.","analyst_note":"Confirm the exact affected version range and whether the advisory's 3.4.0 fix is the only fixed release; check the NVD entry at https://nvd.nist.gov/vuln/detail/CVE-2026-101031.","how_to_check":"- Check whether example DAGs are loaded: look for `load_examples = True` in airflow.cfg or `AIRFLOW__CORE__LOAD_EXAMPLES` set to true.\n- Check the installed version with `airflow version` and compare against `3.4.0`.\n- Look for the example_dag_decorator DAG in the DAG list.","plain_action":"","product_name":"","needs_analyst":true,"not_affected_if":["load-examples-disabled","managed-hosting"],"who_is_affected":"Only installs with example DAGs loaded (load_examples enabled) are exposed, and the attacker must be able to trigger the example DAG with a custom url parameter. Production deployments that do not need the examples can skip the upgrade by disabling them, though the advisory recommends disabling them there regardless.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"high"},"cost_usd":0.000854,"input_tokens":4704,"output_tokens":767,"severity_before":"unknown"},"analyst_status":null,"analyst_note":null,"search":"'-101031':14A,17A '-2025':170C,177C '-2026':13A,16A '-54941':171C,178C '3.4.0':191C 'accept':54B,120C 'address':38B,102C 'advis':184C 'airflow':2A,20B,87B,98C,190C 'apach':1A,19B,97C,189C 'apache-airflow':18B,188C 'arbitrari':59B,125C 'bundl':27B 'charact':60B,126C 'command':11A,51B,82B,118C,158C 'contain':124C 'could':148C 'craft':7A 'custom':70B,145C 'cve':12A,15A,169C,176C 'dag':4A,29B,31B,67B,91C,94C,130C,142C,198C 'decor':30B,92C 'disabl':196C 'enabl':135C 'exampl':3A,28B,90C,93C,129C,134C,197C,200C 'fals':201C 'fetch':36B,103C 'fix':167C 'host':25B 'http':35B,105C 'http-fetch':34B 'identifi':57B,123C 'incomplet':166C 'inject':80B,156C 'ip':37B,101C 'ipaddress':42B,53B,109C,119C 'ipv6':55B,121C 'later':193C 'let':5A 'load':132C,133C,199C 'malici':76B 'modul':43B,110C 'paramet':72B,147C 'place':113C 'point':149C 'product':206C 'put':46B 'python':21B,40B,107C 'recommend':204C 'respons':79B,155C 'run':9A,84B,159C 'runtim':22B 'self':24B 'self-host':23B 'server':77B,153C 'shell':10A,50B,81B,117C,157C 'ship':95C 'trigger':65B,140C 'upgrad':174C,180C,186C 'url':8A,71B,146C 'user':62B,137C,172C,182C 'valid':32B,99C 'whose':154C 'worker':88B,162C 'zone':56B,122C","nicknames":[],"mitigations":[],"who_affected":"Only installs with example DAGs loaded (load_examples enabled) are exposed, and the attacker must be able to trigger the example DAG with a custom url parameter. Production deployments that do not need the examples can skip the upgrade by disabling them, though the advisory recommends disabling them there regardless.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["apacheairflow","high","python","runtime","selfhosted"],"campaign_type":null,"search_a":"'-101031':14A,17A '-2026':13A,16A 'airflow':2A 'apach':1A 'command':11A 'craft':7A 'cve':12A,15A 'dag':4A 'exampl':3A 'let':5A 'run':9A 'shell':10A 'url':8A","search_b":"'accept':54B 'address':38B 'airflow':20B,87B 'apach':19B 'apache-airflow':18B 'arbitrari':59B 'bundl':27B 'charact':60B 'command':51B,82B 'custom':70B 'dag':29B,31B,67B 'decor':30B 'exampl':28B 'fetch':36B 'host':25B 'http':35B 'http-fetch':34B 'identifi':57B 'inject':80B 'ip':37B 'ipaddress':42B,53B 'ipv6':55B 'malici':76B 'modul':43B 'paramet':72B 'put':46B 'python':21B,40B 'respons':79B 'run':84B 'runtim':22B 'self':24B 'self-host':23B 'server':77B 'shell':50B,81B 'trigger':65B 'url':71B 'user':62B 'valid':32B 'worker':88B 'zone':56B","search_c":"'-2025':170C,177C '-54941':171C,178C '3.4.0':191C 'accept':120C 'address':102C 'advis':184C 'airflow':98C,190C 'apach':97C,189C 'apache-airflow':188C 'arbitrari':125C 'charact':126C 'command':118C,158C 'contain':124C 'could':148C 'custom':145C 'cve':169C,176C 'dag':91C,94C,130C,142C,198C 'decor':92C 'disabl':196C 'enabl':135C 'exampl':90C,93C,129C,134C,197C,200C 'fals':201C 'fetch':103C 'fix':167C 'http':105C 'identifi':123C 'incomplet':166C 'inject':156C 'ip':101C 'ipaddress':109C,119C 'ipv6':121C 'later':193C 'load':132C,133C,199C 'modul':110C 'paramet':147C 'place':113C 'point':149C 'product':206C 'python':107C 'recommend':204C 'respons':155C 'run':159C 'server':153C 'shell':117C,157C 'ship':95C 'trigger':140C 'upgrad':174C,180C,186C 'url':146C 'user':137C,172C,182C 'valid':99C 'whose':154C 'worker':162C 'zone':122C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-09T10:17:02+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-101031","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-101031","severity":null,"published_at":"2026-11-09T10:17:02+00:00","modified_at":"2026-11-09T10:17:02+00:00","first_seen_at":"2026-11-09T10:25:47+00:00","fetched_at":"2026-11-09T10:25:47+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"}