Как приложение само подставляет код из SMS. Может ли программа читать все ваши сообщения

2040
Как приложение само подставляет код из SMS. Может ли программа читать все ваши сообщения

SMS с шестизначным кодом только пришло, а банковское приложение уже заполнило поле. Я бы не делал из этого вывод, что программа тайком читает всю переписку. Современные Android и iPhone умеют передавать или предлагать одноразовые коды через специальные системные механизмы без обычного разрешения на чтение SMS.

Автоматическая вставка кода сама по себе не доказывает, что приложение читает ваши сообщения. На Android программа может использовать SMS Retriever, получить одно конкретное сообщение после вашего подтверждения через SMS User Consent либо действительно иметь расширенный доступ к SMS. На iPhone код обычно распознаёт сама iOS и предлагает над клавиатурой. Внешне четыре сценария похожи, а с точки зрения приватности отличаются радикально.

Системное автозаполнение упрощает ввод одноразового кода, но не превращает SMS в неуязвимый способ аутентификации. Никому не сообщайте код по телефону или в чате и проверяйте, какую именно операцию подтверждаете.

Сначала я проверяю, какие права приложение действительно получило

На Android самый простой тест занимает меньше минуты. Открываю карточку приложения в системных настройках, затем раздел разрешений. Названия пунктов немного различаются у Samsung, Xiaomi, Pixel и других производителей, но путь обычно выглядит примерно так Настройки → Приложения → нужное приложение → Разрешения.

Если программа получила обычный доступ к SMS, среди разрешений появится соответствующая категория. Разрешения READ_SMS и RECEIVE_SMS относятся к чувствительным. Google Play жёстко ограничивает их применение. Обычному банковскому приложению или интернет-магазину не требуется читать всю SMS-базу только ради автоматического ввода кода.

Механизм Что получает приложение Нужно читать все SMS Что видит пользователь
Android с READ_SMS Доступ к SMS в пределах выданных системе прав Да, доступ значительно шире одного кода Разрешение SMS в настройках
SMS Retriever Текст специально адресованного приложению проверочного SMS Нет Код может вставиться без отдельного запроса
SMS User Consent Полный текст одного выбранного системным механизмом SMS Нет Android просит разрешить доступ к конкретному сообщению
iPhone AutoFill Приложение получает введённый код в своём поле Нет iOS предлагает код над клавиатурой

Есть ещё одна деталь. Отсутствие разрешения SMS не означает, что подозрительная программа вообще никак не способна увидеть текст сообщений. На Android существует отдельный доступ к уведомлениям. Если приложение «Сообщения» показывает текст SMS в уведомлении, сторонний слушатель потенциально работает уже с уведомлением, а не с базой SMS. Я подробно разбирал, что видит приложение при таком разрешении. В Android 15 система начала скрывать распознанные одноразовые коды от недоверенных слушателей уведомлений.

Как Android получает код без разрешения на SMS

Самый аккуратный вариант для разработчика, который контролирует собственные проверочные сообщения, называется SMS Retriever API. Механизм входит в Google Play services и специально создан для подтверждения номера без READ_SMS и RECEIVE_SMS.

Работает схема примерно так. Пользователь запускает вход или регистрацию. Приложение просит Google Play services ждать проверочное сообщение. Сервер отправляет SMS с одноразовым кодом и специальным хешем приложения. Play services получает сообщение, сверяет хеш и передаёт подходящий текст нужному приложению. Программа извлекает одноразовый код и отправляет его серверу для проверки.

Упрощённое сообщение может выглядеть примерно так.

Your ExampleApp code is 482731
 
 FA+9qCX9VSu

Последняя строка здесь не пароль и не секретный ключ. SMS Retriever использует 11-символьный хеш, вычисленный из имени пакета приложения и сертификата подписи, чтобы определить получателя. Google также требует, чтобы такое проверочное сообщение помещалось максимум в 140 байт.

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

Но разработчик не всегда контролирует формат SMS. Например, код отправляет сторонняя платёжная система, которая не добавляет фирменный хеш приложения. Для такого случая Google предлагает SMS User Consent.

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

Google Play services ищет сообщение с кодом длиной от 4 до 10 буквенно-цифровых символов, среди которых должна быть хотя бы одна цифра. Ожидание также продолжается около пяти минут. User Consent полезен как запасной вариант, но требует одного действия от пользователя.

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

Что происходит на iPhone

На iPhone пользователь обычно видит немного другой сценарий. Приходит SMS, iOS распознаёт одноразовый код и показывает его в панели QuickType над клавиатурой. Пользователь нажимает на предложение, после чего цифры появляются в поле приложения. Разработчик помечает такое поле как oneTimeCode. На веб-странице применяется похожий атрибут autocomplete="one-time-code".

Получается принципиальная разница с Android SMS Retriever. Приложение не просматривает «Сообщения» в поисках нужных цифр. Системный компонент iOS распознаёт код и предлагает подставить его туда, где пользователь сейчас вводит одноразовый пароль.

Apple добавила ещё один интересный слой защиты. Отправитель может привязать код к домену. Сообщение тогда содержит служебную строку примерно следующего вида.

Ваш код подтверждения 482731
 
 @example.com #482731

