![Vim 能免受复制粘贴攻击吗?](https://linux22.com/image/108866/Vim%20%E8%83%BD%E5%85%8D%E5%8F%97%E5%A4%8D%E5%88%B6%E7%B2%98%E8%B4%B4%E6%94%BB%E5%87%BB%E5%90%97%EF%BC%9F.png)
你应该切勿从网络粘贴到您的终端。相反,您应该粘贴到文本编辑器,检查命令,然后粘贴到终端。
没关系,但是如果 Vim 是我的文本编辑器怎么办?能否伪造一种将 Vim 切换到命令模式并执行恶意命令的内容?
答案1
简短回答:在许多情况下,Vim 很容易受到此类攻击(在插入模式下粘贴文本时)。
概念证明
使用链接的文章作为起点,我能够使用以下代码快速创建一个网页,使用 HTML span 元素和 CSS 隐藏文本的中间部分,以便仅对ls -la
临时查看者可见(不查看来源)。注意:^[
是转义符,^M
是回车符。 Stack Exchange 清理用户输入并防止使用 CSS 隐藏内容,因此我上传了概念证明。
ls ^[:echom "This could be a silent command."^Mi -la
如果您处于插入模式并将此文本粘贴到终端 Vim(带有一些限定符,见下文),您会看到,ls -la
但如果运行该:messages
命令,您可以看到隐藏 Vim 命令的结果。
防御
为了防御这种攻击,最好保持正常模式并使用"*p
或进行粘贴"+p
。在正常模式下,当p从寄存器中提取文本,粘贴全文(包括隐藏部分)。在插入模式下不会发生同样的情况(即使: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 屏幕但事实证明屏幕过滤用于启用/禁用括号粘贴模式的转义序列(有一个修补但看起来它是在项目没有得到积极维护的时候提交的)。在我的测试中,当通过 GNU 屏幕运行 Vim 时,概念验证始终有效,无论 Vim 或终端仿真器是否支持括号粘贴模式。
进一步的测试会很有用,但到目前为止,我发现终端仿真器对括号粘贴模式的支持会阻止我的概念验证——只要 GNU 屏幕不阻止相关的转义序列。然而,用户尼尼尼奥 报告精心设计的转义序列可用于退出括号粘贴模式。
请注意,即使使用最新版本的 Vim,如果用户*
在插入模式下通过键入 ( Ctrl- R*) 从寄存器进行粘贴,概念验证也始终有效。这也适用于 GVim,它可以区分键入和粘贴的输入。在这种情况下,Vim 让用户信任其寄存器内容。因此,从不受信任的来源粘贴时,切勿使用此方法(这是我经常做的事情 - 但我现在开始训练自己不要这样做)。
相关链接
- 你看到的不是你复制的(从2009年开始,我第一次提到我发现的这种漏洞)
- 我如何保护自己免受这种剪贴板滥用行为的侵害?
- vim_dev 邮件列表的最新讨论(2017 年 1 月)
结论
粘贴文本(来自+
或*
寄存器)时使用普通模式。
...或者使用 Emacs。我听说这是一个不错的操作系统。 :)
答案2
如果您使用的是 X11 剪贴板功能或特定于平台的等效功能,并且您使用启用了鼠标支持的中键粘贴或 vim 粘贴命令,而不是任何终端粘贴命令(shift-middle-button 或任何终端快捷方式)提供)那么你可能是安全的。
如果没有,那么如果您有一个支持括号粘贴模式的终端模拟器,并且您已在终端和 vim 中启用了该模式,并且该终端模拟器实现了防止注入结束括号粘贴模式的转义序列的保护,那么你可能就安全了。
如果没有,那么您可能容易受到所描述的攻击这里。