作者:雪诺凛冬实验室 · SuperX
8 月 24 日,Atlassian 发布安全公告,披露了 Bitbucket Server 和 Data Center 在 7.0.0 版中引入了一个严重安全漏洞。
Bitbucket 是 Atlassian 公司提供的一个基于 web 的版本库托管服务,支持 Mercurial 和 Git 版本控制系统。支持私有化部署,根据国内某资产测绘平台数据显示,近一年全球有超过 1w+ 相关服务对外开放。
官方漏洞公告中描述 Bitbucket Server 和 Data Center 多个 API 端点存在命令注入漏洞,漏洞触发条件是攻击者具备公开项目的访问权限或者私有项目的可读权限,影响版本从 7.0 到 8.3 , 官方自评是 CVSS 9.9 分。
历史漏洞回顾
猜测可能是一个 git参数注入漏洞
,往前翻了翻历史上 bitbucket 出现过的 git参数注入漏洞
, 可以熟悉一下相关的系统框架。
CVE-2019-15000 分析
这是一个很有意思的参数注入,可以模拟如下指令:
/usr/bin/git diff -C --color=never -U10000 --dst-prefix=dst:// --src-prefix=src:// <可控sinceId> <可控untilId> -- <可控待diff文件名>
-
使用参数 --no-index
时,可以指定不在目录git仓库下的文件, -
逃逸 --
,--
之后的部分不再包含 参数选项
// 使用output 生成一个 -- 文件
git diff -C --color=never -U10000 --dst-prefix=dst:// --src-prefix=src:// --output=-- edc5e66fd8789e07fbcd45ffcd5284e0ba1b426e -- README.md
// 第一个可控 -- 为选项,第二个 -- 为文件,
/usr/bin/git diff -C --color=never -U10000 --dst-prefix=dst:// --src-prefix=src:// --no-index -- -- /etc/passwd
这样可以输出 diff 结果,达成任意文件读,如果 README可控(项目写入权限),也可以控制 output 达成任意文件写,CVE-2019-20097
中使用 post-receive
方式升级利用从任意文件写到 RCE。
CVE-2019-15010 分析
CVE-2019-15000
的修复是对 commitId 进行检测,对用户输入出现 --
开头进行阻止。
CVE-2019-15010
的exp 使用 %0a
作为开头绕过了 CVE-2019-15000
的补丁,利用方式和 CVE-2019-15000
相同。
在 CVE-2019-15010
补丁中,对 commitId 进行了更为严苛的检测。
CVE-2022-36804 补丁diff
回归到本次关注漏洞的补丁,在官方通告中并没有针对性地给出单个 jar 包的热补丁,使用 8.3.0
和 8.3.1
版本,对比反编译前后的更新代码。
代码变动不算太大,很快定位到 NioProcessParameters
和 NuProcessBuilder
关键修改之处。
领悟一下其修改逻辑,删除了参数和环境变量中的