Vim 對複制粘貼攻擊免疫嗎?
你不應該從網路粘貼到你的終端。相反,您應該粘貼到文本編輯器,檢查命令,然後粘貼到終端。
沒關係,但是如果 Vim 是我的文本編輯器呢?可以偽造將 Vim 切換到命令模式並執行惡意命令的內容嗎?
**簡短回答:**在許多情況下,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
。在普通模式下,當從寄存器中輸入文本時,會粘貼全文(包括隱藏部分)。在插入模式下也不會發生同樣的情況(即使: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 讓使用者信任他們的寄存器內容。因此,從不受信任的來源粘貼時永遠不要使用這種方法(這是我經常做的事情——但我現在已經開始訓練自己不要這樣做)。相關連結
- 你看到的不是你複製的(從 2009 年開始,第一次提到我發現的這種漏洞利用)
- 我怎樣才能保護自己免受這種剪貼板濫用?
- 最近關於 vim_dev 郵件列表的討論(2017 年 1 月)
結論
粘貼文本時使用普通模式(來自
+
或*
寄存器)。… 或使用 Emacs。我聽說這是一個不錯的作業系統。:)