В фильме “Матрица” есть мемная сцена, когда Нео замечает двух совершенно идентичных чёрных кошек, после чего его спутники говорят о “сбое в матрице”, который тут же выливается в полный расколбас. Пару недель назад я испытал подобное чувство deja vu тогда, когда меньше всего этого ожидал.

Мой друг Лёша Павлов пилит Android-приложение для подкаста “Теоэстетика”, и я вызвался помочь как альфа-тестировщик. Присылает он мне в Telegram файл theoaesthetics.apk размером 6,6 МБ, я его подгружаю в свой Telegram для Android, пытаюсь поставить, но системные настройки не позволяют. Сохраняю в папку “Загрузки”, пытаюсь поставить оттуда, да опять не выходит – наверное, у меня телефон слишком старый. Докладываю Лёше, он пересобирает приложение и присылает новый файл theoaesthetics.apk размером 5,6 МБ. Окей, скачиваю и пытаюсь поставить по той же схеме, но получаю тот же результат. И тут внимательный глаз замечает, что в папке “Download” лежит файл размером не 5,6 МБ, а 6,6 МБ. Ну ладно, не туда тапнул видимо. Скачиваю файл ещё раз и наяву наблюдаю: качаю файл размером в 5,6 МБ, а в папке лежит файл размером в 6,6 МБ. Окей, яжпрограммист, чищу кэш скачанных файлов, скачиваю правильную apk-шку, которая уже ставится и работает… Но ведь это же пренеприятный баг, сбой в матрице.

Потыкал я свой Telegram палочкой, и оказалось, что проблема воспроизводится в 100% случаев, причём в папку “Download” всегда кладётся тот файл, который был первым подгружен из сети в недра Telegram для Android. Я воспользовался помощью своего коллеги (ещё раз спасибо, Лев!), который по моей просьбе прислал мне новый файл, совпадающий по имени с файлом из другой переписки, и всё повторилось. Причём если открыть файл внутри Telegram, то открывается ровно что ожидалось, а вот если сохранить его в папку “Download” (что на моём телефоне по умолчанию требуется для установки apk-шки), то скачивается не то. Это уже не просто баг, а целая уязвимость!

Telegram-приложения печально известны своими настройками по умолчанию: они качают всё подряд из посещённых личных чатов/бесед/каналов, автоматически воспроизводят видео и gif, долго-долго всё хранят. Это является риском для безопасности, и тому есть примеры. Пару месяцев назад компания CertiK предупреждала общими словами, что автоматическое скачивание в Telegram опасно, но телеграмовцы сказали, что это всё неправда. Спустя всего несколько дней стали известны детали RCE-уязвимости. Изворотливые пиарщики из Telegram сказали, что Python на Windows плюс уязвимую версию Telegram Desktop использует якобы менее 0,01% их пользователей (они сказали это по внутренним ощущениям или ценой нарушения приватности пользователей?), да вот к сожалению “забыли” рядом упомянуть, что именно люди с Python на машинах нередко являются разработчиками с доступом на чтение и запись к бесценным приватным репозиториям.

Когда я ставлю куда-то Telegram, то первым делом меняю настройки автовоспроизведения и автозагрузки, потому что первое просто бесит, а второе жрёт трафик и диск. Не скажу сходу, каковы настройки по умолчанию в Android-приложении, но подозреваю, что по крайней мере в некоторых сценариях (например, в личных чатах) файлы размером до скольких-то МБ при подключении скажем через Wi-Fi скачиваются автоматически. Да даже если всё по умолчанию было бы отключено, то ряд людей ведь крутит эти совершенно штатные настройки Telegram руками и явно желает автозагрузки, которую разработчики Telegram считают совершенно безопасным сценарием. Да даже если автозагрузки не было бы вообще, то что плохого в том, чтобы скачать, но не запускать apk-шку? Можно скачать даже не в папку “Download”, а всего лишь во внутреннее хранилище Telegram для Android. Это может произойти и в результате случайного тапа не в то место экрана. Словом, ничто не предвещало беды, но…

Выходит, что кэш скачанных файлов Telegram для Android можно “отравить”, заполнив “плохими” файлами, и это воплотит известную атаку типа “cache poisoning”. Самый опасный сценарий, который я придумал, таков. Пусть для жертвы по каким-то причинам является приемлемым скачивание apk-шек из Telegram: например, жертва связана с разработкой и тестированием ПО (от взлома такого человека можно многое получить!) либо имеет доверие к какому-то источнику apk-шек (скажем, к каналу со взломанными приложениями, который ведёт её друг). Слабейшее место моей атаки: если атакующий угадает имя файла, который жертва предположительно скачает из этого доверенного источника, то он может предварительно отравить кэш в Telegram для Android на устройстве жертвы своей зловредной apk-шкой. Кстати, такое можно провернуть не только с apk-файлами, но и с какими-то важными документами, тоже интересный сценарий. Подобрать имя может быть непросто, однако тут можно применить тактику ковровых бомбардировок и “отравить” сразу много разных имён. Жертва должна будет зайти на канал, в публичный или личный чат под контролем атакующего, но это кажется нетрудным для воплощения действием. Можно отправить жертве в личный чат зловред либо скинуть туда ссылку на групповой чат/канал со зловредом, а коли позволят настройки приватности, то просто бесцеремонно добавить туда жертву – наверняка ведь посмотрит. После этого останется только ждать, когда произойдёт открытие недоверенного файла после скачивания доверенного с тем же именем. Сценарий не 100%-ный, спору нет, но и фантастическим его никак не назовёшь.

