天融信关于Vim和Neovim (CVE-2019-12735) 任意代码执行漏洞的分析

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

内容简介:Vim和Neovim是Unix类操作系统下广泛使用的跨平台文本编辑器,其中Neovim是基于Vim开发的。Vim/Neovim中的modeline功能可以让用户在文本文件的开头或结尾使用特定代码来控制编辑器的一些行为。这个功能被限制到仅能执行特定set指令,且有沙箱隔离,但:source!指令却可以用来绕过沙箱执行命令。Modeline功能会将所有含表达式的语句在沙箱中执行,可能的选项包括’foldexpr’, ‘formatexpr’, ‘includeexpr’, ‘indentexpr’, ‘stat

一.  漏洞背景

Vim和Neovim是Unix类操作系统下广泛使用的跨平台文本编辑器,其中Neovim是基于Vim开发的。

Vim/Neovim中的modeline功能可以让用户在文本文件的开头或结尾使用特定代码来控制编辑器的一些行为。这个功能被限制到仅能执行特定set指令,且有沙箱隔离,但:source!指令却可以用来绕过沙箱执行命令。

  • 漏洞编号:     CVE-2019-12735
  • 受影响版本: Vim < 8.1.1365, Neovim < 0.3.6

二.  漏洞成因

Modeline功能会将所有含表达式的语句在沙箱中执行,可能的选项包括’foldexpr’, ‘formatexpr’, ‘includeexpr’, ‘indentexpr’, ‘statusline’和 ‘foldtext’。

Modeline的常见格式如下:

天融信关于Vim和Neovim (CVE-2019-12735) 任意代码执行漏洞的分析

但是:source!命令可以用来绕过沙箱。当使用:source!命令时,vim会从指定文件读入vimscript代码并执行:

天融信关于Vim和Neovim (CVE-2019-12735) 任意代码执行漏洞的分析

如果我们在沙箱中执行:source!命令的话,沙箱可以被绕过。在patch 8.1.1365之前,我们可以在vim modeline中的expression调用:source!来执行任意vim脚本,这一过程如上面的vim文档所说,就像你在normal模式下手动输入执行命令一样,是没有沙箱限制的。

Vim释出的补丁 patch 8.1.1365 中增加了对:source!命令的沙箱环境判断,拒绝在沙箱中执行。

天融信关于Vim和Neovim (CVE-2019-12735) 任意代码执行漏洞的分析

所以,我们可以在modeline中使用:source!命令来执行一个vim脚本:

天融信关于Vim和Neovim (CVE-2019-12735) 任意代码执行漏洞的分析

上图中使用foldexpr选项实现了表达式执行,整个modeline的作用是设置基于expression的foldmethod。

三.  漏洞利用

考虑到作为攻击者,无法事先写好要执行的vim脚本并存储在目标磁盘上,我们就无法通过:source!执行需要的命令。

为了直接执行命令,这里使用了一个技巧:

:source! %会把当前文件的内容当作vim脚本执行,所以,下图中的exec.txt实际上会被vim的:source!当作:!echo vim_pwned || garbage_string来执行,根据bash语法(执行前半句失败则执行后半句),最后执行了前半句的echo。

天融信关于Vim和Neovim (CVE-2019-12735) 任意代码执行漏洞的分析

如图,这样就实现了任意代码执行。

四.  参考资料


以上所述就是小编给大家介绍的《天融信关于Vim和Neovim (CVE-2019-12735) 任意代码执行漏洞的分析》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

编程人生

编程人生

Peter Seibel / 图灵俱乐部 / 人民邮电出版社 / 2011-1-1 / 79.00元

界顶尖的程序员是怎么走上编程道路的? 他们的编程工作创造和改变了人类历史,在这一过程中都有哪些经验和教训? 他们对计算机软件行业的过去、现在和未来有什么独到的看法和见解? 他们对培养、发现、选拔、面试优秀的程序员有什么建议? 放下手头的工作,听听这些软件先驱们的故事和建议,眼界可以更开阔,思路可以更清晰,方向可以更明确,人生可以更精彩。 作者Peter Seibel采......一起来看看 《编程人生》 这本书的介绍吧!

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

在线压缩/解压 JS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试