Pre-auth RCE в Apple Screen Sharing: root за 60 секунд из-за забытого кода ошибки

· Безопасность
В демоне screensharingd на macOS до версии 26.5 обнаружена критическая уязвимость: ошибка в проверке длины кадра SRP позволяет неаутентифицированному злоумышленнику получить права root без пароля и без действий пользователя.

cover.svg

Исследование, опубликованное на warez.sl0p.foo, описывает критическую уязвимость в демоне общего доступа к экрану screensharingd на macOS вплоть до версии 26.5 (Tahoe). Проблема затрагивает все системы с включённой функцией «Общий экран» и не требует ни пароля, ни имени пользователя, ни какого-либо участия жертвы.

Один забытый регистр

В основе бага — классическая ошибка обработки ошибки. Демон читает из сети четырёхбайтовую длину кадра SRP, а затем проверяет её. Если длина оказывается слишком большой (≥ 32768), срабатывает ветка «кадр слишком велик» — но вместо кода ошибки функция возвращает залежавшийся статус предыдущей операции чтения, то есть ноль. А ноль вызывающий код трактует как «аутентификация успешно завершена».

В результате весь механизм SRP — генерация ключей, вычисление и проверка сессии — просто не выполняется. Сервер выставляет флаг authenticated = 1, отправляет клиенту подтверждение и переходит в основной цикл обработки сообщений RFB. Никакого обмена ключами, никакого согласования шифра: соединение работает открытым текстом, хотя протокол в норме поднимает слой ChaCha20-Poly1305.

От байта к root-шеллу

Дальше в дело вступает проприетарный протокол копирования файлов Apple (тип сообщения 0x22), работающий от имени root и дающий произвольные чтение и запись файлов. Атака укладывается в одно TCP-соединение: злоумышленник присылает версию RFB, тип безопасности 36 и один большой блок данных. В нём упакованы две транзакции записи — Perl-скрипт обратного шелла в /var/tmp/.r и crontab в /var/at/tabs/root (обязательно с правами 0600, иначе cron его проигнорирует).

В течение минуты cron подхватывает задание и запускает штатный, подписанный Apple /usr/bin/perl, который открывает атакующему root-шелл. После срабатывания оба файла самоуничтожаются. Эксплойт зависит от раскладки кучи и срабатывает примерно в одном случае из 5–15, поэтому по умолчанию делается до 20 попыток.

Отдельно авторы отмечают вторую, независимую слабость: сервер отвергает публичное значение A == 0, но не A ≡ 0 (mod N), что противоречит RFC 5054 и позволяет обнулить общий секрет, отправив A = N. В самом эксплойте она не используется.

Патч и любопытная деталь

Уязвимость исправлена в macOS 26.6, вышедшей 27 июля 2026 года: ветка «слишком большой кадр» теперь возвращает корректный ненулевой код ошибки. Пользователям без обновления рекомендуется просто отключить общий доступ к экрану.

Любопытнее всего дисклеймер: по признанию авторов, весь разбор, PoC и шаги воспроизведения были полностью произведены ИИ-агентами на основе статического анализа и автоматического тестирования, без участия человека. Отсюда и оговорка, что материал может содержать ошибки и требует независимой проверки.


Источник: Lobsters

Комментарии

Войдите, чтобы комментировать.

  • Пока нет комментариев.