Telegram Desktop vulnerability allowed any user's file to be stolen

Problem Statement: Ilusi Keamanan di Balik Penanganan Berkas Desktop

Riset keamanan yang dipublikasikan oleh beaksec mengungkap kerentanan kritis pada Telegram Desktop yang memungkinkan pencurian berkas lokal pengguna hingga one-click account takeover. Insiden ini bukan diakibatkan oleh eksploitasi memori tingkat rendah (memory corruption) atau zero-day pada kernel, melainkan kegagalan mendasar pada logika aplikasi dalam memvalidasi berkas dan menyerahkan eksekusinya ke sistem operasi.

Telegram Desktop memproses interaksi berkas dengan asumsi bahwa daftar hitam (blocklist) ekstensi berkas sudah cukup untuk melindungi pengguna dari eksekusi kode berbahaya. Pendekatan ini terbukti rapuh. Penyerang dapat menyamarkan berkas berbahaya melalui ekstensi yang tidak masuk dalam daftar blokir namun tetap dieksekusi oleh runtime environment lokal pengguna. Begitu berkas dijalankan, penyerang dapat membaca direktori lokal secara arbitrer, dengan target utama direktori tdata (Telegram Data). Menyalin berkas di dalam tdata setara dengan mengkloning sesi aktif pengguna secara penuh tanpa memicu verifikasi dua langkah (2FA).

---

Anatomi Eksploitasi: Mekanisme di Balik Layar

Kerentanan ini berakar pada interaksi antara antarmuka GUI Telegram Desktop (yang dibangun di atas framework Qt/C++) dengan subsistem eksekusi berkas host OS, khususnya Windows.

[Attacker Payload]
       │ (File Extension Bypassing Blocklist)
       ▼
[Telegram Desktop Client]
       │ (Mengecek MIME / Extension via Hardcoded Blocklist)
       │ Validation Pass (False Negative)
       ▼
[Qt Framework: QDesktopServices::openUrl / ShellExecuteW]
       │ (Handoff langsung ke OS Handler tanpa Parameter Sanitization)
       ▼
[Host OS Execution Environment]
       │ (Payload dijalankan di User Privilege yang sama)
       ▼
[Local File Read: %APPDATA%\Telegram Desktop\tdata]
       │ (Pencurian Auth Keys & Active Session Tokens)
       ▼
[Full Account Compromise (Bypass 2FA)]

1. Kegagalan Blocklist dan Validasi Ekstensi

Telegram Desktop memfilter lampiran menggunakan daftar ekstensi yang dianggap berbahaya (seperti .exe, .bat, atau .com). Jika ekstensi tidak terdaftar, klien mengizinkan pengguna untuk membukanya secara langsung. Penyerang memanfaatkan celah ini dengan menggunakan format berkas yang secara fungsional dapat mengeksekusi instruksi, misalnya skrip Python terkompilasi (.pyz) atau pintasan sistem yang terikat dengan interpreter bawaan yang sudah terpasang di mesin korban.

2. Eksekusi Tanpa Batas via OS Handler

Saat pengguna mengeklik berkas tersebut, Telegram memanggil abstraksi seperti QDesktopServices::openUrl atau API Win32 seperti ShellExecuteW. Pada titik ini, Telegram sepenuhnya mendelegasikan penanganan berkas ke OS shell. Klien tidak melakukan inspeksi konten berkas (magic bytes) secara mendalam dan tidak menjalankan proses tersebut di dalam lingkungan terbatas (sandbox).

3. Eksfiltrasi Direktori tdata

Setelah muatan berhasil dieksekusi di bawah konteks hak akses (user context) pengguna yang sama, muatan tidak memerlukan eskalasi hak istimewa (privilege escalation). Target paling berharga pada Telegram Desktop adalah direktori %APPDATA%\Telegram Desktop\tdata. Direktori ini menyimpan kunci enkripsi lokal, konfigurasi, dan auth key sesi aktif. Dengan membaca dan mengirimkan direktori ini ke server penyerang, akun pengguna berhasil diambil alih secara instan.

---

Trade-Off Arsitektur: Kinerja Native vs Keamanan Sandboxing

Kerentanan ini membuka diskusi teknis yang mendalam mengenai kompromi arsitektur yang diambil oleh tim pengembang Telegram Desktop.

