Vim文本编辑器任意代码执行漏洞(CVE-2019-12735)

2019年6月18日10:21:09 发表评论

Vim文本编辑器任意代码执行漏洞(CVE-2019-12735)

背景

近日,著名编辑器Vim/NeoVim爆出了任意代码执行漏洞,打开恶意文件即可触发,受影响的版本:

Vim < 8.1.1365, Neovim < 0.3.6

漏洞成因

漏洞产生于Vim的modeline功能中,使用modeline功能时,通常把一段配置代码放在文件的开头或结尾处,用于对此文件进行编辑器功能的配置,此配置会覆盖Vim的默认配置(通常在~/.vimrc中)。

modeline功能便于文件在共享时保持一致的编辑格式。例如,我们通常会在Python文件开头加上modeline来设置缩进:

# vim: ai ts=4 sts=4 et sw=4 ft=python
# vim: autoindent tabstop=4 shiftwidth=4 expandtab softtabstop=4 filetype=python

由于modeline中的命令运行于命令模式(在正常模式下按:进入),而在命令模式下可以进行修改文件、执行脚本等敏感操作,这就产生了被恶意攻击的可能。

因此从安全角度考虑,在modeline中,只支持set命令,同时一些配置项会被隔离到沙箱(sandbox)中运行。

在沙箱中,修改文件、修改快捷键、执行shell脚本等操作都被禁止。

沙箱检查由函数check_secure实现,用HAVE_SANDBOX判断是否在沙箱中,是的话生成错误信息并返回TRUE。

// vim/src/ex_cmds.c
/*
 * Check if the secure flag is set (.exrc or .vimrc in current directory).
 * If so, give an error message and return TRUE.
 * Otherwise, return FALSE.
 */
    int
check_secure(void)
{
    if (secure)
    {
    secure = 2;
    emsg(_(e_curdir));
    return TRUE;
    }
#ifdef HAVE_SANDBOX
    /*
     * In the sandbox more things are not allowed, including the things
     * disallowed in secure mode.
     */
    if (sandbox != 0)
    {
    emsg(_(e_sandbox));
    return TRUE;
    }
#endif
    return FALSE;
}

check_secure函数在一些涉及敏感操作的地方被用到,例如在buf_write函数中的使用,禁止了在沙箱模式下写buf文件。

// vim/src/fileio.c
    int
buf_write(...)
{
    // ...
    /*
     * Disallow writing from .exrc and .vimrc in current directory for
     * security reasons.
     */
    if (check_secure())
      return FAIL;
    // ...
 }

然而在:source!命令中,并没有进行沙箱检查。:source!命令用于在命令模式下逐个运行目标文件中的命令,通常被用来加载配置文件。同时,在命令模式下有多种方式执行shell脚本。

发表评论

后发表评论