Опасные уязвимости в утилитах beep и patch

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

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

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

Рассчитав задержку так, чтобы SIGINT попал на участок кода, в котором содержимое console_fd и console_type (первое поле структуры «e») указывает на некорректные значения, можно записать произвольные 4 байта в файл. Так как один запуск утилиты beep позволяет выполнить несколько гудков (функция play_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 «07»‘ или «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 и ожидается для других дистрибутивов (Debian, Fedora, SUSE, openSUSE, RHEL, CentOS).

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.