
Apache Airflow <1.10.11의 예제 DAG에서 RCE 취약점을 악용하는 PoC
설명: 이 취약점은 Airflow의 예제 DAG가 로드될 때 원격 코드 실행(RCE)을 허용하며, CVE-2020-13927을 통해 잠재적으로 인증 없이도 가능합니다.
CVE 크레딧: DtDream 보안의 xuxiang
영향받는 버전: <1.10.11
공개 링크: https://lists.apache.org/thread.html/r7255cf0be3566f23a768e2a04b40fb09e52fcd1872695428ba9afe91%40%3Cusers.airflow.apache.org%3E
NIST CVE 링크: https://nvd.nist.gov/vuln/detail/CVE-2020-11978
이 취약점은 웹 인터페이스에 인증이 설정되어 있더라도 기본적으로 공개된 실험적 REST API를 이용하여 명령어 삽입에 취약한 예제 DAG를 악용합니다.
python CVE-2020-11978.py <url> <command>
example_trigger_target_dag가 로드되지 않았고 트리거하려는 특정 DAG를 알고 있다면, CVE-2020-11978-min.py를 해당 DAG를 트리거하는 방법에 대한 템플릿으로 사용할 수 있습니다.
이미 설정에서 load_examples=False로 예제를 비활성화했다면 취약하지 않습니다.
>=1.10.11로 업데이트하거나 <1.10.11의 경우 취약한 DAG인 example_trigger_target_dag를 제거할 수 있습니다.
>=1.10.11을 사용하여 새 Airflow 인스턴스를 시작하면 airflow.cfg에서 auth_backend에 대해 기본적으로 deny_all이 설정되어 있습니다.
[api]
auth_backend = airflow.api.auth.backend.deny_all
참고로 airflow.api.auth.backend.default는 >=1.10.11에서도 API에 대한 인증되지 않은 요청을 여전히 허용합니다. 따라서 auth_backend = airflow.api.auth.backend.default로 설정된 기존 Airflow 인스턴스가 있다면 >=1.10.11로 업그레이드한 후에도 REST API가 공개된 상태로 남아 있습니다.
>=2.0.0의 경우 실험적 API는 비활성화되지만 더 강력한 안정적인 API가 있습니다.