vscode 工作台的轻微污染,操作,终端,运行最近命令列表

omjgkv6w  于 3个月前  发布在  Vscode
关注(0)|答案(4)|浏览(34)

当所有扩展都被禁用时,这个问题是否会发生?:是的

  • VS Code 版本:1.70.1
  • OS 版本:macOS 12.5

这似乎不符合您在 security policy 中定义的安全漏洞定义,但令人担忧,所以我将其作为标准错误报告提出。
重现步骤:

  1. 在 vscode 终端中运行这个看似无害的 curl 请求:
curl https://davidje13.github.io/vscode-command-test/info.txt

(您可以在这里看到正在下载的文件以及用于生成它的纯文本脚本:https://github.com/davidje13/vscode-command-test )
它将输出:“你好,这里是一些合法的内容”

  1. 运行命令 workbench.action.terminal.runRecentCommand (例如,如果遵循文档中的建议,可以使用 Cmd+R / Ctrl+R)
  2. 注意 make (以及可能的 npm install,但一次添加多个命令似乎不太可靠)已经出现在列表中。注意运行其中一个命令将执行预期的命令,后面跟着(不存在的) badcommand 可执行文件(实际上,这显然可以是任何东西)

此示例使用 curl ing 一个 URL,但它适用于任何恶意行为者可以操纵终端显示的命令结果的情况(例如,即使禁用了脚本,npm 包安装信息也可以显示,或者通过此终端运行本地服务器时显示服务器日志输出)。
幸运的是,这个列表似乎只用于(到目前为止)命令历史记录功能,该功能默认未启用。
这里有两个问题:

  1. 有可能在这个列表中静默注册命令 — 甚至可以从只能输出文本的位置 — 通过使用 VSCode 转义序列 \033]633;E;%s\007 (上面的示例在注册多个命令时添加了一些其他序列以提高可靠性)
  2. 可以通过添加任意数量的空格来隐藏命令的恶意部分(在上面的示例中,命令的“合法”部分后面跟了许多空格以确保“恶意”部分不可见,用户在运行它之前唯一知道出问题的迹象是“...”)
    对于第一个问题,向转义序列添加每个会话或每次安装的随机“密码”可能足以防止大多数攻击(因为访问此“密码”很可能需要脚本级访问权限)
    对于第二个问题,折叠显示中的多个空格可能会有所帮助,但还有其他方法可以混淆这种事情。
r6l8ljro

r6l8ljro1#

感谢报告!我们对此进行了讨论,认为解决第二个问题主要解决了第一个问题,同时不会限制或使我们使用的协议过于复杂。当前建议:

  • 将3个或更多空格折叠为 ,这与编辑器中空白显示的方式相似,这与我们的 \n -> 转换类似
  • 理想情况下,这应该是不同的颜色以区分,但这是在 Support SGR ANSI escape sequences in quick pick labels #158192 上被阻止的
  • 对于长命令,也许可以利用快速选择的“详细信息”来显示第二行,并可能添加一个预览命令的按钮。我们仍在考虑这个问题

对于密码/随机数方法,我们可以走这条路,但鉴于上述操作,我更担心程序滥用协议,用不需要的命令填充命令列表,而不是恶意命令。如果我们发现需要,我们可以稍后研究这个问题。
我们也可以为用户添加一个对话框来确认长命令,但我真的不希望剥夺这个功能的可用性。未来迭代可能会使用编辑器中更接近自动完成UI的东西,届时我们可以将完整命令放在详细信息中。

8yoxcaq7

8yoxcaq72#

@Tyriar ,这可以避免超级微不足道的攻击,但很容易绕过这种保护:

echo "Hello here is some legitimate content" > info.txt
PAD="  \342\201\257"
MPAD="$PAD$PAD$PAD$PAD$PAD$PAD$PAD$PAD$PAD$PAD"
printf "\033]633;E;npm install$MPAD$MPAD$MPAD$MPAD$MPAD$MPAD$MPAD$MPAD$MPAD$MPAD & badcommand\007" >> info.txt

执行时肯定更容易察觉,但那时已经太晚了(我相信只要付出努力就能找到更微妙的方法;这只是我脑海中第一个想到的东西)

ryoqjall

ryoqjall3#

@davidje13 再次感谢你。这就是在细节中调用长命令并让你预览它们的地方。我们也在考虑在细节部分支持多行,这可能让我们预览整个命令 $x_{1e0f1}^{x}$

wlsrxk51

wlsrxk514#

澄清状态:这是一个在 #153095 上被阻止的功能请求。

相关问题