Недостатък в Telegram Desktop е позволявал на бот да влага скрит JavaScript в съобщения в чатове, които потребителите експортират като HTML файлове, съобщиха изследователи по сигурността от ExPatch в доклад, публикуван на 12 септември.
В Telegram съобщението е изглеждало обикновено, с бутон с връзка, а скриптът се е изпълнявал само когато някой отвори експортирания файл в уеб браузър. След това той е можел да копира всяко съобщение от този файл към сървър, контролиран от атакуващия, или да пренапише съдържанието, показвано на страницата.
Telegram пусна корекция за сигурност през юли, но обновяването на приложението не актуализира файловете, експортирани с по-ранни версии, така че старите HTML експорти все още могат да съдържат злонамерения код.
Telegram Desktop, приложението на Telegram за Windows, macOS и Linux, може да запазва единичен чат или всички чатове от даден профил като HTML страници, които се отварят в браузър. Ботовете могат да добавят редове с бутони под съобщенията си, които Telegram нарича „inline keyboards“, а ботът избира текста, който да се показва на всеки бутон.
До влизането в сила на корекцията, кодът за експортиране е записвал този текст от бутона директно в HTML страницата, без да го ескейпва (екранира), са установили изследователите Денис Ростилов и Александър Ростилов.
Ескейпването преобразува символи като <, така че браузърът да ги показва като текст, вместо да ги третира като код. Експортът е прилагал това правило за текста на съобщенията, имената на подателите и други полета.
Поради това даден бот е можел да постави скрипт таг (script tag) в текста на бутона, допълнен с невидими символи, така че бутонът да изглежда празен в тестваната от тях версия на Telegram Desktop.
Не е необходимо ботът да участва в чата, който е целеви. Съобщение, чиито единствени бутони са уеб връзки, запазва тези бутони при препращане. Така всеки член, който препрати съобщението на бота в група, пренася и зловредния код с него, са установили изследователите. След това съобщението остава в историята на чата като всяко друго, докато не бъде изтрито, и може да бъде експортирано месеци или години по-късно.
Те са съобщили за уязвимостта на Telegram на 3 юни, два дни след откриването ѝ, и заявяват, че са я тествали само на собствените си профили и тестови групи. Техният доклад не съдържа твърдения, че някой е използвал този недостатък срещу реални потребители.
При отваряне на експортиран файл, съдържащ съобщението, скриптът се е изпълнявал без необходимост от допълнително щракване, посочват изследователите. Той е можел да прочете всяко съобщение в този файл, включително имената на подателите и времевите отпечатъци, името на чата, типа и броя на членовете, както и локалния път до файла, и да ги изпрати към сървъра на атакуващия.
Кодът за експортиране на Telegram Desktop разделя дългите експорти на файлове от по 1 000 съобщения, така че един файл разкрива най-много собственото си съдържание, а не целия чат или целия профил в Telegram.
Скриптът е можел също да пренаписа страницата. В демонстрацията на изследователите той е заменил целия експорт с фалшива форма за „потвърждение“ на Telegram.
Същият контрол е можел да промени дати, податели или текст на съобщения във файл, използван като архив или доказателство. Той не е променял копието на чата в самия Telegram, нито експортирания файл, запазен на диска.
Изследователите са оценили уязвимостта с 8.2 от 10 по скалата CVSS 3.1, като към 14 септември липсва официална оценка от Telegram или от Националната база данни за уязвимости на САЩ (NVD).
За да се изпълни скриптът, е трябвало да бъдат изпълнени три условия: HTML експортът да е направен с версия на Telegram Desktop преди корекцията, съобщението, носещо скрипта, да попада в експортирания чат, и файлът да е отворен в браузър с активиран JavaScript.
Изследователите са проучили само HTML експорта на Telegram Desktop и не са разглеждали JSON формата за експорт или функциите за експортиране в останалите приложения на Telegram.
Дали препратено съобщение от бот ще попадне в даден експорт зависи от начина, по който е направен той. Експортирането на единичен чат от неговото меню включва съобщенията на всеки член. Пълният експорт на профил включва по подразбиране само собствените съобщения на собственика на профила в групи и канали, но всички съобщения в личните чатове и чатовете с ботове, според кода за експорт и документацията на Telegram.
Корекцията за сигурност (комит 8457d13a от разработчика на Telegram Desktop Джон Престън) добавя липсващото ескейпване. Тя е написана на 30 юни и е включена в бета версията 6.9.4 на 3 юли и в стабилната версия 7.0.1 на 14 юли — първите коригирани версии, публикувани в GitHub. Неекранираният ред е присъствал в стабилните версии от 4.15.1 през март 2024 г., т.е. около две години и четири месеца.
- Засегнати: Telegram Desktop от 4.15.1 (март 2024 г.) до 6.9.3
- Коригирани: 6.9.4 beta (3 юли 2026 г.), 7.0.1 (14 юли 2026 г.) и по-нови
Изследователите съветват потребителите да:
- Обновят Telegram Desktop до версия 7.0.1 или по-нова, или до 6.9.4 или по-нова в бета канала.
- След обновяване да експортират отново всички чатове, които са били експортирани в HTML формат преди корекцията, или да отварят старите файлове само с деактивиран JavaScript.
- Третират всеки HTML експорт, направен преди корекцията, като ненадежден, особено този от големи групи, където произходът на всяко съобщение се проверява трудно.
Докато приложението не бъде обновено, няма причина да се създават нови HTML експорти, тъй като само експорти, генерирани от по-стария код, съдържат тази уязвимост.
Към 14 септември Telegram не е публикувал насоки за потребителите, които съхраняват по-стари експорти.
Без бюлетин за сигурност, без CVE
Бележките към версии 6.9.4 и 7.0.1, дневникът с промени на приложението (changelog) и съобщението на Telegram от 14 юли за актуализацията не споменават корекцията, а хранилището на Telegram Desktop в GitHub не съдържа бюлетини за сигурност.
Няма и CVE идентификатор за уязвимостта. Изследователите отбелязват, че към 11 септември, както и при търсене в публичните бази данни за уязвимости от The Hacker News на 14 септември, такъв не е открит.
Изследователите посочват, че Telegram е потвърдил уязвимостта на 1 юли и е предложил награда от 500 долара (bug bounty), която те са отказали с молба сумата да бъде дарена за благотворителност. Те са поискали координирана дата за публикуване и са предложили да запазят мълчание, докато корекцията за сигурност не бъде пусната.
„Разгледахме и възможността за публично разкриване, но не можем да го одобрим, тъй като разкриването дори на вече отстранени проблеми би могло да изложи на риск повече потребители на Telegram в бъдеще. Например, ако информация за дадена уязвимост стане публична, злонамерени субекти могат да се опитат да я експлоатират, като по този начин причинят финансови щети на потребителите на Telegram“, пише поддръжката на Telegram в имейл от 1 юли, който изследователите публикуваха като екранна снимка.
Изследователите са разълкували това като отказ да се разреши публикуването дори след направена корекция. Те заявяват, че докладът им не е бил обвързан със споразумение за конфиденциалност (NDA) и са публикували информацията на 12 септември, след като корекцията за сигурност вече е била пусната.
Публикуваните правила за награди за открити уязвимости на Telegram гласят, че уязвимости, „разкрити публично или пред трети страни преди да бъдат отстранени“, не отговарят на условията за възнаграждение. На страницата липсва информация относно публикуването след въвеждане на корекция.