漏洞分析 - Atlassian Bitbucket Data Center目录穿越漏洞到RCE(CVE-2019-3397)
字数 1869 2025-08-27 12:33:49
Atlassian Bitbucket Data Center 目录穿越漏洞到RCE (CVE-2019-3397) 教学文档
1. 漏洞概述
1.1 漏洞描述
CVE-2019-3397是Atlassian Bitbucket Data Center中的一个目录穿越漏洞,位于Data Center migration tool功能中。该漏洞源于对GZip压缩过的TAR存档文件的不安全解压操作,导致攻击者可以实现路径穿越并最终达成远程代码执行(RCE)。
1.2 漏洞影响
- 影响范围:具有管理员权限的授权用户
- 攻击结果:可将文件写入任意位置,导致远程代码执行
- 受影响版本:
- 5.13.0 ≤ version < 5.13.6
- 5.14.0 ≤ version < 5.14.4
- 5.15.0 ≤ version < 5.15.3
- 5.16.0 ≤ version < 5.16.3
- 6.0.0 ≤ version < 6.0.3
- 6.1.0 ≤ version < 6.1.2
1.3 漏洞评级
CVSS v3评分:9.1(严重)
- 攻击向量:网络
- 攻击复杂度:低
- 所需权限:高(管理员)
- 用户交互:无
2. 前置知识
2.1 Bitbucket Data Center
Atlassian Bitbucket Data Center是一个本地Git仓库管理系统,具有高可用性等优点,适合大型企业使用。
2.2 Bitbucket用户角色
- Bitbucket User
- Project Creator
- Admin
- System Admin
2.3 Git Hooks
Git Hooks是在Git特定事件(如commit、push等)发生前后触发的脚本,类似于事件监听器或触发器。
分类:
- 本地Hooks:触发事件如pull、push、commit、merge等
- 服务端Hooks:触发事件如receive等
2.4 TAR压缩包结构
TAR压缩包包含每个文件的元信息:
- 修改日期
- 用户名
- 组名
- 文件权限等
3. 漏洞分析
3.1 漏洞位置
漏洞存在于Data Center Migration Tool中,该功能允许管理员将Git仓库从Bitbucket Server迁移到Bitbucket Data Center。
3.2 迁移过程
- 导出阶段:从Bitbucket Server实例导出Git仓库,生成TAR存档压缩包
- 导入阶段:将TAR存档导入到目标系统(Bitbucket Data Center)
3.3 正常TAR存档结构
导出的TAR存档包含以下结构:
_repository/hierarchy_begin/c3b3efc5cb93609ad4fc_
_repository/hierarchy_end/c3b3efc5cb93609ad4fc
com.atlassian.bitbucket.server.bitbucket-instance-migration_instanceDetails/instance-details.json.atl.gz
com.atlassian.bitbucket.server.bitbucket-instance-migration_metadata/project_68/project.json.atl.gz
com.atlassian.bitbucket.server.bitbucket-instance-migration_metadata/project_68/repository_59.json.atl.gz
com.atlassian.bitbucket.server.bitbucket-instance-migration_permissions/project/68/all-permissions.json.atl.gz
com.atlassian.bitbucket.server.bitbucket-instance-migration_permissions/project/68/permissions.json.atl.gz
com.atlassian.bitbucket.server.bitbucket-instance-migration_permissions/repository/59/permissions.json.atl.gz
com.atlassian.bitbucket.server.bitbucket-git_git/repositories/59/hooks/hooks.atl.tar.atl.gz
com.atlassian.bitbucket.server.bitbucket-git_git/repositories/59/contents/objects.atl.tar
com.atlassian.bitbucket.server.bitbucket-git_git/repositories/59/metadata/metadata.atl.tar.atl.gz
com.atlassian.bitbucket.server.bitbucket-git-lfs_gitLfsSettings/59/git-lfs-settings.json.atl.gz
其中关键文件是hooks.atl.tar.atl.gz,包含Git hooks脚本。
3.4 漏洞原理
漏洞源于对TAR存档中文件路径的不安全处理:
- 代码缺陷:
extractToDisk函数直接使用用户控制的路径,未做安全过滤 - 路径穿越:攻击者可构造包含
../的TAR条目路径,实现任意文件写入 - 权限问题:文件权限直接从TAR条目中获取,可设置可执行权限
3.5 关键代码分析
代码片段1:extractToDisk函数
public void extractToDisk(@Nonnull Path target, @Nonnull Predicate<String> filter) throws IOException {
this.read((entrySource) -> { //lambda expression
Path entryPath = entrySource.getPath();
String filename = entryPath.getFileName().toString();
entrySource.extractToDisk(target.resolve(entryPath));
}, filter);
}
代码片段2:read函数
public void read(@Nonnull IoConsumer<EntrySource> reader, @Nonnull Predicate<String> filter) throws IOException {
TarArchiveEntry entry;
while ((entry = (TarArchiveEntry) inputStream.getNextEntry()) != null) {
InputStream entryInputStream = new CloseShieldInputStream(inputStream);
String name = entry.getName();
if (filter.test(name)) {
reader.accept(new TarEntrySource(entryInputStream, Paths.get(name), entry)
}
}
}
代码片段3:TarEntrySource.extractToDisk
private static class TarEntrySource extends DefaultEntrySource {
public void extractToDisk(@Nonnull Path target) throws IOException {
Files.createDirectories(target.getParent());
OutputStream out = new FileOutputStream(target.toFile());
IoUtils.copy(this.inputStream, out, 32768);
PosixFileAttributeView fileAttributeView = (PosixFileAttributeView)Files.getFileAttributeView(target, PosixFileAttributeView.class);
fileAttributeView.setPermissions(FilePermissionUtils.toPosixFilePermissions(this.tarArchiveEntry.getMode()));
}
}
3.6 RCE实现原理
- 通过路径穿越将恶意Git Hook写入
hooks/目录 - Git Hook脚本具有可执行权限
- 当特定Git事件(如push)发生时,Hook脚本被执行
4. 漏洞利用
4.1 利用条件
- 攻击者需具有Admin角色权限
- 目标系统运行受影响版本的Bitbucket Data Center
4.2 利用步骤
- 构造恶意TAR存档,包含路径穿越的Git Hook脚本
- 使用管理员权限导入该存档
- 触发Git事件执行Hook脚本
4.3 利用场景
- 直接利用:获取管理员凭证后直接导入恶意存档
- 间接诱导:诱导管理员导入恶意存档
5. 修复建议
5.1 官方修复
升级到安全版本:
- ≥ 6.1.2
5.2 临时缓解措施
- 限制管理员权限
- 监控可疑的导入操作
6. 总结
CVE-2019-3397是一个典型的由不安全文件解压导致的目录穿越漏洞,结合Git Hook机制实现了RCE。该漏洞的关键在于:
- 对用户控制的路径未做安全过滤
- 直接信任TAR条目中的文件权限
- Git Hook机制提供了代码执行途径
此案例提醒我们在处理压缩文件时,必须对路径进行规范化验证,并对文件权限进行严格控制。