Критическая уязвимость в обработчике крахов приложений, поставляемом в Ubuntu
В пакете Apport, применяемом в Ubuntu Linux для автоматизации обработки крахов приложений, выявлена критическая уязвимоcть, позволяющая организовать выполнение кода от имени текущего пользователя, а при проведении локальной атаки повысить привилегии до пользователя root. Проблема проявляется в Desktop-редакция дистрибутива Ubuntu начиная с выпуска 12.10 и исправлена в недавно опубликованном обновлении пакета Apport.
Apport перехватывает сведения о крахе приложения, в том числе автоматически вызывается при возникновении исключительных ситуаций в скриптах на языке Python и отслеживает сбои во время установки пакетов, подготавливает информацию об условиях в момент сбоя. Отчет о крахе сохраняется в текстовых файлах с расширением ".crash", при наличии которых вызывается специальная утилита, выводящая на экран диалог с предложением отправить отчет разработчикам Ubuntu. Ошибка в коде разбора файлов crash позволяет осуществить подстановку кода на языке python.
Для демонстрации уязвимости можно записать в файл c расширением.crash следующий текст, при обработке которого будет выполнен запуск калькулятора:
ProblemType: Bug ExecutablePath: /usr/bin/file-roller Stacktrace: None CrashDB: {'impl': 'memory', 'crash_config': exec(""" import subprocess payload_cmd = "pkill -9 apport; gnome-calculator" subprocess.Popen(payload_cmd, shell=True) """, {}) }
Для генерации произвольных эксплоитов подготовлен специальный инструментарий. Для эксплуатации уязвимости необходимо добиться открытия данного файла в обработчике Apport, что можно сделать несколькими путями. Например, так как apport-gtk зарегистрирован для обработки MIME-типа "text/x-apport, достаточно открыть файл с расширением.crash в файловом менеджере. Кроме того, обработчик вызывается для всех файлов не имеющих MIME-привязки к расширению, начинающихся со стороки "ProblemType: ", т. е. можно записать эксплоит в файл с любым неизвестным системе расширением, например zip, и разместить его на сайте. Применив методы социальной инженерии, можно добиться загрузки этого файла пользователем. Как только файл будет сохранен и пользователь попытается кликнуть на нем файловом менеджере для просмотра содержимого - будет активирован обработчик Apport, что приведет к эксплуатации уязвимости.
Второй вариант атаки позволяет добиться локальным пользователем выполнения кода с правами root. Если сохранить файл с расширением.crash в директории /var/crash (доступна на запись всем пользователям), он будет автоматически обработан. При этом если файл сохранен под идентификатором пользователя меньше 500, то обработка будет выполнена с правами root. В качестве одного из методов записи файла с uid меньше 500 предлагается использовать доступную в mysql возможность сохранения таблицы в произвольной директории ("SELECT INTO... OUTFILE") или организовать запись чрез web-скрипт, выполняемый от пользователя www-data.
При входе пользователя в систему, для подобных crash-файлов вызывается процесс apport-crashreports, который запрашивает через PolicyKit выполнение действий с правами root. Выводимый диалог лишь уведомляет от возникновении проблемы в системном приложении и предлагает отправить разработчикам отчет, не детализируя о каком приложении идет речь и не предупреждая о выполнении операции с повышенными привилегиями. Если пользователь согласится с предложением, то эксплоит будет выполнен в системе с правами root.