Bitbucket Server and Data Center 命令注入漏洞(CVE-2022-43781)
字数 1561 2025-08-26 22:11:57

Bitbucket Server and Data Center 命令注入漏洞(CVE-2022-43781) 分析文档

漏洞概述

Atlassian Bitbucket Server 和 Data Center 是一款现代化代码协作平台,支持代码审查、分支权限管理、CI/CD等功能。该漏洞允许具有控制用户名权限的攻击者通过环境变量注入在系统上执行任意命令。

影响版本

  • Bitbucket Data Center and Server 7.0 到 7.21 的所有版本
  • 如果在 bitbucket.properties 中设置了 mesh.enabled=false,则以下版本也会受影响:
    • 8.0.0 到 8.0.4
    • 8.1.0 到 8.1.4
    • 8.2.0 到 8.2.3
    • 8.3.0 到 8.3.2
    • 8.4.0 到 8.4.1

漏洞原理

漏洞存在于 Bitbucket 处理环境变量的方式中,特别是与用户名相关的 REMOTE_USER 环境变量。攻击者可以通过注册包含恶意环境变量定义的用户名,当系统执行 Git 命令(如 git diff)时,这些环境变量会被解析并执行。

关键点分析

  1. 环境变量注入点

    • 系统将用户名设置为 REMOTE_USER 环境变量
    • 攻击者可以在用户名中注入其他环境变量定义
  2. 漏洞触发流程

    • RemoteUserNioProcessConfigurer 类将当前用户名设置为 REMOTE_USER 环境变量
    • 环境变量通过 NuProcessBuilder.run 方法处理
    • 最终在 LinuxProcess.prepareProcess 中环境变量被转换为字节数组
    • 空字节(\0)可用于分隔多个环境变量定义
  3. Git 环境变量利用

    • Git 会读取特定环境变量执行命令
    • 例如 GIT_EXTERNAL_DIFF 环境变量可在执行 git diff 时触发

调试环境设置

  1. 设置 JVM 调试参数:

    • _start-webapp.sh 中找到 JAVA_OPTS 参数
    • 添加:-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n
  2. 重启 Bitbucket 服务:

    service atlbitbucket stop
    service atlbitbucket start
    
  3. 使用 IDEA 配置远程调试连接到端口 5005

漏洞修复分析

通过对比修复前后的版本(如 7.6.18 和 7.6.19),发现以下关键变化:

  1. 修改的 JAR 文件:

    • bitbucket-process-*.jar
    • nuprocess-*.jar
  2. 主要修复点:

    • DefaultNioProcessConfigurer.java 改用 NioProcessParameters.environmentPutIfAbsent 函数
    • 新增的空字节检测:
      • 对 key 进行非空判断
      • 对 key 和 value 进行空字节检测

漏洞复现步骤

  1. 注册恶意用户名:

    • 用户名格式:test GIT_EXTERNAL_DIFF=touch /tmp/test
    • 将空格替换为 %00(空字节)
  2. 触发漏洞:

    • 登录后进入仓库执行 diff 操作
    • 系统会执行 git diff 命令并解析恶意环境变量
  3. 验证:

    • 检查 /tmp/test 文件是否被创建

防护建议

  1. 立即升级到不受影响的版本
  2. 如果无法立即升级:
    • 限制用户注册和用户名格式
    • 监控系统日志中的可疑命令执行
  3. 避免在 bitbucket.properties 中设置 mesh.enabled=false

参考链接

Bitbucket Server and Data Center 命令注入漏洞(CVE-2022-43781) 分析文档 漏洞概述 Atlassian Bitbucket Server 和 Data Center 是一款现代化代码协作平台,支持代码审查、分支权限管理、CI/CD等功能。该漏洞允许具有控制用户名权限的攻击者通过环境变量注入在系统上执行任意命令。 影响版本 Bitbucket Data Center and Server 7.0 到 7.21 的所有版本 如果在 bitbucket.properties 中设置了 mesh.enabled=false ,则以下版本也会受影响: 8.0.0 到 8.0.4 8.1.0 到 8.1.4 8.2.0 到 8.2.3 8.3.0 到 8.3.2 8.4.0 到 8.4.1 漏洞原理 漏洞存在于 Bitbucket 处理环境变量的方式中,特别是与用户名相关的 REMOTE_USER 环境变量。攻击者可以通过注册包含恶意环境变量定义的用户名,当系统执行 Git 命令(如 git diff )时,这些环境变量会被解析并执行。 关键点分析 环境变量注入点 : 系统将用户名设置为 REMOTE_USER 环境变量 攻击者可以在用户名中注入其他环境变量定义 漏洞触发流程 : RemoteUserNioProcessConfigurer 类将当前用户名设置为 REMOTE_USER 环境变量 环境变量通过 NuProcessBuilder.run 方法处理 最终在 LinuxProcess.prepareProcess 中环境变量被转换为字节数组 空字节( \0 )可用于分隔多个环境变量定义 Git 环境变量利用 : Git 会读取特定环境变量执行命令 例如 GIT_EXTERNAL_DIFF 环境变量可在执行 git diff 时触发 调试环境设置 设置 JVM 调试参数: 在 _start-webapp.sh 中找到 JAVA_OPTS 参数 添加: -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=5005,server=y,suspend=n 重启 Bitbucket 服务: 使用 IDEA 配置远程调试连接到端口 5005 漏洞修复分析 通过对比修复前后的版本(如 7.6.18 和 7.6.19),发现以下关键变化: 修改的 JAR 文件: bitbucket-process-*.jar nuprocess-*.jar 主要修复点: DefaultNioProcessConfigurer.java 改用 NioProcessParameters.environmentPutIfAbsent 函数 新增的空字节检测: 对 key 进行非空判断 对 key 和 value 进行空字节检测 漏洞复现步骤 注册恶意用户名: 用户名格式: test GIT_EXTERNAL_DIFF=touch /tmp/test 将空格替换为 %00 (空字节) 触发漏洞: 登录后进入仓库执行 diff 操作 系统会执行 git diff 命令并解析恶意环境变量 验证: 检查 /tmp/test 文件是否被创建 防护建议 立即升级到不受影响的版本 如果无法立即升级: 限制用户注册和用户名格式 监控系统日志中的可疑命令执行 避免在 bitbucket.properties 中设置 mesh.enabled=false 参考链接 Git 环境变量文档 漏洞分析文章 调试环境设置参考