Lỗ hổng Telegram Desktop cho phép JavaScript ẩn đánh cắp tin nhắn từ bản xuất HTML

Một lỗ hổng trong Telegram Desktop cho phép tin nhắn của bot chèn mã JavaScript ẩn vào các cuộc trò chuyện mà người dùng xuất ra tệp HTML. Mã độc này có thể chạy khi tệp được mở trong trình duyệt, cho phép kẻ tấn công sao chép tin nhắn hoặc thay đổi nội dung hiển thị của trang xuất dữ liệu.
Telegram Desktop Security Flaw

Một lỗ hổng trong Telegram Desktop cho phép tin nhắn của bot chèn mã JavaScript ẩn vào bên trong các cuộc trò chuyện mà người dùng xuất ra tệp HTML, các nhà nghiên cứu bảo mật tại ExPatch cho biết trong một bài phân tích được công bố vào ngày 12 tháng 9.

Trên Telegram, tin nhắn này trông rất bình thường với một nút liên kết, và mã script chỉ chạy khi có người mở tệp xuất (export) trong trình duyệt web. Sau đó, nó có thể sao chép mọi tin nhắn trong tệp đó sang máy chủ do kẻ tấn công kiểm soát hoặc thay đổi nội dung hiển thị trên trang.

Telegram đã phát hành bản vá vào tháng 7, nhưng bản cập nhật ứng dụng không cập nhật các tệp đã được xuất bằng các phiên bản trước đó, vì vậy các bản xuất HTML cũ vẫn có thể chứa mã script độc hại.

Telegram Desktop, ứng dụng của Telegram dành cho Windows, macOS và Linux, có thể lưu một cuộc trò chuyện đơn lẻ hoặc tất cả các cuộc trò chuyện từ một tài khoản dưới dạng các trang HTML để mở trong trình duyệt. Bot có thể đính kèm các hàng nút bên dưới tin nhắn của chúng, mà Telegram gọi là Inline keyboards, và bot có quyền chọn văn bản hiển thị trên mỗi nút.

Cho đến khi có bản vá, mã xuất dữ liệu đã ghi văn bản của nút đó trực tiếp vào trang HTML mà không thực hiện Escaping, hai nhà nghiên cứu Denis Rostilov và Aleksander Rostilov đã phát hiện ra điều này.

Escaping giúp chuyển đổi các ký tự như < để trình duyệt hiển thị chúng dưới dạng văn bản thay vì xử lý chúng như mã code. Quy trình xuất dữ liệu vốn đã áp dụng nó cho văn bản tin nhắn, tên người gửi và các trường khác.

Do đó, một bot có thể đặt một thẻ script vào văn bản của nút, được đệm bằng các ký tự ẩn để nút đó trông như trống rỗng trên phiên bản Telegram Desktop mà họ đã thử nghiệm.

Bot không cần phải có mặt trong cuộc trò chuyện mà nó nhắm mục tiêu. Một tin nhắn mà các nút duy nhất là các liên kết web sẽ giữ nguyên các nút đó khi được chuyển tiếp (forward), vì vậy bất kỳ thành viên nào chuyển tiếp tin nhắn của bot vào một nhóm đều mang theo mã script đó, các nhà nghiên cứu tìm thấy. Tin nhắn sau đó nằm trong lịch sử trò chuyện giống như bất kỳ tin nhắn nào khác cho đến khi bị xóa, và có thể được xuất ra nhiều tháng hoặc nhiều năm sau đó.

Họ đã báo cáo lỗ hổng cho Telegram vào ngày 3 tháng 6, hai ngày sau khi phát hiện ra, và cho biết họ chỉ thử nghiệm nó trên tài khoản và các nhóm thử nghiệm của riêng mình. Bài viết của họ không khẳng định rằng có bất kỳ ai đã sử dụng lỗ hổng này chống lại người dùng thực tế.

Khi một tệp xuất chứa tin nhắn này được mở, mã script sẽ chạy mà không cần thêm bất kỳ cú nhấp chuột nào. Nó có thể đọc mọi tin nhắn trong tệp đó, bao gồm tên người gửi và dấu thời gian, tên cuộc trò chuyện, loại và số lượng thành viên, cũng như đường dẫn tệp cục bộ, và gửi tất cả chúng đến máy chủ của kẻ tấn công.

Mã xuất của Telegram Desktop chia các bản xuất dài thành các tệp 1.000 tin nhắn mỗi tệp, vì vậy một tệp chỉ làm lộ tối đa nội dung của chính nó, không phải toàn bộ cuộc trò chuyện hoặc tài khoản Telegram.

Mã script cũng có thể ghi đè lại trang web. Trong bản demo của các nhà nghiên cứu, nó đã thay thế toàn bộ bản xuất bằng một biểu mẫu "xác minh" Telegram giả mạo.

Quyền kiểm soát tương tự có thể thay đổi ngày tháng, người gửi hoặc văn bản tin nhắn trong một tệp đang được sử dụng làm hồ sơ lưu trữ. Tuy nhiên, nó không thay đổi bản sao cuộc trò chuyện của chính Telegram hoặc tệp xuất được lưu trên đĩa.

Các nhà nghiên cứu đánh giá lỗ hổng này ở mức 8.2 trên 10 theo thang điểm CVSS 3.1, và tính đến ngày 14 tháng 9, chưa có điểm số nào từ Telegram hoặc từ Cơ sở dữ liệu Lỗ hổng Quốc gia Hoa Kỳ (NVD).

