Telegram Desktop’un HTML dışa aktarma özelliğindeki bir hata, eski sürümlerle oluşturulmuş dosyalarda yer alan buton metinlerini saldırgan kontrollü JavaScript’e çevirebildi. Araştırmacılar, açılan HTML dosyasının mesajları sızdırabildiğini ve sayfadaki içeriği yeniden yazabildiğini ortaya koydu.
Windows, macOS ve Linux için kullanılan Telegram Desktop, tek bir sohbeti ya da bir hesabın tüm geçmişini HTML sayfaları olarak dışa aktarabiliyor. Sorun, botların mesajların altına eklediği ve Telegram’ın inline keyboard olarak adlandırdığı butonların metninin kaçış karakterleriyle güvenli hale getirilmeden doğrudan HTML’e yazılmasından kaynaklandı. Bu nedenle bir bot, görünüşte sıradan bir buton etiketinin içine script etiketi yerleştirebildi.
Araştırmayı yürüten Denis Rostilov ve Aleksander Rostilov, script’in Telegram Desktop’ta test ettikleri sürümde boş görünen bir buton gibi maskelenebildiğini belirtti. Bunun için metnin görünmez karakterlerle doldurulabildiği aktarıldı. Telegram mesajı normal görünüyordu; kötü amaçlı kod ise ancak dışa aktarılan HTML dosyası tarayıcıda açıldığında çalışıyordu.
Çalışma mantığı doğrudan dosya içeriğine dayanıyordu. Kullanıcı HTML dışa aktarımını tarayıcıda açtığında JavaScript devreye giriyor, dosyanın içindeki mesajlar okunabiliyor ve veriler saldırganın sunucusuna gönderilebiliyordu. Aynı kod, sayfada görünen içeriği değiştirerek dışa aktarımı sahte bir Telegram doğrulama formuna dönüştürebiliyordu.
Script çalıştığında dosyanın içindeki her mesajı okuyabiliyordu. Buna gönderici adları, zaman damgaları, sohbetin adı, türü, üye sayısı ve yerel dosya yolu da dahildi. Araştırmacılar, bu bilgilerin tamamının saldırganın sunucusuna gönderilebildiğini söyledi.
Forward edilen bot mesajı aylar sonra bile risk yaratabiliyor
İncelemeye göre saldırganın hedeflediği botun aynı sohbette bulunması da gerekmiyordu. Yalnızca web bağlantılı butonlar taşıyan bir bot mesajı başka bir kullanıcı tarafından gruba iletildiğinde, bu mesaj ve düğmeleri de beraberinde taşıyordu. Mesaj grup geçmişinde sıradan bir kayıt gibi kalıyor ve aylar, hatta yıllar sonra dışa aktarma dosyasına girebiliyordu.
Telegram’ın eski dışa aktarma kodu, buton metnini HTML’e olduğu gibi yazıyordu. Araştırmacılar, mesaj metninde, gönderici adlarında ve diğer alanlarda kaçış işlemi uygulandığını, ancak buton metinlerinin aynı korumadan geçmediğini buldu. Kaçış işlemi, < gibi karakterlerin tarayıcıda kod yerine düz metin olarak görünmesini sağlıyor; eksik olan da tam olarak buydu.
Açık, tek bir dosyanın içeriğiyle sınırlı olsa da veri sızıntısı yaratabiliyordu. Telegram Desktop, uzun dışa aktarmaları her biri 1.000 mesajlık dosyalara bölüyor. Bu nedenle zararlı script, bütün hesabı değil, kendi bulunduğu dışa aktarma parçasını görebiliyordu. Buna karşın dosyada yer alan içerik yine de mesajların önemli bir bölümünü açığa çıkarabiliyordu.
Araştırmacılar, bu yöntemin sayfadaki görünümü de değiştirebildiğini kaydetti. Hazırladıkları demo senaryosunda dışa aktarılan içerik tamamen sahte bir doğrulama ekranıyla değiştirildi. Aynı kontrol, kayıt amaçlı kullanılan bir dosyada tarihleri, gönderenleri ya da mesaj metnini de değiştirebiliyordu. Ancak bu müdahale Telegram’ın kendi sohbet kopyasını ya da diskte saklanan orijinal dışa aktarma dosyasını değiştirmiyordu.
Script’in çalışması için üç koşul gerektiği belirtildi: HTML dışa aktarımının yamadan önceki bir Telegram Desktop sürümüyle hazırlanmış olması, script taşıyan mesajın dışa aktarılan sohbetin içinde yer alması ve dosyanın JavaScript açık bir tarayıcıda açılması. Araştırmacılar yalnızca Telegram Desktop’ın HTML dışa aktarma biçimini değerlendirdi; JSON dışa aktarma formatını ya da Telegram’ın diğer uygulamalarındaki dışa aktarma özelliklerini incelemedi.
Dışa aktarmaya forwarded bir bot mesajının girip girmemesi, hangi yöntemin kullanıldığına bağlıydı. Tek bir sohbeti menüden dışa aktarmak, o sohbetteki herkesin mesajlarını kapsıyordu. Tüm hesap için yapılan dışa aktarmada ise varsayılan olarak gruplar ve kanallarda yalnızca hesap sahibinin kendi mesajları alınırken, bire bir sohbetler ve botlarla yapılan konuşmalarda tüm mesajlar dışa aktarılıyordu. Bu ayrıntı, Telegram’ın belgeleri ve dışa aktarma kodunda yer alıyor.
Araştırmacılar, kusuru 3 Haziran’da Telegram’a bildirdi ve iki gün önce bulduklarını söyledi. Testi yalnızca kendi hesaplarında ve test gruplarında yaptıklarını vurguladılar. Yazılarında, açığın gerçek kullanıcılara karşı kullanıldığına dair bir iddia yer almadı.
Telegram, açığı 30 Haziran’da yazılan bir yama ile kapattı. Telegram Desktop geliştiricisi John Preston’ın 8457d13a numaralı değişikliği, eksik kaçış işlemini ekledi. Yama 3 Temmuz’da 6.9.4 beta sürümüne, 14 Temmuz’da da 7.0.1 kararlı sürümüne girdi. Bunlar, GitHub’da yayımlanan ilk düzeltilmiş sürümler oldu.
Açık, kararlı sürümlerde Mart 2024’te yayımlanan 4.15.1’den 6.9.3’e kadar olan aralığı etkiledi. Güvenlik araştırmacıları kusura CVSS 3.1 ölçeğinde 8.2 puan verdi. Bu haber yazıldığı sırada Telegram’dan ya da ABD Ulusal Güvenlik Açıkları Veritabanı’ndan bir puan görünmüyordu. Ayrıca bilinen bir CVE kimliği de bulunmuyor.
Telegram Desktop’ın sürüm 6.9.4 ve 7.0.1 için yayımladığı notlarda, uygulamanın changelog’unda ve Telegram’ın 14 Temmuz tarihli duyurusunda bu açığa yer verilmedi. Telegram Desktop GitHub deposunda da güvenlik duyurusu bulunmuyor. 14 Eylül itibarıyla eski HTML dışa aktarmalara sahip kullanıcılar için Telegram tarafından yayımlanmış resmi bir rehber de yoktu.
Yamanın uygulanmış olması, geçmişte üretilen HTML dosyalarını otomatik olarak düzeltmiyor. Eski sürümle dışa aktarılan dosyalar, içlerindeki script’i taşımaya devam ediyor. Araştırmacılar, güncellemeden sonra bu tür sohbetlerin yeniden dışa aktarılmasını ya da eski dosyaların yalnızca JavaScript kapalıyken açılmasını önerdi. Yama uygulanmadan önce oluşturulmuş her HTML dışa aktarımının güvenilmez sayılması gerektiğini de belirtti.
Telegram’ın bug bounty kuralları, kamuya ya da üçüncü taraflara düzeltilmeden önce açıklanan açıkları ödül kapsamı dışında bırakıyor. Kurallar, yama sonrası yayına ilişkin bir ifade içermiyor. Araştırmacılar, Telegram’ın 1 Temmuz’da açığı doğruladığını ve 500 dolarlık hata ödülü teklif ettiğini, ancak bunu reddedip yardım kuruluşuna bağışlanmasını istediklerini aktardı. Ayrıca koordineli bir yayım tarihi talep edip yama çıkana kadar sessiz kalmaya hazır olduklarını söyledi.
Telegram Support’un 1 Temmuz tarihli e-postasında, açığın kamuya açıklanmasının gelecekte kullanıcıları riske atabileceği ve kötü niyetli aktörlerin finansal zarar verebileceği yönünde bir değerlendirme yer aldı. Araştırmacılar bu yanıtı, düzeltme yayımlansa bile kamu duyurusuna izin verilmediği şeklinde yorumladı. Herhangi bir gizlilik anlaşmasının raporu kapsamadığını belirten ekip, yama dağıtıldıktan sonra 12 Eylül’de bulgularını yayımladı.
Kaynağa göre 11 Eylül itibarıyla kamuya açık güvenlik veri tabanlarında da bu açık için bir kayıt bulunmuyordu. Telegram’ın yayınladığı bilgide ya da araştırmacıların raporunda CVE kimliği yer almadı. Böylece olay, Telegram Desktop’ın HTML dışa aktarma zincirindeki eksik kaçış işlemine dayanan, adı konmamış bir güvenlik kusuru olarak kayda geçti.
