В платформе 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 и графический ключ.
При верном вводе PIN-кода срабатывает вторая стадия проверки, требующая ввода основного кода разблокировки, но при вводе PUK-кода подобная стадия пропускается и доступ предоставляется без запроса основного пароля или графического ключа. Отбрасывание следующего этапа разблокировки производится так как при вызове KeyguardSecurityContainerController#dismiss() не производится сравнение ожидаемого и пройденного метода проверки, т.е. обработчик считает, что смены метода проверки не произошло и завершение проверки PUK-кода свидетельствует об успешном подтверждении полномочий.
Уязвимость была выявлена случайно - у пользователя разрядился телефон и после зарядки и включения он несколько раз ошибся при вводе PIN-кода, после чего снял блокировку PUK-кодом и удивился, что система не запросила основной пароль, используемый для расшифровки данных, после чего зависла с сообщением "Pixel is starting…". Пользователь оказался дотошным, решил разобраться в чём дело и стал разными способами экспериментировать с вводом PIN- и PUK-кодов, пока случайно не забыл перезагрузить устройство после смены SIM-карты и не получил вместо зависания доступ к окружению.
Особый интерес представляет реакция Google на сообщение об уязвимости. Информация о проблеме была отправлена в июне, но до сентября исследователь так и не смог добиться вразумительного ответа. Он посчитал, что подобное поведение объясняется тем, что он не первый, кто сообщил о данной ошибке. Подозрения, что что-то идёт не так возникли в сентябре, когда проблема осталась неисправленной после установки обновления прошивки, впущенного спустя 90 дней, когда уже истёк заявленный период неразглашения.
Так как все попытки узнать состояние отправленного сообщения о проблеме приводили лишь к автоматизированным и шаблонным отпискам, исследователь попытался связаться лично с работниками Google для выяснения ситуации с подготовкой исправления и даже продемонстрировал уязвимость в лондонском офисе Google. Лишь после этого работа по устранению уязвимости сдвинулась с мёртвой точки. В ходе разбора оказалось, что о проблеме уже кто-то сообщал ранее, но Google решил сделать исключение и выплатить вознаграждение за повторное сообщение о проблеме, так как только благодаря настойчивости его автора на проблему обратили внимание.
// cc-by opennet.ru
// converted with crypt’s opennet autoreposter
>>> Подробности