Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Уязвимости в утилитах beep и patch

Раскрыты детали критической уязвимости в утилите beep. Изначально проблема была представлена в начале апреля в шуточной форме под именем Holey Beep и была воспринята многими как первоапрельская шутка с сатирой на современные тенденции продвижения информации об уязвимостях. Для Holey Beep был создан отдельный сайт, подготовлен видеоклип, упомянута возможность исправления антивирусами и необходимость обновления браузера. Описание было изложено очень поверхностно в общих словах.

На деле проблема оказалась реальной уязвимостью CVE-2018-0492, позволяющей повысить привилегии до прав root. Функции утилиты beep сводятся к выводу гудка при запуске, при этом во многих дистрибутивах, включая Debian и Ubuntu, утилита установлена с флагом suid root (требуется для доступа к текущему tty при удалённом входе). Найденная уязвимость вызвана состоянием гонки, которое инициируется через обработчик сигналов в момент манипуляции с файловыми дескрипторами консоли и, в случае успеха, позволяет записать 4 байта в любой файл в системе.

В ходе атаки создаётся символическая ссылка на /dev/input/event0, которая передаётся в качестве аргумента опции "--device" (устройство консоли для получения события о начале гудка), инициируется гудок и через очень маленькую специально подобранную задержку символическая ссылка заменяется ссылкой на другой файл, через ещё одну небольшую задержку процессу отправляются сигналы SIGINT и SIGKILL. При обработке сигнала SIGINT происходит вызов функции do_beep() для записи в консоль команды для остановки воспроизведения гудка ("write(console_fd, &e, sizeof(struct input_event))").

Рассчитав задержку так, чтобы вызов SIGINT совпал с выполнением участка кода, в котором содержимое console_fd и console_type (первое поле структуры "e") указывает на некорректные значения, можно записать произвольные 4 байта в файл. Функция play_beep открывает файл с именем console_device, а через несколько строк кода выполняет проверку, что файловый дескриптор открытого файла является устройством ("ioctl(console_fd, EVIOCGSND(0)"). Так как один запуск утилиты beep позволяет выполнить несколько гудков и при каждом гудке заново открывается консоль, можно найти такой момент, при котором в console_fd будут отражены параметры нового гудка (дескриптор подменённого файла), а в console_type останется старое значение. При удачном стечении обстоятельств в уже подменённый файл будет записано 4-байтовое значение со временем, содержимое которого можно контролировать через опцию "-l".

Операции повторяются в цикле пока не удастся поймать состояние гонки. Для получения прав root, в ходе работы эксплоита ссылка на /dev/input/event0 подменяется ссылкой на файл /etc/profile или /etc/bash/bashrc и производится запись 4 символов "/*/x", которые при запуске очередного root-сеанса приведут к выполнению заранее подготовленного скрипта /tmp/x. Для тестирования подготовлен рабочий эксплоит. Для исправления проблемы подготовлен патч. Дистрибутивам рекомендуется убрать флаг suid с утилиты beep или последовать примеру дистрибутива SUSE и заменить beep на shell-заглушку с командой 'echo -en "\007"' или "printf '\a'".

С учётом наличия в beep опций для передачи пути к устройству ввода и запуска с применением suid root, анонс Holey Beep вызвал интерес исследователей безопасности, которые сразу нашли ещё две, менее опасные уязвимости. Суть первой проблемы в возможности определения наличия файлов в каталогах, доступных только пользователю root (через "-device" указывается путь к проверяемому файлу и в зависимости от ответа определяется существует такой файл или нет). Вторая проблема вызвана целочисленным переполнением при обработке содержимого опций "-l" и "-D".

Кроме проблем в beep опасная уязвимость (CVE-2018-1000156) также найдена в утилите GNU patch. Проблема связана с поддержкой патчей в устаревшем формате "ed", который допускает выполнение сторонних команд при помощи оператора "!". Интересно, что в BSD patch похожая проблема была устранена в 2015 году. Например, попытка применения следующего патча, приведёт к записи текущего идентификатора пользователя в файл /pwn.lol:

   --- a	2018-04-11 13:37:37.000000000 +0100
   +++ b	2018-04-11 13:38:38.000000000 +0100
   1337a
   1,112d
   !id>~/pwn.lol

Обновление пакета GNU patch с устранением уязвимости пока выпущено только для Ubuntu и Arch Linux, для других дистрибутивов исправление ожидается в ближайшее время (Debian, Fedora, SUSE, openSUSE, RHEL, CentOS).

OpenNET

Ваш комментарий

Имя:

Текст комментария (HTML-теги не допускаются):

Новости мира IT:

Архив новостей

Последние комментарии:

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 985 1945361
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2015 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...