漏洞分析 - 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等)发生前后触发的脚本,类似于事件监听器或触发器。

分类

  1. 本地Hooks:触发事件如pull、push、commit、merge等
  2. 服务端Hooks:触发事件如receive等

2.4 TAR压缩包结构

TAR压缩包包含每个文件的元信息:

  • 修改日期
  • 用户名
  • 组名
  • 文件权限等

3. 漏洞分析

3.1 漏洞位置

漏洞存在于Data Center Migration Tool中,该功能允许管理员将Git仓库从Bitbucket Server迁移到Bitbucket Data Center。

3.2 迁移过程

  1. 导出阶段:从Bitbucket Server实例导出Git仓库,生成TAR存档压缩包
  2. 导入阶段:将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存档中文件路径的不安全处理:

  1. 代码缺陷extractToDisk函数直接使用用户控制的路径,未做安全过滤
  2. 路径穿越:攻击者可构造包含../的TAR条目路径,实现任意文件写入
  3. 权限问题:文件权限直接从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实现原理

  1. 通过路径穿越将恶意Git Hook写入hooks/目录
  2. Git Hook脚本具有可执行权限
  3. 当特定Git事件(如push)发生时,Hook脚本被执行

4. 漏洞利用

4.1 利用条件

  • 攻击者需具有Admin角色权限
  • 目标系统运行受影响版本的Bitbucket Data Center

4.2 利用步骤

  1. 构造恶意TAR存档,包含路径穿越的Git Hook脚本
  2. 使用管理员权限导入该存档
  3. 触发Git事件执行Hook脚本

4.3 利用场景

  1. 直接利用:获取管理员凭证后直接导入恶意存档
  2. 间接诱导:诱导管理员导入恶意存档

5. 修复建议

5.1 官方修复

升级到安全版本:

  • ≥ 6.1.2

5.2 临时缓解措施

  • 限制管理员权限
  • 监控可疑的导入操作

6. 总结

CVE-2019-3397是一个典型的由不安全文件解压导致的目录穿越漏洞,结合Git Hook机制实现了RCE。该漏洞的关键在于:

  1. 对用户控制的路径未做安全过滤
  2. 直接信任TAR条目中的文件权限
  3. Git Hook机制提供了代码执行途径

此案例提醒我们在处理压缩文件时,必须对路径进行规范化验证,并对文件权限进行严格控制。

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存档包含以下结构: 其中关键文件是 hooks.atl.tar.atl.gz ,包含Git hooks脚本。 3.4 漏洞原理 漏洞源于对TAR存档中文件路径的不安全处理: 代码缺陷 : extractToDisk 函数直接使用用户控制的路径,未做安全过滤 路径穿越 :攻击者可构造包含 ../ 的TAR条目路径,实现任意文件写入 权限问题 :文件权限直接从TAR条目中获取,可设置可执行权限 3.5 关键代码分析 代码片段1:extractToDisk函数 代码片段2:read函数 代码片段3:TarEntrySource.extractToDisk 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机制提供了代码执行途径 此案例提醒我们在处理压缩文件时,必须对路径进行规范化验证,并对文件权限进行严格控制。