воскресенье, 12 января 2014 г.

О X-сервере и Wayland

Недавно в новостях сообщили о найденной 23-летней уязвимости в X-сервере, а точнее - в библиотеке libXfont.

Не так давно Илья ван Шпрундель (Ilja van Sprundel) выступал с докладом «Безопасность Иксов. Хуже, чем кажется» на одной из конференций:


Слайды к докладу: XSecurity.ppt

X11 проектировался и разрабатывался в те времена, когда Интернет не был столь опасен. Особого внимания безопасности не уделялось и поэтому код изобилует простейшими ошибками. В основном эти ошибки заключаются в том, что сервер доверяет данным, полученным от клиента, а клиент доверяет данным, полученным от сервера. Это может таить за собой большие опасности: клиенты иногда запускаются и работают с suid-битом, в результате чего со стороны сервера можно получить root-доступ к клиентской системе. В обратную сторону всё ещё хуже: X-сервер постоянно работает с привилегиями root, поэтому клиент может получить root-доступ к системе, на которой работает сервер.

Ничем не лучше разнообразные расширения X-сервера, которые точно так же относятся к клиентским данным. Чаще всего проверяется лишь правильность размера полученной от клиента структуры, а её содержимое обрабатывается не глядя.

Приложения на основе библиотеки Qt страдают теми же проблемами, что и X-клиенты: они могут иметь suid-бит, они доверяют данным сервера. Приложения на основе GTK+ чуть лучше: библиотека GTK+ проверяет, с какими привилегиями работает программа. Если у программы установлен suid-бит, библиотека завершает программу.

Автор доклада нашёл большое количество разнообразных уязвимостей, в сервере, в клиенте, в расширениях, в библиотеках Qt и GTK+. Полный анализ не проводился, а разработчикам было сообщено лишь то, что первым попалось на глаза. Разработчики X11 исправили все ошибки, о которых было сообщено. Разработчики Qt попросту проигнорировали сообщения, разработчики GTK+ ответили, что нижележащая библиотека Xlib всё равно сведёт на нет все их усилия по обеспечению безопасности, поэтому их решение - это попросту запретить suid-программы, что они и так уже сделали.

Автор доклада отметил хорошую реакцию на ошибки команды безопасности Debian: пропатченные версии пакетов попали в репозиторий через 2 недели после исправления ошибок в апстриме.

Автор также упомянул о работе, проделанной командой OpenBSD по обеспечению возможности запуска X-сервера без привилегий root. Правда эта работа была проделана для X-сервера из проекта XFree86, который уже довольно давно почил в бозе. Нынешний X-сервер от Xorg продолжает запускаться с привилегиями root.

Меня заинтересовало, что же такое сделал проект OpenBSD с X-сервером и я нашёл слайды от 2003 года: xf86-sec.pdf

После чтения доклада я понял, X-сервер по-прежнему запускается от пользователя root, однако все привилегированные операции вынесены в отдельный процесс. Фактически X-сервер выполняет fork сразу после запуска. Дочерний процесс продолжает работать от имени root и выполняет привилегированные операции. Родительский процесс сразу после fork сбрасывает привилегии и не выполняет привилегированные операции сам, а запрашивает их через каналы (pipes) у дочернего процесса.

Также они пытались воспользоваться защищённым режимом доступа к памяти в процессорах архитектуры i386, когда некий блок памяти не может быть доступен одновременно на запись и выполнение, но у них ничего не получилось, т.к. в X-сервере имеются модули, которые загружаются в память и выполняются из неё.

Там же отмечены другие аспекты безопасности сервера. Например, сделана рекомендация не пользоваться сырым протоколом X11, т.к. он не шифруется и поэтому доступен для сниффинга и кейлоггинга. Рекомендуется использовать его только поверх SSH. Рекомендуется не использовать аутентификацию xhost, а использовать xauth, поскольку с его помощью можно ограничивать доступ определёнными пользователями системы, а не всей системой целиком. Там же выражено опасение о том, что в шрифтах может содержаться вредоносный код, поскольку рендер шрифтов представляет собой виртуальную машину.

Илья упомянул в своём докладе о том, что архитектура X11 давно поменялась и в настоящее время не обладает сетевой прозрачностью. Там он сослался на доклад об архитектуре X-сервера от Дэниэля Стоуна (Daniel Stone), который участвовал в разработке X.Org: The Real Story Behind Wayland and X

Я посмотрел и этот доклад. В X-сервере есть масса устаревшего кода: для управления портами ввода-вывода, для запуска приложений ELF, COFF, a.out, для межпроцессного взаимодействия и т.п. Дэниэль хвастается тем, что поделил X-сервер на модули и уменьшил общий объём кода чуть ли не в два раза. Он описал ситуацию с сетевой прозрачностью X-протокола, которая сложилась в настоящее время. Сетевой прозрачности по факту нет, т.к. большинство приложений пользуются расширениями X-сервера, которые предоставляют прямой доступ к оборудованию, а также большинство приложений рисуют собственные окна и шрифты самостоятельно, при помощи библиотек, работающих на стороне X-клиента.

По сути X-сервер в настоящее время является лишь механизмом межпроцессного взаимодействия, а сам он практически не делает никакой работы. Клиент сообщает X-серверу, что нужно нарисовать. X-сервер спрашивает у оконного менеджера, где это нужно нарисовать и рисует. Все эти сообщения передаются через IP-стек, в результате чего в обмен сообщениями добавляется существенная задержка. При старте браузера chromium минимальная задержка - полсекунды, реально она больше. Кроме того, X-серверу невозможно сообщить о моменте готовности картинки, картинка отображается в процессе её рисования, что также не радует глаз пользователя.

Учитывая сложившуюся ситуацию, разработчики X-сервера приняли решение её узаконить и реализовать более прямолинейно, без сложностей протокола X11. В новом проекте Wayland приложение рисует содержимое окна самостоятельно и отдаёт его серверу Wayland. Wayland взаимодействует с аналогом менеджера окон - композитором - и отрисовывает изображение на экране. В отличие от X-сервера, предполагается, что приложения в Wayland не будут обладать монопольным доступом к клавиатуре или мыши и станет возможным, например, управлять музыкальным плеером при помощи мультимедиа-клавиш, когда скринсейвер заблокировал доступ к экрану. Сам скринсейвер, при этом, выделяется в отдельную категорию приложений, как и композитор.

После просмотра этих докладов, пожалуй, ни у кого не останется сомнений в том, что от X'ов нужно избавляться и заменять их чем то более прямолинейным, аккуратно написанным и спроектированным исходя из современных реалий.