🏦 Как не нужно писать Telegram-ботов
DANO — олимпиада по анализу данных, одним из организатором которой является Т-Банк Образование. Незадолго до объявления списка финалистов я нашёл бота, который предназначался для этого финала — @team_DANO_bot. Из функций — сбор команды, загрузка документов и гипотезы для исследования
Очевидно, что к боту должны иметь доступ только финалисты, поэтому в нём стояла аутентификация — бот просит нажать на кнопку и отправить свой контакт с номером телефона. Отправляемый контакт выглядит так же, как и любой другой контакт, которым можно поделиться, поэтому можно отправить не свой контакт, а любого другого пользователя — бот увидит не ваш номер, а чужой. От этого легко защититься — нужно проверять, что контакт действительно принадлежит тому пользователю, который его отправил.
Я попробовал отправить контакт с номером телефона одного из организаторов, и это сработало (рис. 1). На этот момент я не только получил несанкционированный доступ к боту, но и мог войти от имени любого участника, номер телефона которого я знаю.
Изучая функционал бота, я нашел выбор участников для добавления в команду. Он реализован через inline-кнопки, у которых есть callback data — а-ля ID кнопки, которое устанавливает сам бот. Важно: callback data может прочитать пользователь. Автор бота решил хранить там не ID пользователя, а его номер телефона (рис. 2) — получается, что я имею доступ ко всем номерам телефонов, а вкупе с предыдущем абзацем могу зайти от имени любого человека. Этого уже хватало, чтобы наложить крест на безопасности бота.
Также я заметил, что проверка ограничений в диалогах из нескольких сообщений выполнялась не в конце диалога, а в начале, из-за чего открывался интересный спектр багов — удаление бывшего участника-жертвы команды атакующего из любой другой (видео 3), добавление более 5 участников в команду и так далее.
Я сообщал о всех проблемах по мере их обнаружения, из-за чего организаторы в целом отказались от исправления ошибок и использования этого бота на олимпиаде.
Это не первый случай, когда у проектов Т-Образования появлялись бреши в безопасности. На фестивале See You от Центрального университета (IT-вуза Т-Банка) был бот с применением Web Apps, где отсутствовала валидация ID пользователя => я собрал список из 150 пользователей и потенциально мог получить доступ к их ЛК внутри бота. А 5 июня (момент ребрендинга Тинькоффа в Т-Банк) во время смены юзернеймов у Telegram-каналов их владельцы забыли закрепить за собой старые юзернеймы, из-за чего в руки третьих лиц попали @tinkoff_fintech, @tinkoff_invest_official, @tinkoff_career и другие, раньше принадлежавшие Т-Банку.
DANO — олимпиада по анализу данных, одним из организатором которой является Т-Банк Образование. Незадолго до объявления списка финалистов я нашёл бота, который предназначался для этого финала — @team_DANO_bot. Из функций — сбор команды, загрузка документов и гипотезы для исследования
Очевидно, что к боту должны иметь доступ только финалисты, поэтому в нём стояла аутентификация — бот просит нажать на кнопку и отправить свой контакт с номером телефона. Отправляемый контакт выглядит так же, как и любой другой контакт, которым можно поделиться, поэтому можно отправить не свой контакт, а любого другого пользователя — бот увидит не ваш номер, а чужой. От этого легко защититься — нужно проверять, что контакт действительно принадлежит тому пользователю, который его отправил.
Я попробовал отправить контакт с номером телефона одного из организаторов, и это сработало (рис. 1). На этот момент я не только получил несанкционированный доступ к боту, но и мог войти от имени любого участника, номер телефона которого я знаю.
Изучая функционал бота, я нашел выбор участников для добавления в команду. Он реализован через inline-кнопки, у которых есть callback data — а-ля ID кнопки, которое устанавливает сам бот. Важно: callback data может прочитать пользователь. Автор бота решил хранить там не ID пользователя, а его номер телефона (рис. 2) — получается, что я имею доступ ко всем номерам телефонов, а вкупе с предыдущем абзацем могу зайти от имени любого человека. Этого уже хватало, чтобы наложить крест на безопасности бота.
Также я заметил, что проверка ограничений в диалогах из нескольких сообщений выполнялась не в конце диалога, а в начале, из-за чего открывался интересный спектр багов — удаление бывшего участника-жертвы команды атакующего из любой другой (видео 3), добавление более 5 участников в команду и так далее.
Я сообщал о всех проблемах по мере их обнаружения, из-за чего организаторы в целом отказались от исправления ошибок и использования этого бота на олимпиаде.
Это не первый случай, когда у проектов Т-Образования появлялись бреши в безопасности. На фестивале See You от Центрального университета (IT-вуза Т-Банка) был бот с применением Web Apps, где отсутствовала валидация ID пользователя => я собрал список из 150 пользователей и потенциально мог получить доступ к их ЛК внутри бота. А 5 июня (момент ребрендинга Тинькоффа в Т-Банк) во время смены юзернеймов у Telegram-каналов их владельцы забыли закрепить за собой старые юзернеймы, из-за чего в руки третьих лиц попали @tinkoff_fintech, @tinkoff_invest_official, @tinkoff_career и другие, раньше принадлежавшие Т-Банку.