Telegram Desktop ワンクリック乗っ取りの脆弱性:IPC信頼混同が突破した暗号化防壁

Telegram Desktop ワンクリック乗っ取りの脆弱性:IPC信頼混同が突破した暗号化防壁

セキュリティ脆弱性分析クライアントセキュリティ

データソース:beaksec.github.io

Telegramのローカルデータ暗号化アーキテクチャ自体は堅牢に設計されています。ユーザーのセッションデータは専用のデータ暗号化キー(DEK)によって保護され、そのDEKはパスコードから導出されたキー暗号化キー(KEK)によってさらに保護されています。しかしWindowsデスクトップ環境において、細工された悪意あるリンク1本がこの強固な暗号化の防壁を無力化することが明らかになりました。セキュリティリサーチャーのbeaksecは、Telegram Desktopにおけるワンクリックアカウント乗っ取りの脆弱性 CVE-2026-107181 を公開しました。攻撃者が被害者を誘導して細工されたリンクをクリックさせるだけで、被害者のコアセッションファイルが指定のグループへ密かにアップロードされ、アカウントが完全に奪取されます。

CNAであるVulnCheckは、この脆弱性に対してCVSS 4.0スコアで8.6(基本CVSS 3.1では8.1)を付与しました。スコアの差異は、わずかなユーザー操作から引き起こされるシステムレベルへの波及影響を新基準が重く評価していることに起因します。この攻撃チェーンが成立した根本原因は、Telegram Desktopが内部の信頼できる呼び出しと外部の信頼できない入力を、検証機構のない単一の通信パイプラインへ合流させていた点にあります。上流で入力の無害化を怠れば、内部にいかに強固な暗号化の要塞を築いていようと境界の破綻を防ぐことはできません。

エスケープ漏れの区切り文字が内部特権バックドアを露呈

攻撃チェーンの最初の関門は、ローカルの単一インスタンスソケットにおけるレコード区切り文字の不適切な処理(CWE-143)です。すでにTelegram Desktopが実行されている状態で外部リンクがクリックされると、OSはリンクを新しいプロセスに渡します。新プロセスはローカルソケットを通じて、開くべきURIを OPEN:<url>; というフォーマットで稼働中のメインインスタンスへ伝達し、受信側はセミコロンで区切って個別のコマンドとして解釈します。ここでの設計上の不備は、入力URLに含まれるセミコロンがエスケープされていなかった点にあります。sandbox.cpp:295-297 の組み立て処理および sandbox.cpp:453-463 の分割処理のいずれにおいても特殊文字の制限が行われていませんでした。これにより、セミコロンを含む悪意あるリンク tg://x?a=1;CMD:quit を渡すと2つのコマンドに分割され、外部の非信頼入力が内部の制御フローへと容易に逸脱します。

図:細工されたリンクのクリックから被害者のセッションファイル流出に至る攻撃チェーン。出典:beaksec.github.io 図:細工されたリンクのクリックから被害者のセッションファイル流出に至る攻撃チェーン。出典:beaksec.github.io

逸脱したコマンドは、攻撃チェーンの第2段階である内部URIスキーム interpret: を乗っ取ります。application.cpp:1162-1164 の実装に基づき、クライアントは指定されたパスを実行キューに追加します。続いて InterpretSendPath 関数(support_helper.cpp:673-680 に実装)が指示ファイルで指定されたローカルファイルを読み込み、特定のチャンネルやスーパーグループへと送信します。この処理では認可チェックも確認ダイアログの表示も一切行われません。このプロトコルは本来、公式アップデートの配布ツールチェーン(build/updates.py)用に用意されたものでした。指示ファイルには現在ログインしているアカウントを照合するための from: フィールドが含まれる仕様でしたが、この行が存在しない場合はチェック処理そのものがスキップされていました。プロトコルの無防備な解析設計により、外部の攻撃者に対して内部の特権実行権限が事実上そのまま引き渡されていました。

自動ダウンロード機能が組み上げる決定論的エクスプロイト

脆弱性自体は単なる実行の足がかりに過ぎず、これを確実なアカウント乗っ取りへと昇華させるには綿密な状態遷移の構築が必要でした。攻撃者はまずスーパーグループを作成し、Telegramのデフォルト設定(誰でも事前の承認なしに対象をグループに追加可能)を悪用して被害者を強制的に追加します。次に、被害者の機密ローカルファイルを指す interpret: 読み込み指示を含んだ3つのプレーンテキスト指示ファイルをグループ内に投稿します。Telegramには8 MiB未満の添付ファイルを自動的にダウンロードする機能が備わっているため、これら3つのファイルは確認なしで C:\Users\<user>\Downloads\Telegram Desktop\ 配下に静かに保存されます。

