Отравляем кэш загрузок в Telegram для Android

61f822f47e8944be40a6a626306f1442

В фильме «Матрица» есть мемная сцена, когда Нео замечает двух совершенно идентичных чёрных кошек, после чего его спутники говорят о «сбое в матрице», который тут же выливается в полный расколбас. Пару недель назад я испытал подобное чувство 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). Понятно, что решение проблем занимает время, и я был вовсе не прочь подождать, да вот только я не получил ни слова ни от человека, ни от автоответчика. Неприятно. Кровь кипит, горячее сердце рвётся из груди, устал я молчать, взял да и сделал сию историю достоянием общественности во имя победы всего хорошего над всем плохим. Добрым молодцам (и красным девицам, без них никуда) урок!

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

Habrahabr.ru прочитано 2351 раз