JumpServer 远程代码执行 CVE-2024-29201&&CVE-2024-29202 漏洞分析
字数 1992 2025-08-23 18:31:24

JumpServer 远程代码执行漏洞分析 (CVE-2024-29201 & CVE-2024-29202)

漏洞概述

JumpServer 是一款开源的堡垒机系统,在 2024 年披露了两个高危远程代码执行漏洞:

  1. CVE-2024-29201:通过 Playbook 功能实现的远程代码执行漏洞
  2. 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)

攻击流程

  1. 创建 Playbook:生成一个 Playbook ID
  2. 上传恶意 YAML:通过 PATCH 方法向 <playbook_id>/file 上传恶意 playbook
  3. 绑定资产:将资产 ID 与 Playbook 绑定,获取 job ID
  4. 执行作业:执行 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 使命令在本地执行

漏洞分析

数据流分析

  1. 攻击请求通过 jms_web (80端口) 接收
  2. jms_web 将请求转发给 jms_core
  3. Playbook 文件最终落地在 jms_core 容器中:
    /opt/jumpserver/data/ops/playbook/<playbook_id>/main.yml
    
  4. 命令执行实际发生在 jms_celery 容器中

通信分析

  • jms_web 与 jms_core 直接通信
  • jms_celery 仅与 jms_redis 和 jms_mysql 通信
  • Playbook 内容未在数据库或 Redis 中存储,但执行结果存储在 MySQL 中

代码分析

漏洞点

  1. PlaybookRunner 类 (apps/ops/ansible/runner.py):

    • 使用 ansible_runner.run 执行 playbook
    • 传入 playbook_path, inventory_path, project_directory 即可执行命令
  2. 过滤机制绕过

    • 使用 Unicode 编码绕过 check_danger_keywords 检查
    • 原始过滤正则无法检测编码后的危险关键词

补丁分析

  1. PlaybookRunner 替换为 SuperPlaybookRunner(子类)
    • 新增 "LOCAL_CONNECTION_ENABLED": "1" 条件
  2. 升级 ansible-core 版本
    • 修改 local.py 增加本地连接禁用判断
  3. 执行流程分离:
    • manager.py 使用 SuperPlaybookRunner(允许本地连接)
    • job.py 使用 PlaybookRunner(禁止本地连接)

执行流程

  1. 获取 job
  2. 检查 playbook 危险词
  3. 通过 get_runner 向 ansible 下发命令
  4. 执行 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)传递执行指令
  • 文件系统可能通过共享卷实现容器间访问

防御建议

  1. 及时升级到修复版本
  2. 限制 Playbook 上传权限
  3. 加强输入验证,特别是对 Unicode 编码的检测
  4. 实施最小权限原则,限制容器间通信

总结

这两个漏洞都利用了 JumpServer 对用户输入验证不足的弱点,通过精心构造的输入绕过安全检测,最终在容器环境中实现远程代码执行。漏洞的修复涉及框架核心组件的升级和安全策略的调整,体现了防御纵深的重要性。

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 示例 关键点: 使用 Unicode 编码绕过过滤( \u0064elegate_to 对应 delegate_to ) 设置 ansible_connection: local 使命令在本地执行 漏洞分析 数据流分析 攻击请求通过 jms_ web (80端口) 接收 jms_ web 将请求转发给 jms_ core Playbook 文件最终落地在 jms_ core 容器中: 命令执行实际发生在 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 检查 原始过滤正则无法检测编码后的危险关键词 补丁分析 将 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 对用户输入验证不足的弱点,通过精心构造的输入绕过安全检测,最终在容器环境中实现远程代码执行。漏洞的修复涉及框架核心组件的升级和安全策略的调整,体现了防御纵深的重要性。