Погуглил, и проблема оказалось известной: есть как минимум раз и два, есть даже пулл-реквест от стороннего разработчика с решением проблемы, но пока что воз и ныне там. Вернее, два бага и пулл-реквест касались только пользовательского опыта при скачивании из одного и того же места, не рассматривая скачивание из разных мест и соответственно безопасность. И вот тут из засады выскакиваю вооружённый паранойей я. Как говаривал Томас Пинчон, “Paranoia's the garlic in life's kitchen, right, you can never have too much”. Кроличья нора оказалось действительно глубокой.

В Windows-приложении и в веб-приложении я подобной проблемы не нашёл. Внутренняя папка со скачанными файлами Windows-приложения давно вызывала у меня подозрения, я когда-то даже проверил там сценарий с одинаковыми именами файлов в одном чате, проблем не нашёл и успокоился (как оказалось, напрасно).

Я написал на security@telegram.org раз, потом ещё раз, потом разработчику Android-приложения Telegram на его личную почту dkaraush@gmail.com, но увы, вообще никакого ответа за две с лишним недели не получил. Моя оригинальная жалоба разработчикам на английском лежит тут (sorry for my bad English). Понятно, что решение проблем занимает время, и я был вовсе не прочь подождать, да вот только я не получил ни слова ни от человека, ни от автоответчика. Неприятно. Кровь кипит, горячее сердце рвётся из груди, устал я молчать, взял да и сделал сию историю достоянием общественности во имя победы всего хорошего над всем плохим. Добрым молодцам (и красным девицам, без них никуда) урок!

Вот так полезно бывает тестировать приложения своих друзей. Спасибо, Лёша, твоё приложение стало приносить пользу ещё до релиза!

UPD 24.06.24. Ура! Мне написали на почту из Telegram, что уязвимость так себе, слишком много мороки, но ошибку намереваются починить. Статус бага в их баг-трекере изменился на "Готовится исправление", в канале с бета-сборками появился билд, где среди исправленных проблем указана эта.

"If you ever need to contact us again, we invite you to submit reports through the Telegram Bug Platform (https://bugs.telegram.org > Report a problem > I want to report a security issue). The 'Security' section is more actively attended to so responses will be more timely." Увы, ни слова об этом на https://core.telegram.org/bug-bounty не было, там было только про почту. Пожаловался на это!

Комментарии (6)


  1. sunsexsurf
    21.06.2024 20:34

    «внести правки в проект» - это же к статье не относится?


  1. mraat
    21.06.2024 20:34
    +1

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


  1. Fell-x27
    21.06.2024 20:34
    +3

    Эх, вот бы можно было ориентироваться не на имя файла, а на его содержимое, приводя его посредством каких-нибудь математических операций к некоему числу через n раундов простейшей суммаризации бит... Надо бы заняться ресерчем и написать что-то подобное. Я даже название уже придумал для этого механизма: "КОНТРОЛЬНАЯ СУММА, ПАША, БЛИН, Е-МОЕ, 2024 ГОД НА ДВОРЕ".

    Длинновато получилось, но это черновая версия. Может быть, позже получится придумать что-то поизящнее.


    1. posthedgehog Автор
      21.06.2024 20:34
      +3

      Судя по пулл-реквесту на GitHub, там под капотом ведётся БД файлов, и разные файлы складываются в одну папку с приписыванием (1), (2) и так далее. То же самое можно увидеть и на Windows в папке загрузок Telegram. В этом конкретном месте кода по ошибке данная БД не использовалась, вот и возникла проблема, а в других местах предположительно всё было нормально. Но стоило ли рожать такие сложности вместо хэшей, вопрос конечно интересный!


  1. omari0n
    21.06.2024 20:34
    +1

    Не, они исправили баг, по крайней мере на мобилке


    1. posthedgehog Автор
      21.06.2024 20:34
      +2

      Ура! Мне написали на почту из Telegram, что уязвимость так себе, слишком много мороки, но ошибку намереваются починить. Статус бага в их баг-трекере изменился на "готовится исправление".