JumpServer 远程代码执行 CVE-2024-29201&&CVE-2024-29202 漏洞分析
字数 1992 2025-08-23 18:31:24
JumpServer 远程代码执行漏洞分析 (CVE-2024-29201 & CVE-2024-29202)
漏洞概述
JumpServer 是一款开源的堡垒机系统,在 2024 年披露了两个高危远程代码执行漏洞:
- CVE-2024-29201:通过 Playbook 功能实现的远程代码执行漏洞
- CVE-2024-29202:与 Jinja2 模板引擎相关的远程代码执行漏洞
这两个漏洞都允许攻击者在 JumpServer 容器环境中执行任意命令。
环境准备
JumpServer 基于 Docker 部署,标准环境包含以下容器:
- jms_web (192.168.250.11):Web 前端,映射端口 80
- jms_core (192.168.250.4):核心服务
- jms_celery (192.168.250.3):异步任务处理
- jms_redis (192.168.250.10):缓存服务
- jms_mysql (192.168.250.5):数据库服务
漏洞复现 (CVE-2024-29201)
攻击流程
- 创建 Playbook:生成一个 Playbook ID
- 上传恶意 YAML:通过 PATCH 方法向
<playbook_id>/file上传恶意 playbook - 绑定资产:将资产 ID 与 Playbook 绑定,获取 job ID
- 执行作业:执行 job 并获取 task ID
恶意 Playbook 示例
[{
"name": "RCE playbook",
"hosts": "all",
"tasks": [{
"name": "this runs in Celery container",
"shell": "id > /tmp/pwnd",
"\u0064elegate_to": "localhost"
}],
"vars": {
"ansible_\u0063onnection": "local"
}
}]
关键点:
- 使用 Unicode 编码绕过过滤(
\u0064elegate_to对应delegate_to) - 设置
ansible_connection: local使命令在本地执行
漏洞分析
数据流分析
- 攻击请求通过 jms_web (80端口) 接收
- jms_web 将请求转发给 jms_core
- Playbook 文件最终落地在 jms_core 容器中:
/opt/jumpserver/data/ops/playbook/<playbook_id>/main.yml - 命令执行实际发生在 jms_celery 容器中
通信分析
- jms_web 与 jms_core 直接通信
- jms_celery 仅与 jms_redis 和 jms_mysql 通信
- Playbook 内容未在数据库或 Redis 中存储,但执行结果存储在 MySQL 中
代码分析
漏洞点
-
PlaybookRunner 类 (
apps/ops/ansible/runner.py):- 使用
ansible_runner.run执行 playbook - 传入
playbook_path,inventory_path,project_directory即可执行命令
- 使用
-
过滤机制绕过:
- 使用 Unicode 编码绕过
check_danger_keywords检查 - 原始过滤正则无法检测编码后的危险关键词
- 使用 Unicode 编码绕过
补丁分析
- 将
PlaybookRunner替换为SuperPlaybookRunner(子类)- 新增
"LOCAL_CONNECTION_ENABLED": "1"条件
- 新增
- 升级 ansible-core 版本
- 修改
local.py增加本地连接禁用判断
- 修改
- 执行流程分离:
manager.py使用SuperPlaybookRunner(允许本地连接)job.py使用PlaybookRunner(禁止本地连接)
执行流程
- 获取 job
- 检查 playbook 危险词
- 通过
get_runner向 ansible 下发命令 - 执行
self.current_job.playbook.entry
CVE-2024-29202 分析
- 与 Jinja2 模板引擎相关
- 修复方式:使用
SandboxedEnvironment替代NativeEnvironment - 利用方式与 CVE-2024-29201 类似
关键疑问
数据流不完整问题:
- YAML 文件存储在 jms_core
- 命令执行在 jms_celery
- 但 jms_core 与 jms_celery 无直接通信
- 数据库和 Redis 中未发现序列化的 playbook 内容
可能的解释:
- 通过任务队列系统(如 Celery)传递执行指令
- 文件系统可能通过共享卷实现容器间访问
防御建议
- 及时升级到修复版本
- 限制 Playbook 上传权限
- 加强输入验证,特别是对 Unicode 编码的检测
- 实施最小权限原则,限制容器间通信
总结
这两个漏洞都利用了 JumpServer 对用户输入验证不足的弱点,通过精心构造的输入绕过安全检测,最终在容器环境中实现远程代码执行。漏洞的修复涉及框架核心组件的升级和安全策略的调整,体现了防御纵深的重要性。