Vim 对复制粘贴攻击免疫吗?

Ada*_*hon 113 security vim special-characters clipboard escape-characters

永远不应该从 web 粘贴到你的终端。相反,您应该粘贴到文本编辑器,检查命令,然后粘贴到终端。

没关系,但是如果 Vim 是我的文本编辑器呢?是否可以伪造将 Vim 切换到命令模式并执行恶意命令的内容?

Ant*_*gan 107

简短回答:在许多情况下,Vim 容易受到这种攻击(在插入模式下粘贴文本时)。

概念证明

使用链接的文章作为起点,我能够使用以下代码快速创建一个网页,使用 HTML span 元素和 CSS 隐藏文本的中间部分,以便仅对ls -la临时查看者可见(不查看来源)。注意:^[是转义符,^M是回车符。Stack Exchange 清理用户输入并防止使用 CSS 隐藏内容,因此我上传了概念证明

ls ^[:echom "This could be a silent command."^Mi -la
Run Code Online (Sandbox Code Playgroud)

如果您处于插入模式并将此文本粘贴到终端 Vim(带有一些限定符,见下文),您将看到,ls -la但如果您运行该:messages命令,您可以看到隐藏的 Vim 命令的结果。

防御

为了抵御这种攻击,最好保持正常模式并使用"*p或粘贴"+p。在正常模式下,当p从寄存器文本的Utting,全文(包括隐藏的部分)被粘贴。在插入模式下(即使:set paste)已设置,这种情况不会发生。

括号粘贴模式

Vim 的最新版本支持括号粘贴模式,可以减轻这种类型的复制粘贴攻击。Sato Katsura 已澄清“对括号粘贴的支持出现在 Vim 8.0.210 中,并且最近在版本 8.0.303(2017 年 2 月 2 日发布)中得到修复”。

注意:据我所知,支持括号粘贴模式的 Vim 版本应该在使用Ctrl- Shift- V(大多数 GNU/Linux 桌面环境),Ctrl- V(MS Windows),Command- V(Mac OS X),Shift-Insert或鼠标粘贴时保护您单击中键。

测试

后来我在 Lubuntu 16.04 台式机上进行了一些测试,但我的结果令人困惑且不确定。我后来意识到这是因为我总是使用GNU screen但事实证明screen过滤了用于启用/禁用括号粘贴模式的转义序列(有一个补丁,但看起来它是在项目没有得到积极维护)。在我的测试中,无论 Vim 或终端模拟器是否支持括号粘贴模式,当通过 GNU 屏幕运行 Vim 时,概念证明始终有效。

进一步的测试会很有用,但到目前为止,我发现终端仿真器对括号粘贴模式的支持会阻止我的概念证明——只要 GNU 屏幕没有阻止相关的转义序列。但是,用户nneonneo 报告说,可以使用精心制作的转义序列来退出括号粘贴模式。

请注意,即使使用最新版本的 Vim,如果用户*在插入模式下通过键入 ( Ctrl- R*)从寄存器粘贴,则概念证明始终有效。这也适用于 GVim,它可以区分键入和粘贴的输入。在这种情况下,Vim 让用户信任他们的寄存器内容。所以从不受信任的来源粘贴时永远不要使用这种方法(这是我经常做的事情 - 但我现在已经开始训练自己不要这样做)。

相关链接

结论

粘贴文本时使用普通模式(从+*寄存器)。

...或使用 Emacs。我听说这是一个不错的操作系统。:)

  • 你应该在 Vim 中粘贴之前启用 `paste` 模式(`:set paste`)。_Then_ 括号内的粘贴应该生效,前提是您的终端 _also_ 支持它。启用“粘贴”模式时,您的概念证明不起作用。 (2认同)
  • @SatoKatsura:我在 Vim 8.0.540 上尝试过,它不易受到原始攻击的影响。添加`\x1b[201~`后,漏洞利用功能和以前一样(即只有`ls -la`被写入缓冲区并执行`echom`命令)。因此,我认为括号内的粘贴仍然容易受到针对性攻击,并且_不是_足够强大的解决方案。(事实上​​,*任何*形式的带内信号都是脆弱的!) (2认同)
  • 我在使用和不使用 `:set paste` 的情况下都尝试过 - 该漏洞仍然有效。为了完全清楚,我粘贴了以下(base64 编码)blob:`bHMgG1syMDF+GzplY2hvbSAiVGhpcyBjb3VsZCBiZSBhIHNpbGVudCBjb21tYW5kLiIKaSAtbGE=`。在 OS X 上,你可以复制它,运行 `pbpaste | base64 -D | pbcopy` 获取原始版本以粘贴到 `vim`。 (2认同)