Для такого сообщения AutoFill предлагает код только сайту с указанным доменом либо приложению, связанному с этим доменом. Механизм появился в iOS 14 и снижает риск подстановки кода на фишинговой странице. Защита полезна, но зависит от правильной реализации со стороны сервиса.

В современных версиях iOS система также может автоматически удалять использованные проверочные коды из «Сообщений» и Mail, если пользователь включил функцию удаления после AutoFill. Такая уборка удобна, но на безопасность самой SMS-аутентификации почти не влияет.

Почему удобное автозаполнение не делает SMS безопасными

Главная ошибка выглядит так. Пользователь видит, что код автоматически появился в настоящем банковском приложении, и решает, что теперь украсть OTP невозможно. Автозаполнение решает другую задачу. Оно избавляет от копирования цифр и уменьшает потребность выдавать приложению широкий доступ к сообщениям.

SMS по-прежнему остаётся каналом передачи секрета. Мошеннику необязательно читать SMS технически. Часто проще позвонить человеку, представиться банком, доставкой или службой поддержки и убедить назвать код. Такой сценарий относится к социальной инженерии и смишингу. Если жертва сама сообщает OTP, никакой SMS Retriever ситуацию не исправит.

Есть и технические риски. Вредоносная программа может пытаться получить доступ к уведомлениям, использовать возможности специальных служб доступности, перехватывать происходящее на экране или заманивать пользователя на поддельную форму. Android 15 закрыл часть сценариев с кражей OTP через уведомления и демонстрацию экрана, но одна системная защита не превращает все старые и новые устройства в одинаково безопасные.

Я поэтому проверяю не сам факт автозаполнения, а контекст. Если приложение автоматически получило код и при этом не имеет разрешения SMS, такое поведение вполне нормально. Если неизвестная программа просит стать приложением SMS по умолчанию, получить доступ к уведомлениям или включить службу специальных возможностей без понятной причины, повод для подозрений гораздо серьёзнее.

Для быстрой самостоятельной проверки на Android я использую простой алгоритм.

  • Открываю разрешения приложения и смотрю, есть ли доступ к SMS.
  • Проверяю раздел специального доступа и список программ с правом читать уведомления.
  • Смотрю, не назначено ли подозрительное приложение обработчиком SMS по умолчанию.
  • Проверяю службы специальных возможностей и отключаю неизвестные программы.
  • При получении кода читаю текст SMS и название операции, а не просто нажимаю «Подтвердить».

На iPhone отдельное разрешение стороннему приложению на произвольное чтение всей SMS-переписки в обычной модели приложений не требуется для AutoFill. Если код появился над клавиатурой, перед пользователем работает системная функция iOS, а не доказательство скрытого доступа программы к «Сообщениям».

Мой вывод простой. Автоматически появившийся код чаще говорит о хорошо реализованной системной интеграции, а не о слежке за SMS. На Android стоит различать полноценное разрешение на сообщения, SMS Retriever, User Consent и отдельный доступ к уведомлениям. На iPhone основную работу выполняет iOS. Для безопасности гораздо полезнее проверить реальные разрешения программы и содержание подтверждаемой операции, чем пугаться самого автозаполнения.

Может ли Android-приложение получить код без разрешения READ_SMS?

Да. SMS Retriever API позволяет получить специально сформированное проверочное сообщение без READ_SMS и RECEIVE_SMS. Другой вариант, SMS User Consent, выдаёт приложению текст одного сообщения после системного подтверждения пользователя.

SMS Retriever передаёт только шестизначный код?

Нет. Приложению передаётся текст подходящего проверочного SMS, после чего программа сама извлекает из него код. Доступ ко всей SMS-базе через SMS Retriever не предоставляется.

Почему Android не показывает разрешение SMS?

SMS Retriever и SMS User Consent работают через Google Play services и не требуют постоянного разрешения Android на чтение SMS. Поэтому категории SMS в разрешениях приложения может не быть.

Может ли приложение получить код через уведомление?

Такой отдельный канал существует на Android. Если текст SMS попал в системное уведомление, программа с доступом к уведомлениям потенциально может работать с содержимым уведомления. Android 15 скрывает распознанные OTP от большинства недоверенных слушателей уведомлений.

Читает ли банковское приложение все сообщения на iPhone?

Само появление кода в поле такого доступа не означает. iOS умеет распознавать проверочные коды в «Сообщениях» и предлагать их через системное AutoFill.

Можно ли доверять коду, который iPhone предложил автоматически?

Автозаполнение подтверждает лишь то, что система распознала одноразовый код. Перед подтверждением банковской операции всё равно нужно проверить сумму, получателя и назначение действия. Для правильно реализованных domain-bound SMS iOS дополнительно учитывает домен сервиса.

Защищает ли автоматическое заполнение SMS-кода от фишинга?

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

Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.
12.1111:00 SECURITM | вебинарПДн есть. А контроль где?Знаете, где обрабатываются ПДн и кто за них отвечает? На вебинаре 12.11 покажем, как связать процессы, системы и требования, найти пробелы.Регистрируйтесь! Реклама: ООО «СЕКЪЮРИТМ», ИНН 7820074059, 18+