cbcvebase.
CVE-2020-11978
published 2020-07-17

CVE-2020-11978: An issue was found in Apache Airflow versions 1.10.10 and below. A remote code/command injection vulnerability was discovered in one of the example DAGs…

PriorityP192high8.8CVSS 3.1
AVNACLPRLUINSUCHIHAH
KEVITWEXPLOITInitial access
CISA Known Exploited Vulnerabilitydue 2022-07-18
Exploited in the wild
EPSS
99.12%
99.9th percentile
An issue was found in Apache Airflow versions 1.10.10 and below. A remote code/command injection vulnerability was discovered in one of the example DAGs shipped with Airflow which would allow any authenticated user to run arbitrary commands as the user running airflow worker/scheduler (depending on the executor in use). If you already have examples disabled by setting load_examples=False in the config then you are not vulnerable.

Affected

2 ranges
VendorProductVersion rangeFixed in
apacheairflow< 1.10.111.10.11
apache_software_foundationapache_airflow

Detection & IOCsextracted from sources · hover to see the quote

url/api/experimental/test
url/api/experimental/dags/example_trigger_target_dag/tasks/bash_task
url/api/experimental/dags/example_trigger_target_dag/paused/false
url/api/experimental/dags/example_trigger_target_dag/dag_runs
command{"conf": {"message": "\"; touch test #"}}
otherexample_trigger_target_dag
otherbash_task
snort
alert http any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Possible Apache Airflow DAG Example RCE Attempt - Unpause (CVE-2020-11978)"; flow:established,to_server; http.method; content:"GET"; http.uri; content:"/api/experimental/dags/sample_trigger_target_dag/paused/false"; fast_pattern; reference:cve,2020-11978; classtype:attempted-admin; sid:2035036; rev:1; metadata:attack_target Server, created_at 2022_02_01, cve CVE_2020_11978, deployment Perimeter, deployment Internal, confidence Medium, signature_severity Major, tag Exploit, tag CISA_KEV, updated_at 2022_02_01, mitre_tactic_id TA0001, mitre_tactic_name Initial_Access, mitre_technique_id T1190, mitre_technique_name Exploit_Public_Facing_Application;)
snort
alert http any any -> [$HOME_NET,$HTTP_SERVERS] any (msg:"ET EXPLOIT Possible Apache Airflow DAG Example RCE Attempt - Create DAG (CVE-2020-11978)"; flow:established,to_server; http.method; content:"POST"; http.uri; content:"/api/experimental/dags/sample_trigger_target_dag/dag_runs"; fast_pattern; reference:cve,2020-11978; classtype:attempted-admin; sid:2035035; rev:1; metadata:attack_target Server, created_at 2022_02_01, cve CVE_2020_11978, deployment Perimeter, deployment Internal, confidence Medium, signature_severity Major, tag Exploit, tag CISA_KEV, updated_at 2022_02_01, mitre_tactic_id TA0001, mitre_tactic_name Initial_Access, mitre_technique_id T1190, mitre_technique_name Exploit_Public_Facing_Application;)
  • Monitor for GET requests to /api/experimental/dags/example_trigger_target_dag/paused/false — this is the unpause step of the exploit chain, enabling the vulnerable DAG before injection.
  • Monitor for POST requests to /api/experimental/dags/example_trigger_target_dag/dag_runs containing a 'conf' JSON body with shell metacharacters (e.g., "; ... #) in the 'message' field — this is the command injection payload delivery step.
  • Check for the presence of the 'example_trigger_target_dag' DAG with a 'bash_task' task using BashOperator; if 'dag_run' is NOT present in the task's 'env' field, the instance is unpatched and vulnerable.
  • The Nuclei template matches response body containing '"operator":"BashOperator"' and Content-Type application/json on the task status endpoint as confirmation of a vulnerable host.
  • Use Shodan/FOFA queries to identify exposed Airflow instances: title:"Airflow - DAGs", http.html:"Apache Airflow", or http.title:"sign in - airflow".
  • ·Instances with load_examples=False are NOT vulnerable; the example_trigger_target_dag DAG is never loaded and the injection vector does not exist.
  • ·The Experimental REST API must be accessible (unauthenticated or authenticated) for exploitation; setting [api] auth_backend = airflow.api.auth.backend.deny_all mitigates the unauthenticated attack path (CVE-2020-13927 component).

CVSS provenance

nvdv3.18.8HIGHCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
nvdv2.06.5MEDIUMAV:N/AC:L/Au:S/C:P/I:P/A:P
vulncheck8.8HIGH
cisa8.8HIGH
CVEs like this are exactly what “Exploited This Week” covers.

Every Monday: what got weaponized or added to CISA KEV in the last seven days — each CVE cross-linked to its PoC, Nuclei template, and detection rule. Free, one email a week, unsubscribe in one click.