Уязвимость в Android, позволяющая обойти блокировку экрана

В платформе Android выявлена уязвимость (CVE-2022-20465), позволяющая отключить блокировку экрана путём перестановки SIM-карты и ввода PUK-кода. Возможность отключения блокировки продемонстрирована на устройствах Google Pixel, но так как исправление затрагивает основную кодовую базу Android, вероятно, что проблема касается и прошивок от других производителей. Проблема устранена в ноябрьском наборе исправлений проблем с безопасностью для Android. Обративший внимание не проблему исследователь получил от компании Google вознаграждение, размером 70 тысяч долларов.

Проблема вызвана неверной обработкой разблокировки после введения PUK-кода (Personal Unblocking Key), применяемого для возобновления работы SIM-карты, заблокированной после многократного неверного введения PIN-кода. Для отключения блокировки экрана достаточно установить в телефон свою SIM-карту, в которой выставлена защита на основе PIN-кода. После смены SIM-карты, защищённой PIN-кодом, на экран вначале выводится запрос PIN-кода. Если три раза неверно ввести PIN-код, произойдёт блокировка SIM-карты, после чего для разблокировки будет предоставлена возможность ввести PUK-код. Оказалось, что верный ввод PUK-кода не только разблокирует SIM-карту, но приводит к переходу в основной интерфейс в обход хранителя экрана, без подтверждения доступа при помощи основного пароля или графического ключа.



Уязвимость вызвана ошибкой в логике проверки PUK-кодов в обработчике KeyguardSimPukViewController, отвечающем за отображение дополнительного экрана аутентификации (в Android используется несколько типов экранов аутентификации, для PIN, PUK, пароля, графического ключа, биометрической аутентификации). При верном вводе PIN-кода срабатывает вторая стадия проверки, требующая ввода основного кода разблокировки, но при вводе PUK-кода подобная стадия пропускается и доступ предоставляется без запроса основного пароля или графического ключа. Отбрасывание следующего этапа разблокировки производится так как при вызове KeyguardSecurityContainerController#dismiss() не производится сравнение ожидаемого и пройденного метода проверки, т.е. обработчик считает, что смены метода проверки не произошло и завершение проверки PUK-кода свидетельствует об успешном подтверждении полномочий.

Уязвимость была выявлена случайно, у пользователя разрядился телефон и после зарядки и включения он несколько раз ошибся при вводе PIN-кода, после чего снял блокировку PUN-кодом и удивился, что система не запросила основной пароль, используемый для расшифровки данных, после чего система зависла с сообщением “Pixel is starting…”. Пользователь оказался дотошным и решил разобраться в чём было дело и стал разными способами экспериментировать с вводом PIN- и PUK-кодов, пока случайно не забыл перезагрузить устройство после смены SIM-карты и не получил вместо зависания доступ к окружению.

Особый интерес представляет реакция Google на сообщение об уязвимости. Информация о проблеме была отправлена в июне, но до сентября исследователь так и не смог добиться вразумительного ответа. Он посчитал, что подобное поведение объясняется тем, что он не первый, кто сообщил о данной ошибке. Подозрения, что что-то идёт не так возникли в сентябре, после установки обновления прошивки, впущенного спустя 90 дней заявленного периода неразглашения. После обновления проблема осталась неисправленной.

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

Release. Ссылка here.