窃取任意GitHub Actions敏感信息如此简单,只需要分支改个名?

【CSDN 编者按】对于软件中存在的漏洞 , 工程师一般会优先修复那些影响用户数多的漏洞 , 比如导致服务器死机的漏洞 。 但一些特殊情况下才会出现且的漏洞 , 不易被人发现 , 就会长时间存在 。 本文就介绍了作者发现了GitHub上不易察觉的安全漏洞 , 通过这个漏洞可以窃取GitHub Actions上的敏感信息 , 并且作者还尝试用不同方法来触发漏洞看看还是否存在其他漏洞 。 一起来看看吧 。
原文链接:https://blog.teddykatz.com/2022/02/23/ghosts-of-branches-past.html
译者 | 章雨铭 责编 | 屠敏
出品 | CSDN(ID:CSDNnews)
不久前 , 我在GitHub中发现的一个安全漏洞 , 这个漏洞会让攻击者获得对几乎所有公共库的写入权限 。 下面是简单回顾 。

  • GitHub上的每个拉取请求都有一个 "基分支" , 也就是与拉取请求相同的库中的一个git分支 。
  • GitHub Actions有时会执行拉取请求的基分支的代码 , 使代码能够访问库的敏感信息 。 (具体来说 , 如果基分支有一个 pull_request_target 工作流 , 就会发生这种情况) 。 这通常是安全的 , 因为任何可能推送到基分支的人都可以直接写到库 。
  • 由于一时疏忽 , 用户将其拉取请求的"基分支"名称设置为commit hash , 而不是一个真正的分支 。
  • 因此 , 攻击者可以从fork中创建一个拉取请求 , 然后将"基分支"改为commit hash , 在攻击者的fork中的恶意commit 。 由于commit hash在fork中是共享的 , GitHub Actions会执行这个恶意commit的代码 , 使其能够访问父存储库及其敏感信息 。
这篇文章描述了我在GitHub中发现的一个不同的安全漏洞 , 使用了类似的攻击策略 。
Git、GitHub和异常的分支名称
去年夏天 , 我观察了git和GitHub对异常的分支名的表现 。
【窃取任意GitHub Actions敏感信息如此简单,只需要分支改个名?】在某些地方 , git CLI允许使用分支或commit hash 。 例如 , 要切换到一个叫 my-branch的分支 , 下面这个就可以使用 。
$git checkout my-branch同样地 , 要切换到一个特定的commit , 可以使用commit hash作为命令行参数 。
$git checkout a047be85247755cdbe0acce6f1dafc8beb84f2ac我们还可以自己给分支命名 。 如果创建一个名为
$ git branch a047be 85247755cdbe0acce6f1dafc8beb84f2ac$ git checkout a047be85247755cdbe0acce6f1dafc8beb84f2ac warning:refname 'a047be85247755cdbe0acce6f1dafc8beb84f2ac'is ambiguous.... $ git branch* a047be85247755cdbe0acce6f1dafc8beb84f2acmain
另一方面 , GitHub返回了一个错误:[1]
$ git pushremote: error: GH002: Sorry, branch ortag names consisting of 40hexcharacters are notallowed. remote: error: Invalid branch ortag name "a047be85247755cdbe0acce6f1dafc8beb84f2ac"dafc8beb84f2ac "这没什么意思 。 但如果我们用commit的短hash来命名分支 , 而不是用完整的hash来命名呢?
$ git branch a047be8$ git checkout a047be8$ # ...$ git push* [new branch] a047be8 -> a047be8branch 'a047be8'set up to track 'a047be8'GitHub接受了这次拉取!我们成功创建了一个模棱两可的分支 。
和分支同名的短hash
总结一下上一节的内容:
  • 我们在GitHub库中有一个commit , 其短hash为 a047be8。
  • 再推送一个名为 a047be8 的分支到同一个库 。
此时 , 当我们访问 github.com/someone/some-repo/tree/a047be8时 , GitHub选择显示 a047be8分支的文件 , 而不是显示 a047be8commit的文件 。[2]这很合理 。 如果GitHub将 a047be8解析为一个commit短hash , 那么就不能用这个名字来指代这个分支了 。 就目前而言 , 将 a047be8解析为一个分支 , 只会在有人在URL中使用短hash并期望它解析为一个commit时产生问题 。 但这种情况是不可取的 , 因为如果发生短hash冲突 , 它也会失败 。

特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。