Порочное наследие Windows: концептуальные методы взлома Linux через флешку и защита от нихВсем известна истерия виндузятников по поводу флешек с вирусами. Линуксоиды же смотрят на все это с ухмылкой и чувством полного иммунитета. Но как выяснилось, рано расслаблять булки: и в линуксах существует не меньше косяков по этому поводу. Autorun.inf мертв, да здравствует .autorun!Полагаю, все в курсе, что в системах Windows существует возможность автоматически запускать программы после втыкания usb-флешки и прочих внешних накопителей. За эту функциональность ответственен файл autorun.inf, с помощью которого юные вирусописатели наломали немало дров, прежде чем мелкомягкие отключили автоматический запуск. Теперь, начиная с Windows 7, этот функционал отключен по умолчанию. Но хитрые хакеры не унывали и находили новые способы натягивать пользователей. Об этом свидетельствуют нашумевшие уязвимости при обработке ярлыков (эту брешь эксплуатировал червь Stuxnet) и разнообразных библиотек создания эскизов, которые вступают в действие при простом просмотре содержимого флешки в "Проводнике". Было бы наивно предполагать, что в Линуксе подобной функциональности нет. Спецификации freedesktop.org, которым следуют такие окружения рабочего стола, как GNOME и KDE, предполагают наличие специальных файлов автозапуска на съемном накопителе: .autorun, autorun или autorun.sh. Если на флешке присутствуют два или все три из перечисленных типов файлов, то обрабатываться будет только один. Приоритет будет отдан файлу .autorun, а далее — в порядке, перечисленном выше. По сути, это некий аналог autorun.inf в Windows, только несколько урезанный в возможностях. Здесь можно только прописать путь к исполняемому файлу, но нельзя — сразу к нескольким, а также нельзя выходить за пределы файловой системы флешки с помощью ссылки на вышестоящий каталог. Кроме того, для неисполняемых файлов (например, документа pdf) тоже существует возможность автооткрытия. Нужно создать файл .autoopen или autoopen в корневой директории съемного устройства и прописать туда путь до нужного файла, причем корнем является не корень системы, а корень съемного устройства. Правда, в том же Nautilus эта функциональность пока (намеренно?) не реализована. Единственная омрачающая картину автозапуска вещь — пользователю необходимо подтвердить это действие. Но такой ли это минус? Слепая уверенность линуксоида в своей безопасности от малвари может сыграть с ним злую шутку.
Копаем глубжеНадо признать, что фокусами с автозапуском нынче мало кого удивишь, поэтому взглянем на предметную область несколько шире. После втыкания флешки (или любого другого устройства) исполняется большое количество кода:
Ошибки могут существовать на любом из этих уровней. Например, в 2009 году был найден баг в драйвере VoIP телефона Auerswald (CVE-2009-4067). Он заключался в неправильной обработке USB-дескрипторов и приводил к классическому переполнению буфера. В результате эксплуатации этой бреши атакующий мог выполнить произвольный код на уровне ядра. Для более удобного поиска ошибок в USB-драйверах Тобиас Мюллер создал фаззер, основанный на QEMU и позволяющий эмулировать USB-устройства. В конце 2009 была исправлена серьезная уязвимость в модуле файловой системы ext4, в функции ext4_decode_error(), которая приводила к разыменованию NULL-указателя и выполнению произвольного кода при монтировании специально скомпонованного образа ФС. Уязвимости в драйверах файловых систем используются при помощи специально сформированного образа этой файловой системы, залитого на флешку. Успешно проэксплуатированная уязвимость дает атакующему полный рутовый доступ к системе, так как драйверы файловых систем исполняются в режиме ядра. Эксплуатация уязвимостей в драйверах файловой системы пользовательского режима (через FUSE) дает нам возможность исполнять код с привилегиями того пользователя, от чьего имени был подмонтирован раздел. Как искать уязвимости в системных драйверах? Здесь существует несколько путей:
Наследник Adobe Acrobat ReaderEvince — весьма распространенный просмотрщик PDF-документов. Также поддерживает такие форматы, как PostScript, TIFF, DVI, DjVu. Он является стандартным компонентом рабочей среды GNOME. Зайдя на сайт Common Vulnerabilities and Exposures, можно увидеть, что для Evince открыто девять уязвимостей, причем четыре из них — достаточно новые и датируются июлем 2010 года. Одна из этих уязвимостей (CVE-2010-2640) была продемонстрирована Джоном Ларимером, им же был описан процесс создания эксплойта под нее, который исполнял произвольный код в системе. В данном случае была продемонстрирована возможность "отпирания" залоченной скринсейвером системы Ubuntu 10.10 после простого втыкания флешки (без ведома пользователя и системы исполнялся находившийся на флешке простой скрипт kill.sh с командой "killall gnome-screensaver"). Сама уязвимость заключается в неправильной обработке шрифтов в DVI-файлах. В этих файлах могут подключаться внешние шрифты, путь до которых задается в абсолютном виде (/media/NNN). Вообще говоря, эта уязвимость никоим образом не связана с флешками и может использоваться сама по себе, просто дурная привычка Nautilus открывать окна с новыми подмонтированными системами пришлась очень кстати. Nautilus под микроскопомGNOME Nautilus — файловый менеджер, который используется по умолчанию в дистрибутивах Ubuntu, а также в среде рабочего стола GNOME. Он поддерживает большинство спецификаций freedesktop.org и автоматически монтирует известные ему файловые системы на USB-дисках по умолчанию. Чтобы получать информацию о новых подключенных съемных накопителях, Nautilus использует GVFS — виртуальную файловую систему, которая дает возможность монтировать разделы без рутовых привилегий. Смонтированный раздел находится по пути /media/NNN, где NNN — название раздела. Также Nautilus автоматически открывает окно с содержимым смонтированного раздела и генерирует эскизы для каждого файла, находящегося в корневой директории раздела. Причем это происходит даже при работающем скринсейвере и заблокированной системе! Nautilus умеет генерировать эскизы для изображений, видеофайлов, текстовых документов и некоторых других файлов. Иконки для изображений генерируются с помощью стандартной гномьей библиотеки GdkPixBuf, которая в своей работе вызывает функции из других библиотек для различных изображений, таких как libpng, libtiff, libjpeg. Во всех трех библиотеках существуют общеизвестные уязвимости. В начале 2011 года была опубликована уязвимость в библиотеке libpng версии < 1.5.0 (CVE-2011-0408), которая присутствует в функциях png_do_expand_palette() и png_do_rgb_to_gray(). Их реализацию можно найти в исходном файле pngrtran.c. С помощью специально сформированных PNG-, MNG- или JNG-файлов можно аварийно завершить работу использующего эту библиотеку приложения и при некоторых условиях выполнить произвольный код на целевой системе, что и было продемонстрировано Джоном Ларимером на конференции ShmooCon. К сожалению, PoC-эксплойт пока не представлен широкой общественности, зато давно доступен закрывающий этот баг апдейт библиотеки до версии 1.5.1. Летом 2010 года было обнаружено переполнение буфера в библиотеке LibTIFF 3.x, которое приводит к выполнению произвольного кода при попытке обработки TIFF-изображения со специально оформленным блоком тэгов SubjectDistance. Проблема устранена в версии 3.9.4. В ноябре прошлого года была найдена уязвимость в библиотеке для рендеринга шрифтов FreeType версии < 2.4.3, позволяющая выполнить произвольный код в системе при обработке специально сформированного шрифта TrueType GX. Баг в виде переполнения буфера существовал в функции ft_var_readpackedpoints(). Все эти и многие другие нераскрытые уязвимости свидетельствуют о том, что нынешняя реализация библиотек под Linux далека от совершенства в плане безопасности. Для формирования эскизов других файлов используются сторонние утилиты:
У всех этих утилит схожий синтаксис — например, вызов evincethumbnailer выглядит так:
Здесь аргумент '-s' задает размер миниатюры в пикселях по горизонтали, следующий параметр — исходный PDF-документ, последний параметр — файл с получившейся миниатюрой. Таким образом Nautilus запускает соответствующую утилиту для каждого файла в просматриваемой директории. Посмотреть список используемых построителей эскизов и ассоциированных с ними типов файлов можно так:
Стоит заметить, что уязвимости в генераторах эскизов могут использоваться и без участия флешки: достаточно скачать файл из интернета и просмотреть содержимое соответствующей папки в файловом менеджере. Что примечательно, не все генераторы эскизов защищены AppArmor в Ubuntu 10.10, среди незащищенных — totem-videothumbnailer и gnome-thumbnail-font. Будем надеяться, в будущих релизах Ubuntu это исправят. Тем не менее, вышеописанные утилиты рано или поздно попадут под разнос хакеров, что, судя по последним событиям, уже начинается. Но в той же Ubuntu существует множество встроенных средств защиты, призванных обезопасить пользователей от всех напастей. Посмотрим, везде ли они смогут помочь.
Обход встроенных средств защитыДистрибутив Ubuntu по праву признан одним из самых защищенных: тут тебе и AppArmor, и ASLR, и PIE, и использование NX-бита. Последний уже считается неэффективным ввиду появления таких техник атак, как возврат в библиотеку (ret2lib) и возвратно-ориентированное программирование (ROP). В своем выступлении на последней конференции ShmooCon 2011 Джон Лаример показал слабости механизма ASLR/PIE в 32-битном Linux. Он проанализировал адреса, по которым загружается библиотека libc (но это справедливо и для любой другой), и пришел к выводу, что возможно всего около 3 000 вариантов, а в определенных условиях — еще меньше. Причем вероятности нахождения библиотеки по одному из этих адресов не равны, график распределения вероятностей можешь посмотреть на картинке (по горизонтальной шкале разместились адреса, а по вертикальной — количество попаданий в конкретный адрес). Таким образом, можно просто подобрать адрес нужной библиотеки — например, с помощью создания множества pdf-документов, эксплуатирующих баг в evince-thumbnailer. Это становится возможным, так как Nautilus запускает для каждого файла отдельный процесс evincethumbnailer. Другой интересный и уже почти стандартный механизм защиты — AppArmor — на самом деле защищает лишь настолько, насколько способны его профили, расположенные в /etc/apparmor.d. Например, в Ubuntu 10.10 профиль для evince-thumbnailer позволяет запись в ~/.config/autostart — место, которое может быть использовано вирусописателями для автоматической загрузки их творений (или даже произвольных скриптов) при входе пользователя в систему. От некоторых вещей AppArmor не способен защитить в принципе, поскольку такая защита может нарушить стабильность работы системы:
Принимаем мерыЗащититься от всех угроз нам в любом случае никогда не удастся, но могу дать ряд полезных советов, которые существенно снизят риски:
ЗаключениеКак видишь, на деле Linux оказался не таким безопасным, как о нем привыкли думать, особенно это касается настольных и ориентированных на пользователя дистрибутивов типа Ubuntu. Другое дело, что ими пока не особо интересуются вирусописатели: извлечь материальную выгоду достаточно затруднительно из-за небольшого распространения Linux по сравнению с Windows. Links
|