В открытой реализации протокола удалённого рабочего стола FreeRDP вышла версия 3.31.0. Она исправляет 22 уязвимости, включая переполнение буфера в клиенте, достижимое до аутентификации, и обход серверной политики NLA. Релиз затрагивает всех, кто использует FreeRDP в Linux-клиентах, тонких клиентах, шлюзах, серверах приложений, встраиваемых системах и средствах удалённого доступа. Разработчики называют выпуск крупным исправлением и настоятельно рекомендуют дистрибутивам обновиться незамедлительно.
Детали уязвимостей
Наиболее серьёзная проблема на стороне клиента связана с обработкой токена маршрутизации при перенаправлении сессии. Вредоносный сервер может передать клиенту специально сформированный блок данных с полем балансировки нагрузки, длина которого не ограничена. Клиент сохраняет это поле и при повторном подключении копирует его в буфер фиксированного размера 512 байт. Проверка длины выполняется уже после копирования, поэтому значение больше примерно 500 байт приводит к переполнению области динамической памяти. Атака происходит до завершения аутентификации и не требует учётных данных.
Последствия зависят от сборки. В конфигурации с отключёнными внутренними проверками, которую используют некоторые дистрибутивы, атакующий получает возможность записать содержимое за пределы выделенной области. Исследователи из Quarkslab показали, что вместе с утечкой неинициализированной памяти в канале перенаправления USB это позволяет обойти механизм защиты ASLR и выполнить произвольный код в процессе клиента. В сборках, где проверки включены, та же атака приводит к аварийному завершению программы и отказу в обслуживании.
Вторая серьёзная проблема затрагивает серверный режим FreeRDP. Если сервер настроен только на NLA, стандартный механизм предварительной аутентификации RDP, а клиент предлагает неподдерживаемый протокол безопасности, сервер отправляет отказ в согласовании, но не завершает соединение. Код ошибки в одной из конфигураций содержит бит, который позднее интерпретируется как запрос на использование транспорта RDSTLS. В результате неаутентифицированный клиент после получения отказа может установить TLS-соединение и попасть в обработчик RDSTLS, хотя этот режим на сервере отключён. По шкале CVSS проблема получила 9,3 балла.
Остальные исправления охватывают широкий круг компонентов. Среди них повреждения памяти при декодировании графики AVC444, ошибки в канале редиректа USB, использование после освобождения в обработчике динамических каналов, проблемы в парсере RPC-шлюза, а также раскрытие неинициализированных данных в служебных сообщениях протокола. Несколько уязвимостей позволяют удалённо вызвать отказ в обслуживании до аутентификации. Часть проблем находится в периферийных подсистемах, таких как редирект принтеров, смарт-карты и виртуальные каналы, которые активируются не при каждом подключении.
Важно понимать, что FreeRDP используется не только как самостоятельный клиент. Библиотека встроена в Remmina, GNOME Connections, KRDC, Apache Guacamole и другие продукты удалённого доступа. Поэтому обновления требуют не только основные пакеты, но и все программы, которые содержат собственную копию FreeRDP. Администраторам стоит проверить, какие компоненты в их инфраструктуре используют эту библиотеку, и получить исправленные версии из репозиториев операционной системы или из официального канала проекта.
Перед обновлением следует уделить внимание системам, доступным из интернета: RDP-шлюзам, общим рабочим станциям, консолям виртуализации и серверам с включённым редиректом устройств или графикой H.264. Если установить исправления сразу невозможно, снизить риск помогут сегментация сети, VPN, модель доступа с нулевым доверием, разрешающие списки адресов и постоянный мониторинг необычных попыток подключения и падений RDP-сервисов.
Выпуск 3.31.0 показателен тем, что проблемы найдены как в клиентской, так и в серверной части, в том числе в редиректе USB, звуке и подсистеме смарт-карт. Эти компоненты годами оставались вне основного пути согласования соединения и получали меньше внимания при аудите, хотя именно они часто дают доступ к памяти процесса. Регулярное обновление всех элементов стека RDP, а не только базового клиента, остаётся основной мерой защиты от подобных атак.
Ссылки
- https://github.com/FreeRDP/FreeRDP/releases/tag/3.31.0
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-q65v-4w7q-hx3r
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-9jcm-x588-gh26
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-x7v6-xfx3-52j6
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-6mpx-c8rj-whj5
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-r7jx-j9h7-j4xj
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-hw7p-5h2r-83gq
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-f5p6-88mh-59vg
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-w9qg-g24r-77f6
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-vccg-35r5-8jrf
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-pj8w-fh79-f438
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-23pf-q83q-x45r
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-j5mq-3349-gwmm
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-v649-94v2-p72q
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-57h7-vw2f-2f9x
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-hg4r-vv53-vwf8
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-2vf2-grvj-6g8x
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-4464-r7qj-pgrx
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-ffjr-p229-hpch
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-r9pv-ffph-6gg6
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-m85m-3qxv-63h5
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-h5w2-q35j-443h
- https://github.com/FreeRDP/FreeRDP/security/advisories/GHSA-c5gr-hmqp-pwj4