انتقال کد مخفی در تلگرام دسکتاپ به فایلهای HTML
تلگرام دسکتاپ در ویندوز، مکاواس (macOS) و لینوکس به کاربران اجازه میدهد یک چت یا تمام چتهای حساب خود را بهصورت فایل HTML ذخیره کنند؛ فایلهایی که میتوان آنها را با مرورگر وب باز و مشاهده کرد. باتها نیز میتوانند زیر پیامهای خود مجموعهای از گزینههای تعاملی قرار دهند که تلگرام آنها را «صفحهکلیدهای درونخطی» (Inline Keyboards) مینامد. متن هر گزینه نیز توسط خود بات تعیین میشود.
به گفته پژوهشگران، پیش از انتشار پچ، کد مربوط به ایجاد فایل HTML، متن گزینههای تعاملی را بدون انجام فرآیند ایمنسازی (Escaping) مستقیماً در کد HTML قرار میداد؛ در نتیجه، این متن میتوانست حاوی کد قابل اجرا باشد.
در فرآیند ایمنسازی کد، کاراکترهایی مانند < به شکلی تغییر میکنند که مرورگر آنها را به صورت متن عادی نمایش دهد و بهعنوان بخشی از کد اجرا نکند. این فرآیند برای متن پیامها، نام فرستندگان و سایر اطلاعات چت اعمال میشد، اما متن گزینههای تعاملی از این لایه ایمنسازی برخوردار نبود.
به این ترتیب، بات میتوانست یک تگ اسکریپت (Script Tag) را در متن یکی از گزینههای پیام قرار دهد و با استفاده از کاراکترهای نامرئی، محتوای آن را از دید کاربر پنهان کند.
انتقال کد مخفی به چتهای دیگر و استخراج اطلاعات
برای سوءاستفاده از این ضعف امنیتی، لازم نبود بات مستقیماً در چت موردنظر قرار گرفته باشد. پژوهشگران دریافتند اگر پیام بات فقط شامل گزینههای دارای لینک وب باشد، این گزینهها هنگام فوروارد (Forward) پیام همچنان باقی میمانند. بنابراین، هر یک از اعضای گروه میتوانست با فوروارد کردن پیام بات، کد مخفی آن را نیز وارد چت کند.
این پیام مانند سایر پیامها در تاریخچه چت باقی میماند و تا زمانی که حذف نشود، در آنجا قابل دسترسی است. بنابراین، حتی ماهها یا سالها بعد نیز ممکن بود هنگام ذخیره چت بهصورت فایل HTML، این پیام و کد مخفی آن همراه سایر پیامها وارد فایل شوند.
پژوهشگران این آسیبپذیری را در 3 ژوئن، تنها دو روز پس از شناسایی، به تلگرام گزارش کردند. آنها اعلام کردند که آزمایشها را فقط روی حسابهای شخصی خود و گروههای آزمایشی انجام دادهاند و در گزارش خود ادعایی درباره استفاده از این آسیبپذیری علیه کاربران واقعی مطرح نکردهاند.
به گفته پژوهشگران، با باز شدن فایل HTML حاوی پیام آلوده، اسکریپت بدون نیاز به کلیک یا اقدام دیگری از سوی کاربر اجرا میشد. این اسکریپت میتوانست تمام پیامهای موجود در فایل را بخواند و اطلاعاتی مانند نام فرستندگان، زمان ارسال پیامها، نام و نوع چت، تعداد اعضا و حتی مسیر فایل ذخیرهشده در سیستم را استخراج کند. سپس، اسکریپت میتوانست تمام این اطلاعات را به سرور تحت کنترل مهاجم ارسال کند.
بااینحال، اسکریپت فقط به محتوای همان فایل HTML دسترسی داشت. تلگرام دسکتاپ هنگام ذخیره چتهای طولانی بهصورت فایل HTML، پیامها را در فایلهایی با حداکثر 1000 پیام تقسیم میکند؛ بنابراین اسکریپت فقط میتوانست اطلاعات همان فایل را بخواند و به سایر بخشهای چت یا کل حساب کاربری دسترسی نداشت.
این اسکریپت علاوه بر خواندن اطلاعات، میتوانست محتوای فایل HTML را نیز تغییر دهد. در آزمایش پژوهشگران، اسکریپت تمام محتوای فایل HTML را با یک فرم جعلی «تأیید هویت تلگرام» جایگزین کرد.
همچنین پژوهشگران توضیح دادند که همین قابلیت میتوانست تاریخها، نام فرستندگان یا متن پیامها را در فایلهای ذخیرهشده تغییر دهد؛ برای مثال، فایلی که برای ثبت سوابق یا ارائه بهعنوان مدرک استفاده میشود. بااینحال، این تغییرات فقط محتوای نمایشدادهشده در فایل HTML را تحت تأثیر قرار میداد و نسخه اصلی چت در تلگرام یا فایل ذخیرهشده روی دیسک را تغییر نمیداد.
شرایط لازم برای اجرای کد مخفی
پژوهشگران امتیاز این آسیبپذیری را بر اساس معیار CVSS 3.1، معادل 8.2 از 10 ارزیابی کردند. بااینحال، تا 14 سپتامبر، نه تلگرام و نه پایگاه ملی آسیبپذیریهای آمریکا (NVD) امتیاز مستقلی برای این آسیبپذیری منتشر نکرده بودند.
امکان اجرای کد مخفی تنها با برقراری شرایط زیر امکان پذیر بود:
- فایل HTML با نسخهای از تلگرام دسکتاپ ایجاد شده باشد که پیش از انتشار پچ امنیتی موردنظر در دسترس بوده است.
- پیام حاوی کد مخفی در چتی قرار داشته باشد که کاربر آن را بهصورت فایل HTML ذخیره کرده است.
- فایل HTML با مرورگری باز شود که قابلیت اجرای جاوااسکریپت در آن فعال باشد.
پژوهشگران در این بررسی فقط قابلیت ذخیره چت بهصورت فایل HTML در تلگرام دسکتاپ را بررسی کردند و فرمت JSON و قابلیتهای ذخیره چت در سایر اپلیکیشنهای تلگرام را بررسی نکردند.
قرار گرفتن پیام بات در فایل HTML به روش ذخیره چت بستگی دارد. اگر کاربر یک چت مشخص را از منوی همان چت ذخیره کند، پیامهای تمام اعضای آن چت نیز در فایل HTML ذخیره میشوند.
اما اگر کاربر اطلاعات کل حساب را ذخیره کند، تلگرام بهصورت پیشفرض در گروهها و کانالها فقط پیامهای مالک حساب را در فایل قرار میدهد. در چتهای دونفره و گفتوگو با باتها، تمام پیامها در فایل ذخیره میشوند. این موضوع بر اساس کد مربوط به قابلیت ذخیره اطلاعات و مستندات رسمی تلگرام مشخص شده است.
انتشار پچ برای آسیبپذیری تلگرام دسکتاپ
تلگرام با انتشار پچی در کامیت 8457d13a که توسط جان پرستون (John Preston)، توسعهدهنده تلگرام دسکتاپ، ثبت شده بود، فرآیند ایمنسازی کد برای متن گزینههای تعاملی را به کد ایجاد فایل HTML اضافه کرد.
این پچ در 30 ژوئن ثبت شد و ابتدا در نسخه بتای 6.9.4 در 3 جولای و سپس در نسخه پایدار 7.0.1 در 14 جولای منتشر شد. این دو نسخه، نخستین نسخههای دارای پچ بودند که در مخزن گیتهاب منتشر شدند.
کد فاقد فرآیند ایمنسازی از نسخه پایدار 4.15.1 در مارس 2024 در اپلیکیشن وجود داشت و این آسیبپذیری حدود دو سال و چهار ماه در نسخههای پایدار باقی ماند.
- نسخههای آسیبپذیر: تلگرام دسکتاپ از نسخه 4.15.1، منتشرشده در مارس 2024، تا نسخه 6.9.3.
- نسخههای دارای پچ: نسخه بتای 6.9.4 از 3 جولای 2026 و نسخه پایدار 7.0.1 از 14 جولای 2026 و نسخههای بعدی.
به گفته پژوهشگران، کاربران برای کاهش ریسک ناشی از این ضعف امنیتی باید اقدامات زیر را انجام دهند:
- تلگرام دسکتاپ را به نسخه 7.0.1 یا جدیدتر بهروزرسانی کنند. در کانال بتا (Beta Channel) نیز استفاده از نسخه 6.9.4 یا جدیدتر توصیه میشود.
- پس از بهروزرسانی، چتهایی را که پیش از انتشار پچ بهصورت فایل HTML ذخیره شدهاند، دوباره ذخیره کنند. در صورتی که به فایلهای قدیمی نیاز دارند، این فایلها را فقط در مرورگری باز کنند که اجرای جاوااسکریپت در آن غیرفعال باشد.
- تمام فایلهای HTML که پیش از انتشار پچ ذخیره شدهاند، باید غیرقابلاعتماد در نظر گرفته شوند؛ بهویژه فایلهایی که از گروههای بزرگ ذخیره شدهاند و بررسی منشأ هر پیام در آنها دشوار است.
تا پیش از بهروزرسانی اپلیکیشن، نیازی به ذخیره چتهای جدید بهصورت فایل HTML نیست؛ زیرا این آسیبپذیری فقط فایلهایی را تحت تأثیر قرار میدهد که با نسخه قدیمی کد ایجاد شدهاند.
عدم وجود اطلاعیه امنیتی و شناسه CVE
یادداشتهای انتشار نسخههای 6.9.4 و 7.0.1، فایل تغییرات (Changelog) و اطلاعیه 14 جولای تلگرام، اشارهای به رفع این آسیبپذیری ندارند. همچنین، مخزن تلگرام دسکتاپ در گیتهاب هیچ اطلاعیه امنیتی (Security Advisory) مرتبطی منتشر نکرده است و این آسیبپذیری شناسه CVE نیز ندارد.
به گفته پژوهشگران، تلگرام در اول جولای این آسیبپذیری را تأیید کرد و در قالب برنامه باگ بانتی (Bug Bounty) خود، مبلغ 500 دلار بهعنوان پاداش برای گزارش آن پیشنهاد داد؛ اما پژوهشگران این مبلغ را نپذیرفتند و خواستار اهدای آن به خیریه شدند. تلگرام نیز انتشار عمومی جزئیات این آسیبپذیری را حتی پس از رفع آن مناسب ندانست و احتمال سوءاستفاده مهاجمان از اطلاعات منتشرشده را دلیل این موضع اعلام کرد.
به گفته پژوهشگران، برای این گزارش هیچ توافقنامه عدم افشا (NDA) وجود نداشت. آنها نیز پس از انتشار پچ، جزئیات آسیبپذیری را در 12 سپتامبر منتشر کردند. طبق قوانین برنامه باگ بانتی تلگرام، اگر جزئیات یک آسیبپذیری پیش از رفع آن بهصورت عمومی یا برای اشخاص ثالث منتشر شود، این گزارش مشمول دریافت پاداش نخواهد بود. بااینحال، در این قوانین درباره انتشار عمومی جزئیات پس از رفع آسیبپذیری توضیحی ارائه نشده است.















