就在这个月,一位安全研究人员披露了他是如何渗透进微软Visual Studio Code的官方GitHub存储库的。
据了解,微软Visual Studio Code的问题管理功能中存在一个安全漏洞,并且缺少了相应的身份验证检测机制,这将允许研究人员以及网络攻击者能够获取到推送访问,并将其写入到代码库中。
由于这名研究人员负责任地将该漏洞的详细信息上报给了微软的开发团队,这名研究人员也获取到了一笔具体金额不详的漏洞奖金。
据悉,安全研究人员RyotaK当时在乘坐火车的过程中意外发现了微软Visual Studio Code的持续集成(CI)脚本中存在一个漏洞,该漏洞导致他能够渗透进微软Visual Studio Code的官方GitHub存储库并向其提交文件。
RyotaK在接受BleepingComputer的采访时表示:“我当时在火车上实在是太无聊了,所以我打算读一下微软Visual Studio Code的源代码。过了一会儿,我发现VS Code中有一个单独的针对CI的脚本存储库,该代码库名为【vscode-github-triage-actions】。”
很快,这名安全研究人员就发现了该脚本中有一行非常有意思的代码,可以利用它来实现代码注入攻击:
exec(`git -C ./repo merge-base --is-ancestor ${commit} ${release}`, (err) => {
RyotaK还说到:“当然了,这是一个命令注入漏洞。但是该漏洞的利用要求我们获取到‘commit’变量或‘release’变量的控制权。”
研究人员RyotaK很快便意识到,由于以下两个原因,攻击者很可能能够控制commit变量:
closedWith命令中缺乏有效的身份验证机制;
用于验证closedWith命令(在结束注释中指定)的正则表达式存在安全问题;
closedWith命令可以用来在commit关闭之前将commit哈希与问题进行关联。
但是,这里使用了存在安全问题的正则表达式来验证关闭的评论,而且CI脚本中没有任何的身份验证机制,任何用户都可以将commit与一个问题继续宁关联,并在closedWith值中注入代码。具体如下所示:
const closingHashComment = /(?:\\|\/)closedWith (\S*)/
由于Visual Studio Code存在安全问题的CI工作流每天会执行一次,那么在午夜时分,研究人员就可以预先植入一份PoC漏洞利用代码,这样也可以避免在夜间犯任何危险的错误。
为此,研究人员浏览了该项目的GitHub Actions代码文件,以了解持续集成和持续交付(CI/CD)工作流。
研究人员告诉BleepingComputer称:“幸运的是,GitHub Actions的工作流文件是在GitHub上发布的,因此我对GitHub Actions的内部情况还是能够有所了解的。由于actions/checkout是在使用易受攻击的工作流文件之前执行的,因此我们能够获取到对代码库具有写入权限的GitHub令牌,随后我们还将使用到这个令牌。”
通过将我们的PoC漏洞利用代码注入到Visual Studio Code的CI脚本中(该脚本在午夜前后运行),研究人员成功拿到了一个反向Shell。
除此之外,研究人员还拿到了Visual Studio Code代码库的GitHub授权令牌,这个令牌将允许研究人员获取到针对该代码库的写入权限。
最后,在拿到令牌之后,研究人员向代码库发布了一个PoC commit:
研究人员表示,虽然这个代码库的主分支具有基于帐户的分支保护,但GitHub Actions令牌无法绕过这些保护,不过可以使用该令牌将文件推送到发布分支。
值得注意的是,RyotaK在遵守了微软的漏洞奖励计划提交漏洞的同时,也按照微软的“Safe Harbor”准则执行了这一次的PoC攻击。
研究人员RyotaK在其发布的报告中写到:“Microsoft允许通过“Safe Harbor”来诊断和调测漏洞。本文针对该漏洞的介绍符合微软的“Safe Harbor”准则,我们也不建议大家去进行未经授权的漏洞测试!”
研究人员告诉BleepingComputer,由于他发现了这个漏洞,并遵循了负责任的披露准则,他获得了微软提供的一笔金额未披露的现金奖励。
这种类型的安全漏洞将允许攻击者入侵其他安全的软件代码库,从而为更加复杂的软件供应链攻击奠定基础。
毫无疑问,SolarWinds供应链攻击已经成为了安全界的新闻头条。在有针对性的供应链攻击中,针对源代码编辑器和IDE的攻击可能会对其用户、开发人员以及接收使用问题IDE构建的应用程序的客户端造成毁灭性的后果。