Как «защищённые» мессенджеры защищены от кражи SMS

Mykola Kostynyan
Digital Security Panda
14 min readMay 18, 2016

--

После взлома Telegram-аккаунтов российских оппозиционеров путем получения кодов подтверждения из SMS третьими лицами (http://mts-slil.info/) мы решили экспериментальным путём разобраться насколько «защищённые» мессенджеры — Signal, WhatsApp и Telegram — защищены от такого рода атак.
По результатам эксперимента мы предложим рекомендации для пользователей как обезопасить свои аккаунты.

Под угоном аккаунта пользователя мы понимаем получение доступа к аккаунту жертвы атакующим — или одновременно с жертвой (у обоих будут активные сессии), или вместо жертвы (у жертвы активная сессия прекратится). То есть злоумышленник на своём устройстве зарегистрировал/активировал/вошёл в приложение Signal, WhatsApp или Telegram от вашего имени и может писать сообщения или звонить от вашего имени другим пользователям.

При этом мы говорим «зарегистрировал/активировал/вошёл» потому, что получение активной сессии в приложении на своём устройстве каждый из мессенджеров называет по-разному:
Signal: зарегистрировать/разрегистрировать/перерегистрировать устройство (Register/Un-register/Re-register your device). У Signal также есть такое понятие как «устройство будет офлайн» или «устройство уйдёт в офлайн» (your first device will be offline)
WhatsApp: активировать приложение на своем телефоне/деактивировать аккаунт на телефоне
Telegram: войти/выйти в/из Telegram (log in/log out to/from Telegram); у Telegram также есть такое понятие как «активные сессии» (Active Sessions) и «завершить Telegram-сессию» (terminate your Telegram session)

Итак, если злоумышленник сможет получить смс пользователя вместо него или вместе с ним, то:

  1. Сможет ли он угнать аккаунт пользователя Signal, WhatsApp или Telegram, который зарегистрирован на этот номер телефона?
  2. Может ли пользователь встроенными в мессенджер средствами предотвратить такой угон своего аккаунта?
  3. Какую информацию в результате успешной атаки получит атакующий (контакты, содержимое переписки, историю звонков)?
  4. Узнает ли жертва, что у неё угнали аккаунт?
  5. Если атакующий напишет от имени жертвы кому-нибудь из её контактов — может ли тот понять, что ему пишут с угнанного аккаунта? Или что «что-то не так»?

Краткие результаты эксперимента:

Для эксперимента мы использовали смартфон Google Nexus 5x на Adnroid 6.0.1, обычный телефон Nokia 1280 для получения SMS и iPhone 4s на iOS 9.3.1.

Вот что у нас в результате получилось, последовательно:

  1. Злоумышленник получает доступ к SMS жертвы и угоняет аккаунт
  2. Какую информацию при этом получает атакующий
  3. Что при этом видит жертва, понимает ли, что её аккаунт угнали
  4. Атакующий от имени жертвы пишет собеседнику жертвы — увидит ли собеседник, что «что-то не так»?
  5. Может ли жертва встроенными в мессенджер средствами предотвратить угон своего аккаунта путём кражи данных из SMS
  6. Почему двухфакторная авторизация/верификация в Telegram не работает, то есть не предотвращает угон аккаунта
  7. Рекомендации для пользователей

Злоумышленник получает доступ к SMS жертвы и угоняет аккаунт

Важно понять, что требуется для авторизации (регистрации/активации/входа в приложение): чтобы сим-карта с этим номером была активна в момент авторизации на этом устройстве — или достаточно любым способом получить доступ к содержимому SMS и вручную ввести код подтверждения.

Итак, атакующий установил себе на Android-смартфон все мессенджеры, в этом смартфоне НЕ установлена сим-карта с номером жертвы. Сим-карта жертвы находится в телефоне Nokia 1280.

Атакующий у себя на смартфоне указывает номер телефона жертвы и пытается зарегистрировать/активировать/войти в приложение:
WhatsApp позволяет вручную ввести код подтверждения, полученный через SMS на Nokia, и атакующий успешно угоняет аккаунт жертвы
Telegram позволяет вручную ввести код подтверждения, и атакующий успешно угоняет аккаунт жертвы
Telegram, если была включена двухфакторная авторизация, позволяет вручную ввести код подтверждения, и атакующий успешно угоняет аккаунт жертвы (подробности в разделе о неработающей двухфакторной авторизации в Telegram)
Signal не позволяет вручную ввести код подтверждения в приложении на Android, но позволяет в приложении на iOS (об этом ниже).
На Android он требует автоматически подтянуть код из SMS, или получить код через телефонный звонок. При этом если переслать полученную SMS с Nokia на Android — Signal код подтверждения из такой SMS не «узнает».
Если атакующий может принять телефонный звонок на номер жертвы, то во время звонка робот продиктует код подтверждения, который приложение Signal на Android предложит ему ввести вручную. То есть Signal на Android не позволяет вручную ввести код подтверждения из SMS, но позволяет вручную ввести код подтверждения, полученный через телефонный звонок.
Если атакующий не может принять телефонный звонок, существует другое решение: попробовать не с Android, а с iPhone — Signal для iPhone позволяет ввести код подтверждения вручную, и SMS выглядит по-другому:

Именно для этого нам понадобился iPhone. В дальнейшем в ходе эксперимента мы для удобства используем Android (зарегистрировались через телефонный звонок на Nokia 1280).

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

Какую информацию при этом получает атакующий

WhatsApp: никакую, «голый» аккаунт
Telegram: все контакты из несекретных чатов, всю переписку из несекретных чатов. Из секретных чатов не получает ничего
Telegram, если была включена двухфакторная авторизация: никакую, «голый» аккаунт
Signal: никакую, «голый» аккаунт

Что при этом видит жертва, понимает ли, что её аккаунт угнали

WhatsApp: жертва видит уведомление, что «невозможно верифицировать этот телефон», так как с этим номером телефона зарегистрировались на другом устройстве. В WhatsApp одновременно может быть зарегистрировано (активировано) только одно устройство (веб-версия не в счёт, это не отдельный вход в систему).
WhatsApp, при этом, предлагает жертве «верифицироваться», то есть активировать приложение на своём телефоне снова. Если жертва способна получать SMS на свой номер, она может «верифицироваться» — и тогда атакующего, в свою очередь, выкинет из системы (деактивирует аккаунт на его телефоне). Одновременно с жертвой атакующий не сможет пользоваться этим аккаунтом:

Telegram: жертва видит сообщение о входе в свой аккаунт с другого устройства, инструкцию как завершить Telegram-сессию на устройстве атакующего, а также предложение включить двухфакторную авторизацию. Перед этим жертва также получит код для входа, так как при входе с нового устройства Telegram сначала отправляет код на другие приложения в виде сервисного сообщения, а уже потом (если нажать на «Didn’t get the code?») через SMS:

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

Signal: жертва ничего не видит, но при этом не может отправлять сообщения. При попытке отправить сообщение жертва видит ошибку:

Нажав на сообщение для просмотра подробностей, жертва тоже не увидит никаких объяснений почему сообщение не отправляется. «Failed to send», и всё. Более того, жертву вводит в заблуждение кнопка «RESEND», которая не работает снова и снова:

У Signal, как и у WhatsApp, на один номер телефона одновременно может быть зарегистрировано только одно приложение (веб-версия не в счёт, это «присоединённое» устройство, а не отдельный основной вход в систему), об этом можно почитать на сайте разработчика: http://support.whispersystems.org/hc/en-us/articles/213240927.
То есть когда атакующий успешно угоняет аккаунт жертвы, Signal жертвы перестаёт работать («уходит в офлайн») — но никак об этом жертве прямо не сообщает (в отличие от WhatsApp), а, вместо этого, выдаёт ошибки при попытке отправить сообщения. Эти ошибки идентичны тем, которые видит пользователь при проблемах с подключением к сети.

Для сравнения: если у пользователя WhatsApp угнали аккаунт, он не может посмотреть свою переписку в чатах, контакты, историю звонков — ничего, только предложение «верифицироваться». Для пользователя всё выглядит так, будто он только что с нуля установил WhatsApp себе на устройство. Если у пользователя Telegram с включённой двухфакторной авторизацией угнали аккаунт, для него всё выглядит так же: будто он только что с нуля установил приложение Telegram себе на устройство.
Если же у пользователя Signal угнали аккаунт, он дальше может запускать своё приложение, просматривать свою переписку, контакты, настройки, писать новые сообщения и безуспешно пытаться их отправлять.

Атакующий от имени жертвы пишет собеседнику жертвы — увидит ли собеседник, что «что-то не так»?

WhatsApp: при настройках по умолчанию собеседник ничего не видит. Если же собеседник у себя в настройках включит «Show security notifications» (Settings => Account => Security => Show security notifications), то увидит в том же чате предупреждение о том, что у собеседника изменился «код безопасности»:

Если собеседник нажмёт на это уведомление, то увидит подробности — что, возможно, собеседник переустановил приложение на своём телефоне, или же сменил телефон; а также, предложение верифицировать новое приложение собеседника:

Telegram: собеседник увидит просто еще один секретный чат. Это может насторожить, а может и не насторожить: для Telegram вполне штатная ситуация, когда тот же собеседник создает новый секретный чат, их может быть сколько угодно. Никакого специального предупреждения по этому поводу собеседник не получит:

Telegram, если была включена двухфакторная авторизация: собеседник увидит, что жертва снова зарегистрировалась в Telegram (присоединилась к Telegram). Позже, через 12–16 часов, в старых чатах вместо имени жертвы будет указано «Deleted Account»:

Signal: собеседник в том же чате увидит уведомление, что получено сообщение с неизвестным ключом. И чтобы увидеть полученное сообщение, нужно нажать на уведомление:

Когда собеседник нажмёт на уведомление, система заставит его верифицировать новый ключ — или же просто «поверить» и принять его без проверки. Стоит отметить, что большинство пользователей так и сделают — просто примут новый ключ без проверки:

Может ли жертва встроенными в мессенджер средствами предотвратить угон своего аккаунта путём кражи данных из SMS

WhatsApp: нет, не может. Тут предусмотрена верификация только через получение SMS. Соответственно, у кого данные для входа из SMS — того и аккаунт.

Signal: нет, не может. Тут тоже предусмотрена верификация только через получение SMS (или телефонный звонок).

Telegram: нет, не может. Включённая двухфакторная авторизация не помешает атакующему угнать аккаунт. Подробнее об этом в следующем разделе.

Почему двухфакторная авторизация/верификация в Telegram не работает, то есть не предотвращает угон аккаунта

Двухфакторная авторизация в Telegram включается в Settings => Privacy and Security => Two-Step Verification. Тут нужно установить пароль и, по желанию, можно указать адрес электронной почты для восстановления пароля на случай, если пользователь его забудет.

Если у жертвы в Telegram включена двухфакторная авторизация, то у атакующего происходит следующее:

1. Атакующий у себя в приложении указывает номер телефона жертвы и пытается войти в аккаунт. Тут он видит сообщение, что код отправлен не по SMS, а на приложение, зарегистрированное на этот номер, на другом устройстве:

2. В этот момент жертва получает системное уведомление у себя в приложении (или приложениях) Telegram:

3. Атакующий нажимает «Didn’t get the code?» и Telegram отправляет код через SMS:

4. Тут атакующий вводит код из SMS и узнает, что в настройках аккаунта включена двухфакторная авторизация и что ему нужно ввести пароль (в данном случае «10» это подсказка для пароля, выбранная при включении двухфакторной):

5. Далее атакующий притворяется, будто он забыл пароль — «Forgot password?». Тут атакующему сообщают, что код восстановления отправлен на электронную почту (если жертва при включении двухфакторной авторизации указала адрес электронной почты). Атакующий не видит адреса электронной почты — он видит лишь то, что после «собачки»:

6. В этот момент жертва получает код для сброса пароля на адрес электронный почты (если она указала адрес электронной почты при включении двухфакторной авторизации):

7. Атакующий нажимает «ok» и видит окошко, куда нужно ввести код для сброса пароля, который был отправлен на электронную почту. Тут атакующий говорит, что у него проблемы с доступом к своей почте — «Having trouble accessing your e-mail?». Тогда Telegram предлагает «reset your account»:

8. Атакующий нажимает «ok» и видит два варианта — или ввести пароль, или нажать «RESET MY ACCOUNT». Telegram объясняет, что при «переустановке» аккаунта потеряется вся переписка и файлы из всех чатов:

9. Атакующий нажимает «RESET MY ACCOUNT» и видит предупреждение, что это действие невозможно будет отменить и что при этом все сообщения и чаты будут удалены:

10. Атакующий нажимает «RESET» и Telegram просит указать имя для «переустановленного» аккаунта:

11. Собственно, все, атакующий успешно угнал аккаунт: он вошел под номером телефона жертвы и может писать от её имени сообщения:

12. Жертва при этом видит приложение таким, каким оно было сразу после установки. Приветственный экран рассказывает о Telegram и предлагает зарегистрироваться или войти в уже существующий аккаунт:

13. Когда атакующий пишет от имени жертвы кому-нибудь из контактов жертвы, этот контакт видит, что жертва только что присоединилась к Telegram (что подозрительно), а также новое сообщение (или сообщения) в новом чате от жертвы. Через 12–16 часов контакт также увидит, что в старых чатах вместо имени жертвы указано «Deleted Account»:

Если жертва имеет возможность получать SMS на этот номер телефона, она может войти в приложение Telegram на своём устройстве. Если атакующий на угнанном аккаунте не включил двухфакторную авторизацию, жертва может войти и в меню Settings => Privacy and Security => Active Sessions прекратить все остальные сессии (то есть сессии атакующего):

Если же атакующий на угнанном аккаунте включил двухфакторную авторизацию — жертва, в свою очередь, таким же образом может «угнать обратно» свой аккаунт.

Получается, что единственная польза от двухфакторной авторизации в Telegram — чтобы атакующий не получил переписку из обычных не секретных чатов. То есть Telegram с включённой двухфакторной авторизацией даёт приблизительно то же самое, что Signal и WhatsApp обеспечивают и так, без никакой двухфакторной авторизации.

Павел Дуров, создатель мессенджера Telegram, сказал:

… есть двухфакторная авторизация (пароль на аккаунт), аккаунт привязан к сим-карте адекватной юрисдикции, наиболее деликатные моменты обсуждаются в секретных чатах. В принципе, любая из этих мер по отдельности позволяет защитить важную информацию. …

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

Рекомендации для пользователей

WhatsApp:

1. Обязательно включить в настройках Settings => Account => Security => Show security notifications. Тогда вы будете получать системные уведомления если ваш собеседник напишет вам с другого приложения или устройства, — и сможете, заподозрив неладное, проверить действительно ли вы общаетесь с тем, с кем вы думаете, или это атакующий пишет от его имени. Для этого нужно нажать на уведомление об изменении кода безопасности:

Далее нужно нажать «VERIFY»:

И верифицировать код безопасности вашего собеседника. Для этого попросите собеседника тоже открыть экран верификации кода безопасности вашего с ним разговора (из вашего чата ему нужно перейти в Меню настроек — View contact — Encryption). Тут вы можете или отсканировать QR-код друг друга, или сверить 60-тизначный номер (например, просто позвонив по телефону и поочерёдно зачитывая друг другу наборы цифр):

2. Попросите ваших собеседников сделать то же самое, включить Settings => Account => Security => Show security notifications. А также всегда верифицировать коды безопасности, когда приходит такое уведомление.

3. Если вы видите уведомление, что «невозможно верифицировать этот телефон», так как с этим номером телефона зарегистрировались на другом устройстве, и предложение «верифицироваться» — сделайте это как можно быстрее (это деактивирует аккаунт на устройстве атакующего). А также сообщите всем важным контактам об инциденте, спросите не писал ли им кто-то от вашего имени пока ваше приложение было деактивировано.

4. Напишите разработчикам WhatsApp, чтобы они сделали двухфакторную авторизацию (support@whatsapp.com).

Signal:

1. Если видите в чате уведомление, что получено сообщение с неизвестным ключом и Signal предлагает вам верифицировать его — обязательно сделайте это. Любым другим способом свяжитесь (позвоните, например) с вашим собеседником, спросите переустанавливал ли он Signal, в идеале сверьте отпечатки («фингерпринты») ключей (в вашем текущем чате нужно нажать на Меню => Conversation settings => Verify identity).

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

3. Если при попытке отправить сообщение вы видите ошибку — возможно, кто-то другой зарегистрировался в Signal с вашим номером телефона, а ваше текущее приложение «ушло в офлайн» (и Signal вам об этом никак не сообщает).
Если кнопка «RESEND» не работает снова и снова, а видимых проблем с подключением к сети у вас нет (работают другие мессенджеры, почта, открываются сайты в браузере), — проще всего переустановить Signal (удалить приложение и установить снова) и зарегистрироваться заново.
Если после переустановки и перерегистрации всё заработало — спросите у своих контактов не писал ли им кто-нибудь от вашего имени пока вы были «в офлайне».

4. Напишите разработчикам Signal, чтобы они сделали двухфакторную авторизацию (http://support.whispersystems.org/hc/en-us/requests/new).

5. Напишите разработчикам Signal, чтобы они сделали внятное уведомление о том, что ваше текущее приложение «ушло в офлайн» из-за того, что кто-то зарегистрировал другое приложение с вашим номером телефона. И что до перерегистрации ваше приложение работать не будет (http://support.whispersystems.org/hc/en-us/requests/new).

Telegram:

1. Включите двухфакторную авторизацию: Settings => Privacy and Security => Two-Step Verification. Это не защитит ваш аккаунт от угона, но защитит вашу переписку из не секретных чатов от атакующего.

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

3. Если видите уведомление о входе в аккаунт с другого устройства, следуйте инструкциям из уведомления. Сообщите важным контактам об инциденте, спросите, не писал ли им кто-нибудь от вашего имени пока активная сессия на этом «другом устройстве» не была завершена.

4. Если у вас включена двухфакторная авторизация и вы видите сообщение с кодом для сброса пароля у себя в электронной почте, значит, кто-то успешно получил код для входа из SMS, отправленной на ваш номер телефона, и теперь обходит двухфакторную авторизацию. Оповестите ваши контакты и сообщите об этом в службу поддержки Telegram (https://telegram.org/support).

5. Если видите еще один секретный чат от какого-нибудь собеседника, лучше связаться с ним любым другим способом и проверить действительно ли это он вам пишет. В идеале, нужно верифицировать собеседника секретного чата всегда (в вашем текущем секретном чате нужно нажать на имя собеседника => Encryption Key). То же самое нужно сделать если видите, что ваш собеседник «присоединился к Telegram».

6. Попросите собеседников делать то же самое: если от вашего имени они видят еще один секретный чат, или что вы «присоединились к Telegram» — пусть свяжутся с вами и всё выяснят.

7. Напишите разработчикам Telegram и попросите сделать уведомления о том, что собеседник пишет с нового приложения/устройства (https://telegram.org/support).

8. Напишите разработчикам Telegram и попросите сделать настоящую двухфакторную авторизацию — такую, которая работает и которая не позволит атакующему угнать ваш аккаунт (https://telegram.org/support).

Вопросы и комментарии пишите по адресу: bezlimitchyk@gmail.com

--

--