逆向工程实战手册 第 101 章

第 101 章 异步队列与 Worker 漏洞(Queue / Background Jobs)

现代应用大量使用异步任务:消息队列(RabbitMQ/Kafka)、任务队列(Celery/Bull)、定时任务(Cron)、后台 Worker。这些"后台执行面"常与主应用配置漂移、权限不同、防护更弱——是攻击者容易忽视的突破口。异步系统 = 主应用的"侧门"。

📍 知识点地图 | 主题:队列Worker | 前置:第80章 | 后续:— | 核心概念:Broker未授权、pickle RCE、配置漂移

101.1 异步系统架构(先懂形态)

消息/任务流转:
  生产者(应用)→ 队列(Broker)→ 消费者(Worker)→ 执行

组件:
  Broker: RabbitMQ/Kafka/Redis Streams(存储消息)
  Worker: Celery(Python)/Bull(Node)/Sidekiq(Ruby)
  调度: Cron / 定时器 / 延迟队列
  存储: Redis/数据库(任务状态)

安全特性(攻击者视角):
  □ 队列常"无认证"或弱认证(内网默认信任)
  □ Worker 权限常高于 Web 应用(不同运行环境)
  □ 任务参数被反序列化/执行(注入面!)
  □ 重试机制 = 重复执行面

101.2 攻击面地图

┌─────────────────────────────────────────────┐
│ 1. 队列未授权访问(Broker 无认证)            │
│ 2. 任务参数注入(反序列化/命令/模板)         │
│ 3. Worker 代码漏洞(异步执行的业务逻辑)      │
│ 4. 配置漂移(Worker 环境 ≠ 主应用环境)       │
│ 5. 重试/死信滥用(重复触发副作用)            │
│ 6. 调度器漏洞(Cron 注入/任务劫持)           │
│ 7. 凭据泄露(Worker 环境变量/配置)           │
└─────────────────────────────────────────────┘

101.3 队列未授权访问(最常见)

默认配置问题:
  Redis(用作队列): 无认证(第 85 章 Redis 攻击)
  RabbitMQ: 默认 guest/guest
  Kafka: 默认无认证

利用:
  □ 直接连接读取消息(数据泄露)
  □ 向队列投递恶意任务(Worker 执行 → RCE)
  □ 消费/篡改在途消息(业务操纵)

工具: 各 Broker 客户端直连 / fscan 发现端口

101.4 任务参数注入(反序列化/执行)

Celery(Python):
  任务参数 pickle 反序列化 → 恶意 pickle → RCE
  Celery 默认 pickle 序列化(危险!):
    payload = "cos\nsystem\n(S'id'\ntR."(pickle 字节)
    投递到任务队列 → Worker 反序列化执行

Bull/Sidekiq(JS/Ruby):
  序列化格式不同,但"任务名+参数"可控 → 若 Worker 有危险路径

Cron/调度器:
  任务命令可注入(命令拼接)→ RCE

101.5 配置漂移(Worker 与主应用的差异)

核心认知: Worker 常是"被遗忘的环境"
  □ 更老的操作系统/依赖(未打补丁)
  □ 更宽的权限(直接访问数据库/文件系统)
  □ 缺少 WAF/防护(内网环境)
  □ 独立的环境变量(可能含生产密钥)

攻击价值:
  从 Worker 横向 → 数据库/内网(第 62 章)
  泄露 Worker 环境变量 → 密钥

101.6 重试与死信滥用

重试机制: 失败任务自动重试 → 副作用重复执行
  攻击: 让任务"看起来失败"→ 重复触发副作用(扣款/发信/写库)

死信队列(DLQ): 失败消息集中
  攻击: 读取死信(含失败原因/敏感数据)/ 重新投递

延迟任务: 定时触发 → 投递延迟任务做持久后门

101.7 分析/测试方法论

1. 发现异步组件:
   □ 端口扫描(5672 RabbitMQ/9092 Kafka/6379 Redis)
   □ 主应用配置(环境变量/配置文件里的队列地址)
   □ 前端/文档泄露(队列名称/任务名)
2. 队列访问测试(无认证/弱认证)
3. 消息内容检查(敏感数据/任务结构)
4. 任务参数注入测试(反序列化/命令)
5. Worker 环境评估(权限/配置漂移)
6. 重试/调度滥用
7. 报告: 每个发现+影响

101.8 检查清单

□ 异步组件发现(队列/Worker/调度器)
□ Broker 未授权访问
□ 消息内容泄露
□ 任务注入(pickle/反序列化/命令)
□ Worker 配置漂移(权限/补丁/环境变量)
□ 重试/死信滥用
□ 横向路径(Worker → 数据库/内网)
□ 报告

动手练习

  1. 本地搭 Redis+Celery(无认证),完成"直连 → 投递恶意 pickle 任务 → RCE"。
  2. 分析一个应用的队列配置(环境变量/配置文件),找出队列地址和认证状态。
  3. 模拟"重试滥用":构造一个失败任务,观察重试导致副作用重复。
  4. 画一张"主应用 vs Worker"的环境对比表(权限/补丁/密钥),分析漂移风险。

深入阅读

  • 仓库:CTF-Sandbox-Orchestrator/competition-queue-worker-drift/(队列/Worker CTF 子技能)
  • 仓库:CTF-Sandbox-Orchestrator/competition-queue-worker-drift/references/queue-worker-drift.md
  • 仓库:CTF-Sandbox-Orchestrator/competition-race-condition-state-drift/(竞态配合)
  • 仓库:skills/pentest-tools/references/network-attack-defense.md(内网服务)
  • 外部: Celery 安全文档、RabbitMQ/Kafka 默认配置