
Это PoC-эксплойт для libappimage и appimaged.
Используя комбинацию двух CVE, можно создать файл, который не выглядит как AppImage, но при этом автоматически подхватывается и устанавливается appimaged, переопределяя установленную в системе версию того же приложения.
В данном случае в качестве полезной нагрузки использовался MP3-файл, а переопределённым приложением был Nautilus.
Уязвимость затрагивает все версии appimaged и все версии libappimage старше 1.0.3.
У кодека MP3 нет заголовка файла, поэтому медиапрограммы вынуждены сканировать файл в поисках заголовка кадра. Это означает, что мы можем поместить заголовки ELF и AppImage типа 2 в начало файла, и MP3 при этом останется воспроизводимым. Это делает MP3 идеальной целью для данного PoC.
MP3-файл модифицируется так, чтобы после воспроизводимой медиачасти содержать бинарный файл с полезной нагрузкой; при этом Dart-скрипт используется для размещения MP3-данных между исполняемым файлом полезной нагрузки и заголовком ELF. (Обратите внимание: я не корректировал расположение символов в таблице символов, так как это потребовало бы больше усилий и не было нужно для данного PoC.) Бинарный файл полезной нагрузки занимает менее 1 МБ, поэтому заметного увеличения размера файла не происходит. В самом конце файла добавляется файловая система squashfs, содержащая поддельный desktop-файл Nautilus и иконку.
Обратите внимание: хотя добавление MP3 в конец squashfs технически тоже сработало бы, это с большей вероятностью сбило бы с толку медиаплееры из-за его появления так поздно в файле, тогда как данные сразу после заголовка ELF находятся всего в нескольких десятках байт от начала файла.
appimaged сканирует все файлы во всех отслеживаемых каталогах, независимо от расширения файла. Когда он обнаруживает MP3, он распознаёт заголовки ELF и AppImage и извлекает содержащийся внутри desktop-файл.
Вредоносный desktop-файл теперь записан и указывает на вредоносный MP3. Когда пользователь в следующий раз запустит «Файлы» (Files), будет запущен встроенный в MP3 ELF-исполняемый файл вместо системной установки.
Обычно desktop-файл назывался бы «appimagekit_...desktop», поэтому он не смог бы полностью переопределить системные приложения. Однако Integrator.cpp в libappimage берёт поле Name без проверки или экранирования, поэтому во вредоносный desktop-файл можно добавить следующее:
Name=/../org.gnome.Nautilus
Name[en]=Files
и файл будет записан в ~/.local/share/applications/org.gnome.Nautilus.desktop, маскируя установленный в системе Nautilus.
Убедитесь, что установленная у вас версия libappimage не ниже 1.0.3, в которой исправлена проверка поля Name.
Важно отметить, что на данный момент это не относится к libappimage в Debian, которая довольно устарела.
Все версии appimaged уязвимы, а проект был объявлен устаревшим.
go-appimage обходит проблему с именами файлов, подхватывая только
AppImage-файлы с именем *.AppImage. AppImageLauncher обходит
проблему с именами файлов, запрашивая у пользователя разрешение на установку до её начала.
Поместите произвольный аудиофайл в audio.mp3 и выполните dart bin/write_mp3.dart, чтобы собрать полезную
нагрузку и записать модифицированный MP3-файл. Для работы потребуются установленные Dart SDK и FreePascal.
Для бинарного файла использовался Pascal, поскольку при использовании возможностей подпроцессов он давал наименьший размер статически слинкованных файлов среди протестированных языков (C со статической линковкой через musl, Go).
При тестировании в качестве аудиофайла использовался world.execute(me), поскольку это казалось уместным.