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。我听说这是一个不错的操作系统。:)