Visual Studio Code GitHub 仓库渗透分析教学文档
漏洞概述
2021年1月,安全研究人员RyotaK披露了微软Visual Studio Code官方GitHub存储库中的一个严重安全漏洞。该漏洞存在于VS Code的问题管理功能中,涉及以下关键问题:
- 持续集成(CI)脚本中的命令注入漏洞
- 缺少身份验证检测机制
- 存在安全问题的正则表达式验证
这些漏洞组合使得攻击者能够获取推送访问权限,并向代码库提交文件。
漏洞发现过程
研究人员RyotaK在火车上阅读VS Code源代码时,发现了一个名为vscode-github-triage-actions的专门用于CI的脚本存储库。通过分析该代码库,发现了关键漏洞。
技术细节分析
1. 命令注入漏洞
在CI脚本中发现的关键漏洞代码如下:
exec(`git -C ./repo merge-base --is-ancestor ${commit} ${release}`, (err) => {
这段代码存在命令注入风险,因为攻击者可以控制commit或release变量。
2. 变量控制途径
攻击者能够控制commit变量,原因有二:
closedWith命令缺乏有效的身份验证机制- 用于验证
closedWith命令的正则表达式存在安全问题
3. 正则表达式漏洞
验证关闭评论的正则表达式存在问题:
const closingHashComment = /closedWith (\S*)/;
这个正则表达式过于宽松,允许在closedWith值中注入代码。
漏洞利用过程
1. 利用时间窗口
VS Code存在问题的CI工作流每天执行一次,研究人员选择在午夜时分预先植入PoC漏洞利用代码,避免干扰正常操作。
2. GitHub Actions分析
研究人员分析了该项目的GitHub Actions代码文件,发现:
actions/checkout在使用易受攻击的工作流文件之前执行- 可以获取对代码库具有写入权限的GitHub令牌
3. 反向Shell获取
通过将PoC漏洞利用代码注入到VS Code的CI脚本中(该脚本在午夜运行),研究人员成功获取了一个反向Shell。
4. GitHub授权令牌获取
利用该漏洞,研究人员获得了Visual Studio Code代码库的GitHub授权令牌,该令牌提供了对代码库的写入权限。
实际影响
虽然代码库的主分支有基于帐户的分支保护(GitHub Actions令牌无法绕过),但攻击者可以使用该令牌将文件推送到发布分支。
安全建议
1. 修复措施
- 加强命令执行的安全性,使用参数化查询或严格输入验证
- 实现严格的身份验证机制
- 修正正则表达式,使用更严格的模式验证输入
2. 防御策略
- 实施最小权限原则,限制CI/CD流程的权限
- 定期审计自动化脚本和CI/CD流程
- 实施代码审查流程,特别是对于涉及系统命令执行的代码
负责任的披露
研究人员RyotaK遵循了微软的"Safe Harbor"准则和漏洞奖励计划:
- 仅用于诊断和调测漏洞
- 不进行未经授权的漏洞测试
- 及时向微软报告漏洞
作为回报,研究人员获得了微软提供的漏洞奖金。
潜在风险
此类漏洞可能被用于软件供应链攻击,类似于SolarWinds事件。针对源代码编辑器和IDE的攻击可能对开发人员和最终用户造成严重后果。
总结
此案例展示了即使是大型科技公司如微软,也可能在自动化流程中存在严重安全漏洞。它强调了:
- CI/CD流程安全的重要性
- 输入验证和身份验证的必要性
- 定期安全审计的价值
- 负责任的漏洞披露流程的有效性
开发团队应从此案例中学习,加强自身代码库的安全防护措施。