interpret: プロトコルは相対パスを受け付け、その基準パスはWindows上のTelegram作業ディレクトリである %APPDATA%\Telegram Desktop となっています。攻撃者は ../../../Downloads/Telegram%20Desktop/instructions.txt を指定することで、Windowsのユーザー名を知ることなく自動保存されたペイロードファイルを正確に狙い撃ちできます。その後、攻撃者はグループ内にHTTPリンクを送信し、細工した tg:// リンクへと302リダイレクトさせます。被害者がリンクをクリックした瞬間にインジェクションが発動します。

3つの指示ファイルは、セッション乗っ取りに必要なコアデータを読み込んで外部送信します。具体的には、未暗号化のsaltを格納した tdata/key_datas、デフォルトデータ名から派生したディレクトリ配下の D877F783D5D3EF8Cs、そして対応するインデックスファイル maps です。ディレクトリ名 D877F783D5D3EF8C はランダムな値ではなく、デフォルト名 data から決定論的に算出される固定文字列であり、storage_file_utilities.cpp:241-250 に明確に記述されている通り、どの標準インストールでも同一になります。ローカルパスコードが設定されていない初期状態では、パスコードは空文字列として扱われます。攻撃者は流出した key_datas 内のsaltを用いて公開アルゴリズムからKEKを再計算し、DEKを復号することで、ローカル上で被害者のMTProtoセッションを完全に再構築できます。自動ダウンロード、相対パスのサポート、デフォルトでのパスコード未設定は、単体では利便性のための仕様ですが、同一の実行コンテキストで交差した結果、極めて危険な攻撃連鎖を生み出しました。

通信境界を再構築する4つのソースコード修正

この攻撃チェーンに対し、Telegramは旧来の危険なロジックを完全に排除する対応を取りました。2026年9月16日のコミット db3405699f において、開発チームは4つの改修を実施しました。第1に、interpret:// スキームおよび対応する送信ヘルパー関数 Support::InterpretSendPath をコードベースから完全に削除しました。第2に、ソケット通信のレコード区切り文字に対してパーセントエンコード(16進エスケープ)を導入し、複数コマンドの挿入を遮断しました。さらに2つの堅牢化アサーションを追加し、同一接続内で OPEN: が存在する場合は CMD: および CTRL: レコードを無視すること、そして非ローカルURLの検出後は後続のローカルパス要求を破棄することを徹底しました。

翌日リリースされたバージョン 7.2.9 にはこれらすべての修正が含まれていました。しかし同バージョンの変更履歴にはレンダリング問題の修正としか記されておらず、セキュリティアドバイザリや脆弱性の影響に関する説明は一切ありませんでした。経緯を振り返ると、2026年6月25日にZDIへ報告され、9月16日にベンダーが独自修正を実施、9月30日にZDIが対応完了としてクローズし、10月3日にリサーチャーのbeaksecが独自に解析を公表、10月7日にようやくCVEが正式採番されました。このようなセキュリティ勧告を伴わないサイレントパッチ運用は、企業組織がクライアントのリスクを評価する情報流通を妨げます。現在、CISAのSSVC判定では悪用ステータスが「poc」とされ、KEV(悪用が確認された脆弱性カタログ)には登録されていません。

アップデートなしでも攻撃を遮断できる3つの防衛線

今回の検証はWindows版バージョン 6.9.3 上で実施されましたが、直ちにバージョン 7.2.9 以降へアップデートできない環境であっても、クライアントの既存設定を変更することで攻撃経路を効果的に遮断できます。「高度な設定」で「ファイルの保存先を毎回確認する」を有効にすると、固定パスに依存する攻撃の前提が崩れ、悪意あるペイロードが所定のディレクトリへ自動保存されなくなります。また、「自分をグループに追加できるユーザー」を「連絡先のみ」に制限することで、攻撃者が被害者をグループに強制追加して悪意あるファイルを送りつける経路を封じることができます。さらに、ブラウザから表示される「Telegramを開く」というプロンプトを安易に許可せず、不審なログインがないかアクティブセッション一覧を定期的に点検することも有効です。

そして最も重要かつ根本的な防衛手段は、Telegramにローカルパスコードを設定することです。本脆弱性の悪用はローカルパスコードが未設定(空文字列)であることを前提としており、盗み出したsaltと既定値の組み合わせで容易に復号されてしまいます。ローカルパスコードを設定すると、正規のKEKを導出するために平文パスワードの入力が必須となります。万が一 key_datas を含むファイル群が窃取されたとしても、パスワードがなければ攻撃者は実データを読み取ることができません。ビジネスロジックの信頼境界が破綻した場合、妥協のないセキュリティ設定こそがアカウント乗っ取りを防ぐ最後の盾となります。

参照リンク:

  • Telegram Desktop ワンクリックアカウント乗っ取り脆弱性分析(beaksec)
  • VulnCheck 脆弱性評価概要