- PVSM.RU - https://www.pvsm.ru -

Последнее время в Telegram все чаще обсуждаются темы пробива людей и утечек персональных данных. Мне стало интересно, а насколько сама экосистема Telegram устойчива к подобным утечкам.
Под катом история о том, как я нашел баг в Telegram. Баг позволяет ввести в заблуждение пользователя, и подтолкнуть его неосознанно поделиться своими данными — геолокацией и номером телефона.
Вот как это работает:
Сложность системы всегда была врагом безопасности.
Telegram вырос, уже перестал быть просто мессенджером, и дорос до большой медиа платформы с богатым функционалом. Отдельным особняком стоит Telegram Bot API, позволяющее выстраивать целые приложения внутри мессенджера — так называемых ботов.
Скорее всего каждый, кто пробовал создать своего бота, уже знает, что пользователю можно отправить запрос его номера телефона с помощью специальной кнопки.
Текст на этой кнопке можно задать любой. Причём такие же кнопки бот может использовать и для других взаимодействий:

После нажатия на кнопку, пользователю конечно же будет показано предупреждение что сейчас его контакт будет отправлен боту:

Это сообщение довольно однозначно говорит о риске деанонимизации, и предостерегает вдумчивого пользователя от опасных для него действий.
Перебирая обновления API, я вспомнил, что в какой-то момент Telegram дал пользователям возможность делать собственные локализации мессенджера. Были примеры, когда локализацию использовали для шуточных переделок интерфейса. В тот момент мне пришла в голову та же мысль, что и возможно вам сейчас:
А что, если попробовать “шуточно перевести” диалоговое окно, предупреждающее пользователя о передаче номера телефона боту, заменив его текст?

Вначале я думал, что заставить пользователя установить в приложение посторонний xml файл-локализацию будет намного сложнее, чем просто убедить кликнуть на Share contact. Ведь именно так, с помощью xml файла, Telegram предлагал распространять свои локализации среди собеседников.
Так я думал, пока не наткнулся в исходных кодах android приложения [1] на обработчик ссылок setlanguage.

То что нужно!
Оказалось, что в Telegram уже давно сделали платформу переводов, translations.telegram.org, доступную для всех пользователей Telegram, и теперь не нужно передавать никаких xml файлов.

Достаточно кликнуть по ссылке t.me/setlanguage/%lang% [2], после чего пользователь увидит диалоговое окно с запросом установки нового языка. И это окно значительно менее отпугивающее, чем сообщение о запросе номера телефона:

Регистрируемся на translations.telegram.org [3].
Добавляем свой язык, переводим нужные нам элементы интерфейса [4] и еще парочку других [5].
В локализации можно писать все что угодно. Мы напишем безобидный текст вместо ужасного предупреждения о расшаривании геолокации и номера телефона. Проделываем тоже самое для остальных платформ.
Наш ядовитый язык готов. Осталось подсунуть его пользователю.

Мне так и не удалось найти способ узнать установил ли пользователь предложенную ему локализацию. Не нашлось ни статистики языка на translations.telegram.org, ни изменений в профиле пользователя. Bot api позволяет узнать язык пользователя через параметр language_code [6], но его значение берется из системных настроек. Смена языка в приложении на параметр никак не влияет.
Что ж, тогда просто добавляем небольшую задержку после сообщения с ссылкой на язык. После выбора языка предлагаем пользователю ознакомиться с меню бота. При нажатии Ок в данном диалоговом окне, номер утекает к боту сообщением, а бот это сообщение тут же удаляет. Если бот будет использовать webhook для получения обновлений, то сообщение удаляется быстрее и пользователь возможно и не поймет что он только что отправил свой контакт.
Кстати, аналогично запросу контакта бот может попросить пользователя расшарить его геолокацию. Да, и это диалоговое окно тоже можно “перевести”.
Очевидно нельзя давать возможность пользователям переводить абсолютно весь интерфейс без модерации. Модерация переводов кстати включена для например вот этого диалогового окна translations.telegram.org/rutech/ios/unsorted/AuthCode.Alert [7]. О необходимости модерации нам сообщает метка Critical.

Выходит что вот такое маленькое упущение как отсутствие метки Critical для диалогов о расшаривании номера и геолокации приводят к утечке. Утечке весьма чувствительных данных, как для мессенджера строящего свой маркетинг вокруг privacy/security.
Мессенджер привязаный к вашему личному номеру телефона по определению не может быть приватным. Он может лишь удорожить процесс раскрытия вашей личности.
Данная уязвимость попала в программу bug bounty телеграма и была оценена в 100€.
P.S.
Заходите к нам в Telegram чат @secinfosec [8]. Там мы делимся опытом и обсуждаем всё что касается информационной безопасности: баг баунти, пентесты, бумажную и практическую безопасность, новые угрозы и методы борьбы с ними.
Автор: thanxqap
Источник [9]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/351945
Ссылки в тексте:
[1] исходных кодах android приложения: https://github.com/DrKLO/Telegram/blob/30d603778d6b4c78729e8daf24b899288010e24d/TMessagesProj/src/main/java/org/telegram/ui/LaunchActivity.java
[2] t.me/setlanguage/%lang%: https://t.me/setlanguage/%lang%
[3] translations.telegram.org: https://translations.telegram.org/
[4] элементы интерфейса: https://translations.telegram.org/rutech/ios/bots_and_payments/Conversation.ShareBotContactConfirmation
[5] еще парочку других: https://translations.telegram.org/rutech/ios/bots_and_payments/Conversation.ShareBotContactConfirmationTitle
[6] параметр language_code: https://core.telegram.org/bots/api#user
[7] translations.telegram.org/rutech/ios/unsorted/AuthCode.Alert: https://translations.telegram.org/rutech/ios/unsorted/AuthCode.Alert
[8] @secinfosec: https://t.me/secinfosec
[9] Источник: https://habr.com/ru/post/495990/?utm_source=habrahabr&utm_medium=rss&utm_campaign=495990
Нажмите здесь для печати.