В открытом доступе появился эксплойт для переполнения буфера в куче в AnyDesk Linux

AnyDesk

Опубликованный эксплойт AnyPwn использует уязвимость переполнения буфера в куче в Linux-версии AnyDesk 8.0.2. Код позволяет выполнить команды на удалённой машине до того, как пользователь подтвердит управление рабочим столом. Служба AnyDesk в Linux обычно работает с правами root, поэтому успешная эксплуатация приводит к полному контролю над системой. Об уязвимости рассказал Рик де Йегер из исследовательской команды V12, он же выложил и демонстрацию рабочего кода.

Уязвимость AnyPwn в протоколе сессий

Проблема кроется в обработчике потоковых пакетов пятого режима протокола сессий AnyDesk. Этот участок доверяет длине полезной нагрузки, которую сообщает удалённая сторона, и не проверяет, укладывается ли она в оставшиеся данные пакета. Размер выделяемой памяти обработчик считает, прибавляя к пришедшей длине 16 байт заголовка объекта и выполняя сложение в 32-битной арифметике.

Здесь и возникает ошибка. При длине полезной нагрузки 0xfffffff0 прибавление 0x10 даёт 0x100000000, а это значение в 32 битах усекается до нуля. Другие значения вплоть до 0xffffffff приводят к выделению от 0 до 15 байт. При этом логическая длина объекта остаётся огромной, а указатель на данные стоит на 16 байт дальше начала выделенного блока. Копирование подконтрольных злоумышленнику байтов выходит за границы выделенной памяти.

Отправлять гигабайты не требуется. Хватает одного небольшого кадра: в нём указывают вредоносную длину, а тело пакета снабжают байтами переполнения. Такой кадр и вызывает повреждение памяти.

Как эксплойт превращает переполнение в выполнение команд

AnyPwn использует две стратегии подготовки памяти. Сначала эксплойт отправляет сто долгоживущих объектов пятого режима с разными размерами, чтобы заполнить нужные классы распределителя памяти. Затем открываются десять дополнительных клиентских соединений, среди подготовленных блоков размещают объекты-жертвы. Переполнение меняет служебные поля соседнего объекта, в том числе данные управления, влияющие на передачу выполнения.

Дальше идёт отдельное заполнение памяти повторяющимися объектами. В каждом - длинная последовательность инструкций возврата и цепочка, которая вызывает системную функцию целевого бинарника с выбранной злоумышленником командой. Такой подход, известный как return-oriented programming (программирование на возвратах в готовом коде), позволяет собрать нужное действие из фрагментов уже загруженной программы.

Успех не гарантирован. Если объект-жертва не оказался рядом с переполненным буфером, попытка валит службу AnyDesk, а команда не выполняется. Смещения в опубликованном коде рассчитаны на конкретную сборку; для других версий их придётся подгонять.

Обновление до AnyDesk 8.0.3 закрывает проблему

Уязвимость исправили в версии 8.0.3. AnyDesk отнесла её к проблемам только прямых Linux-соединений; Windows и macOS, по заявлению вендора, она не затрагивает. Исследователи подтвердили, что уязвимый участок протокола достижим и через релейные соединения AnyDesk, но полный сценарий выполнения команд они показали лишь через прямое подключение к TCP-порту 7070. Для релея продемонстрирован только минимальный триггер, а не готовый эксплойт.

Администраторам стоит обновить уязвимые Linux-системы до AnyDesk 8.0.3 или более новой версии. Когда обновление прямо сейчас невозможно, ограничение доступа к TCP-порту 7070 снижает риск для подтверждённых прямых атак, но не заменяет установку исправленной версии.

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

Ссылки

Комментарии: 0