当所有扩展都被禁用时,这个问题是否会发生?:是的
- VS Code 版本:1.70.1
- OS 版本:macOS 12.5
这似乎不符合您在 security policy 中定义的安全漏洞定义,但令人担忧,所以我将其作为标准错误报告提出。
重现步骤:
- 在 vscode 终端中运行这个看似无害的 curl 请求:
curl https://davidje13.github.io/vscode-command-test/info.txt
(您可以在这里看到正在下载的文件以及用于生成它的纯文本脚本:https://github.com/davidje13/vscode-command-test )
它将输出:“你好,这里是一些合法的内容”
- 运行命令
workbench.action.terminal.runRecentCommand
(例如,如果遵循文档中的建议,可以使用 Cmd+R / Ctrl+R) - 注意
make
(以及可能的npm install
,但一次添加多个命令似乎不太可靠)已经出现在列表中。注意运行其中一个命令将执行预期的命令,后面跟着(不存在的)badcommand
可执行文件(实际上,这显然可以是任何东西)
此示例使用 curl
ing 一个 URL,但它适用于任何恶意行为者可以操纵终端显示的命令结果的情况(例如,即使禁用了脚本,npm 包安装信息也可以显示,或者通过此终端运行本地服务器时显示服务器日志输出)。
幸运的是,这个列表似乎只用于(到目前为止)命令历史记录功能,该功能默认未启用。
这里有两个问题:
- 有可能在这个列表中静默注册命令 — 甚至可以从只能输出文本的位置 — 通过使用 VSCode 转义序列
\033]633;E;%s\007
(上面的示例在注册多个命令时添加了一些其他序列以提高可靠性) - 可以通过添加任意数量的空格来隐藏命令的恶意部分(在上面的示例中,命令的“合法”部分后面跟了许多空格以确保“恶意”部分不可见,用户在运行它之前唯一知道出问题的迹象是“...”)
对于第一个问题,向转义序列添加每个会话或每次安装的随机“密码”可能足以防止大多数攻击(因为访问此“密码”很可能需要脚本级访问权限)
对于第二个问题,折叠显示中的多个空格可能会有所帮助,但还有其他方法可以混淆这种事情。
4条答案
按热度按时间r6l8ljro1#
感谢报告!我们对此进行了讨论,认为解决第二个问题主要解决了第一个问题,同时不会限制或使我们使用的协议过于复杂。当前建议:
⋯
,这与编辑器中空白显示的方式相似,这与我们的\n
->⏎
转换类似对于密码/随机数方法,我们可以走这条路,但鉴于上述操作,我更担心程序滥用协议,用不需要的命令填充命令列表,而不是恶意命令。如果我们发现需要,我们可以稍后研究这个问题。
我们也可以为用户添加一个对话框来确认长命令,但我真的不希望剥夺这个功能的可用性。未来迭代可能会使用编辑器中更接近自动完成UI的东西,届时我们可以将完整命令放在详细信息中。
8yoxcaq72#
@Tyriar ,这可以避免超级微不足道的攻击,但很容易绕过这种保护:
执行时肯定更容易察觉,但那时已经太晚了(我相信只要付出努力就能找到更微妙的方法;这只是我脑海中第一个想到的东西)
ryoqjall3#
@davidje13 再次感谢你。这就是在细节中调用长命令并让你预览它们的地方。我们也在考虑在细节部分支持多行,这可能让我们预览整个命令 $x_{1e0f1}^{x}$
wlsrxk514#
澄清状态:这是一个在 #153095 上被阻止的功能请求。