Ba điều kiện phải xảy ra để mã script chạy: bản xuất HTML được thực hiện bằng phiên bản Telegram Desktop trước bản vá, tin nhắn mang mã script nằm trong cuộc trò chuyện được xuất, và tệp được mở trong trình duyệt có bật JavaScript.

Các nhà nghiên cứu chỉ kiểm tra tính năng xuất HTML của Telegram Desktop và không đề cập đến định dạng xuất JSON hoặc các tính năng xuất của các ứng dụng Telegram khác.

Việc một tin nhắn bot được chuyển tiếp có nằm trong bản xuất hay không tùy thuộc vào cách thực hiện việc xuất dữ liệu. Xuất một cuộc trò chuyện đơn lẻ từ menu của nó sẽ bao gồm tin nhắn của mọi thành viên. Việc xuất toàn bộ tài khoản, theo mặc định, chỉ bao gồm các tin nhắn của chính chủ tài khoản trong các nhóm và kênh, nhưng bao gồm tất cả các tin nhắn trong các cuộc trò chuyện 1-1 và trò chuyện với bot, theo mã xuất và tài liệu của Telegram.

Bản vá (Commit 8457d13a) bởi nhà phát triển Telegram Desktop John Preston, đã bổ sung phần Escaping còn thiếu. Nó được viết vào ngày 30 tháng 6 và được đưa vào bản beta 6.9.4 vào ngày 3 tháng 7 và bản phát hành ổn định 7.0.1 vào ngày 14 tháng 7. Dòng mã chưa được Escaping đã tồn tại trong các bản phát hành ổn định kể từ phiên bản 4.15.1 vào tháng 3 năm 2024, khoảng hai năm bốn tháng.

  • Phiên bản bị ảnh hưởng: Telegram Desktop 4.15.1 (Tháng 3, 2024) đến 6.9.3
  • Đã khắc phục: 6.9.4 beta (3/7/2026), 7.0.1 (14/7/2026) và các bản sau đó

Các nhà nghiên cứu khuyên người dùng nên:

  • Cập nhật Telegram Desktop lên phiên bản 7.0.1 trở lên, hoặc 6.9.4 trở lên trên kênh beta.
  • Sau khi cập nhật, hãy xuất lại bất kỳ cuộc trò chuyện nào đã được xuất sang HTML trước khi có bản vá, hoặc chỉ mở các tệp cũ khi đã tắt JavaScript.
  • Coi bất kỳ bản xuất HTML nào được thực hiện trước bản vá là không đáng tin cậy, đặc biệt là bản xuất từ một nhóm lớn nơi nguồn gốc của mỗi tin nhắn khó kiểm tra.

Cho đến khi ứng dụng được cập nhật, không có lý do gì để tạo các bản xuất HTML mới, vì chỉ các bản xuất do mã cũ tạo ra mới mang lỗ hổng này.

Tính đến ngày 14 tháng 9, Telegram vẫn chưa công bố hướng dẫn nào cho người dùng đang giữ các bản xuất cũ.

Không có khuyến cáo, không có mã CVE

Ghi chú phát hành cho phiên bản 6.9.4 và 7.0.1, nhật ký thay đổi (Changelog) của ứng dụng và thông báo cập nhật ngày 14 tháng 7 của Telegram đều không đề cập đến bản vá này, và kho lưu trữ Telegram Desktop trên GitHub cũng không liệt kê bất kỳ khuyến cáo bảo mật nào.

Cũng không có mã định danh CVE cho lỗ hổng này. Các nhà nghiên cứu lưu ý rằng tính đến ngày 11 tháng 9, một cuộc tìm kiếm trong các cơ sở dữ liệu lỗ hổng công cộng của The Hacker News vào ngày 14 tháng 9 cũng không tìm thấy kết quả nào.

Các nhà nghiên cứu cho biết Telegram đã xác nhận lỗ hổng vào ngày 1 tháng 7 và đề nghị một khoản tiền thưởng lỗi (Bug Bounty) trị giá 500 USD, nhưng họ đã từ chối và yêu cầu quyên góp số tiền đó cho tổ chức từ thiện. Họ cũng đã yêu cầu một ngày công bố phối hợp và đề nghị giữ im lặng cho đến khi bản vá được phát hành.

"Chúng tôi cũng đã xem xét khả năng tiết lộ công khai, nhưng chúng tôi không thể chấp thuận vì việc tiết lộ ngay cả các vấn đề đã được giải quyết cũng có thể khiến nhiều người dùng Telegram gặp rủi ro hơn trong tương lai. Ví dụ, nếu thông tin về một lỗ hổng được công khai, các tác nhân độc hại có thể cố gắng khai thác nó, từ đó gây thiệt hại tài chính cho người dùng Telegram," Telegram Support viết trong một email ngày 1 tháng 7 mà các nhà nghiên cứu đã công bố dưới dạng ảnh chụp màn hình.

Các nhà nghiên cứu hiểu đó là sự từ chối cho phép công bố ngay cả sau khi đã có bản vá. Họ cho biết không có thỏa thuận không tiết lộ (NDA) nào bao gồm báo cáo của họ, và họ đã công bố thông tin vào ngày 12 tháng 9, sau khi bản vá đã được phát hành.

Các quy tắc Bug Bounty đã công bố của Telegram cho biết các lỗ hổng "được tiết lộ cho công chúng hoặc cho bên thứ ba trước khi chúng được giải quyết" sẽ không đủ điều kiện nhận thưởng. Trang web này không đề cập gì đến việc công bố sau khi đã có bản vá.