Уязвимость в Vim и Neovim позволяет выполнить произвольный код

VimТекстовые редакторы Vim и Neovim оказались подвержены уязвимости, которая позволяет выполнить произвольный код при открытии специально оформленного файла. Уязвимости присвоен идентификатор CVE-2019-12735.

Проблема проявляется в случае, если в редакторах включен режим modeline (:set modeline), позволяющий определить в обрабатываемом файле опции редактирования. Причем по умолчанию режим modeline в редакторах включен.

Отметим, что через modeline допускается установка ограниченного числа опций. Если в качестве значения опции указывается выражение, то оно выполняется в режиме песочницы, допускающем применение только простейших безопасных операций. При этом в число допустимых входит команда :source, в которой можно использовать модификатор ! для запуска произвольных команд из указанного файла. Это приводит к тому, что для выполнения кода достаточно указать в строке modeline конструкцию вида:

set foldexpr=execute(‘\:source! [файл_источник]’):

В Neovim вызов execute запрещён, но есть альтернатива в виде assert_fails.

По этой ссылке можно найти два примера атаки через данную уязвимость, один из которых на скриншоте ниже.

Уязвимость в Vim и Neovim позволяет выполнить произвольный код

Для выполнения команды uname -a достаточно просто открыть в Vim или Neovim файл, в первой или последней строке которого указано:

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

Команда source! % прочитает команды из текущего файла и выполнит :!uname -a. В данном прототипе атаки при открытии файла в Vim создаётся сетевое соединение с shell-доступом.

Из-за того, что потенциально уязвимость имеет высокую степень опасности, оперативно вышли версии Vim 8.1.1365 и Neovim 0.3.6 с исправлением этого бага. Если же по какой-то причине обновиться пока нет возможности, рекомендуется отключить режим modeline.

Проверить, активен ли режим modeline можно командой

 :set modeline?

Кроме того, в конфигурационный файл vimrc можно добавить строку:

set nomodeline

В этой ситуации больше остальных повезло пользователям Debian, так как там modeline по умолчанию отключен. 🙂

Добавить комментарий

Ваш адрес email не будет опубликован.