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)时,这些环境变量会被解析并执行。
关键点分析
-
环境变量注入点:
- 系统将用户名设置为
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 服务:
service atlbitbucket stop service atlbitbucket start -
使用 IDEA 配置远程调试连接到端口 5005
漏洞修复分析
通过对比修复前后的版本(如 7.6.18 和 7.6.19),发现以下关键变化:
-
修改的 JAR 文件:
bitbucket-process-*.jarnuprocess-*.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