| Aspek Arsitektur | Telegram Desktop (C++ / Qt) | Klien Modern Terisolasi (Electron / Chromium) | | :--- | :--- | :--- | | Konsumsi Sumber Daya | Sangat rendah; jejak memori minimal dan UI responsif. | Tinggi; memakan ratusan MB RAM untuk instance webview. | | Model Isolasi Proses | Monolitik; proses utama berbagi memori dan hak akses OS langsung. | Multi-proses; render engine dan handler terpisah dari proses sistem utama. | | Sandboxing Eksekusi | Nihil secara bawaan; bergantung pada izin akun pengguna OS. | Tersedia secara native; renderer dibatasi oleh sandbox Chromium. | | Penanganan Berkas Eksternal | Handoff langsung ke native OS file association. | Sering kali diarahkan ke dialog peringatan bertingkat atau diisolasi via AppContainer. |

Telegram Desktop memilih efisiensi C++ murni untuk memberikan performa tinggi dan integrasi native yang mulus. Konsekuensinya, mereka harus membangun lapisan pertahanan mereka sendiri. Berbeda dengan browser modern yang mengisolasi proses pembacaan berkas ke dalam sandbox berdaya rendah, Telegram berjalan sebagai satu proses terpadu. Keputusan arsitektur untuk mempertahankan kecepatan dan kemudahan UX (membuka berkas dalam satu klik) secara langsung mengorbankan batas keamanan sistem operasi (security boundaries).

---

Kegagalan Pola Desain Perangkat Lunak

Terdapat dua kesalahan desain sistem yang berulang dalam insiden ini:

  1. Anti-Pattern Berbasis Blocklist:

Mencoba mendata semua ekstensi berkas yang berbahaya di sistem operasi modern seperti Windows adalah tindakan yang sia-sia. Windows memiliki lusinan format file dan Living-off-the-Land Binaries/Scripts (LOLBins) yang dapat memicu eksekusi kode tanpa ekstensi .exe. Standar industri mewajibkan pendekatan allowlist atau setidaknya memaksa seluruh berkas non-media untuk diperlakukan sebagai biner berbahaya yang wajib melewati dialog konfirmasi eksplisit OS.

  1. Penyimpanan Sesi Tanpa Enkripsi Terikat Entitas Mesin:

Direktori tdata disimpan dengan proteksi yang relatif mudah dibaca oleh proses apa pun yang berjalan di bawah identitas pengguna yang sama. Telegram tidak memanfaatkan proteksi tingkat lanjut seperti Windows DPAPI (Data Protection API) yang dikombinasikan dengan validasi integritas proses atau AppContainer isolation. Akibatnya, akses baca berkas sederhana langsung berubah status menjadi full account takeover.

---

Takeaways untuk Software Engineers

  • Hentikan Penggunaan Blocklist Ekstensi Berkas:

Jangan pernah memvalidasi keamanan berkas hanya berdasarkan string ekstensi. Jika aplikasi Anda harus berinteraksi dengan berkas dari luar, gunakan validasi magic number biner, terapkan strict allowlist untuk berkas yang boleh langsung dibuka, dan paksa penyimpanan berkas ke disk daripada eksekusi langsung untuk format yang tidak dikenal.

  • Delegasi OS Handler adalah Batas Ancaman (Threat Boundary):

Memanggil fungsi sistem seperti ShellExecute atau pembungkus framework seperti QDesktopServices::openUrl adalah tindakan berisiko tinggi. Jangan menganggap input pengguna aman hanya karena telah melewati lapisan UI. Berikan argumen yang membatasi eksekusi dan nonaktifkan parameter otomatisasi.

  • Terapkan Defense-in-Depth pada Kredensial Sesi:

Token autentikasi, refresh tokens, dan berkas status sesi tidak boleh dibiarkan terbaca bebas di direktori aplikasi. Gunakan mekanisme secure credential store native (seperti Windows Credential Manager, macOS Keychain, atau libsecret di Linux) daripada menyimpan berkas mentah di dalam %APPDATA%.

  • Desain Ekspektasi Hak Akses Minimal (Least Privilege):

Jika aplikasi Anda tidak membutuhkan hak akses untuk membaca direktori lain di sistem operasi, rancang aplikasi agar berjalan di dalam sandbox native, misalnya Windows AppContainer atau macOS App Sandbox. Kecepatan eksekusi native tidak boleh menjadi alasan untuk mengabaikan isolasi proses.

Arsitektur & Alur Visual Sistem

Arsitektur dan Alur Sistem: Telegram Desktop vulnerability allowed any user's file to be stolen