已于 2021 年 2 月 10 日修复,修复提交:https://github.com/microsoft/vscode-npm-scripts/commit/cdd5e507564e0cc0f60bcccf184822be3fd73e07
漏洞公告:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-26700
eg2.vscode-npm-script VSCode 扩展(测试版本为 0.3.13)中存在远程代码执行漏洞,这意味着项目中的恶意 .vscode/settings.json 文件可在查看名为 package.json 的文件时触发远程代码执行。
此漏洞不在任何活跃的 Microsoft 漏洞奖励计划范围内,但已向 MSRC 报告并得到处理。
在未设置恶意 .vscode/settings.json 文件的仓库中,当安装了 eg2.vscode-npm-script 扩展并查看 package.json 文件时,会执行命令 npm ls --depth 0 --json。
如果攻击者在项目的 settings.json 中将 npm.bin 键设置为例如 ./payload.sh,则查看 package.json 时会转而从包含 package.json 的目录中执行 ./payload.sh ls --depth 0 --json。
此漏洞打破了“可以安全读取源代码”的假设。
攻击者利用此漏洞的示例流程如下:
package.jsonpayload.sh 被执行我看到有两种方法可以减轻恶意 VSCode 工作区 settings.json 带来的风险。
禁止在工作区级别设置该配置。VSCode 已对 git.path、terminal.integrated.shell.linux 等少数设置采用了这种方式。
这可能会破坏部分用户的兼容性,但有先例可循。
参考文档:https://vscode.readthedocs.io/en/latest/getstarted/settings/#settings-and-security
如果该设置在工作区中被定义,则在执行二进制文件前提示用户确认该设置。
这不会破坏现有兼容性,ESLint 扩展自 2.1.7 版本起就采用了这种方法。
eg2.vscode-npm-script(0.3.13 或更早版本)linux-poc 目录作为文件夹打开package.json 文件进行查看/tmp/output.txt 将被创建,以证明命令已执行eg2.vscode-npm-script(0.3.13 或更早版本)windows-poc 目录作为文件夹打开package.json 文件进行查看calc.exe注意:在 Windows 上我无法使用二进制文件的相对路径,但这可能是我对 Windows 不够熟悉所致。