
2026/10/10 12:02
Telegram Desktop の脆弱性により、任意のユーザーのファイルが盗まれることが可能だった
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Telegram Desktop 7.2.9 より前のバージョンには、CVE-2026-107181 という重大なセキュリティ脆弱性があり、攻撃者がユーザーアカウントを乗っ取れるようにしています。この深刻度の高い問題は、以下の 2 つの具体的な技術的失敗に起因します。正しくないテキストコマンドの処理(セミコロン注入)と、「interpret:」リンクスキームに対する権限チェックの欠如です(このリンクスキームはアプリに対して実行すべき動作を指定するウェブプロトコルです)。その結果、悪意のあるリンクがユーザーを欺き、SSH キーやパスワードストアなどの機密なローカルファイルを自動的に読み込んでしまうことを可能にします。この脆弱性は 2026 年 6 月に最初に報告されましたが、ローカルパスコードを必要とせず、完全なアカウント乗っ取りを行うことが可能です。影響を受ける Windows ユーザーは、直ちにバージョン 7.2.9 また以降へアップグレードし、これらのシリアライゼーションエラーを修正するとともに、危険なリンクスキームを無効化する必要があります。アップデートがインストールされるまで、「各ファイルをどこに保存するかを询问する」設定を有効にするのが、悪意のある指示をダウンロードすることに対する本質的な一時的防御策となります。Telegram を安全な通信手段として利用している組織は、クラウド上の認証情報やデバイス上に保管された秘密鍵の窃取を防ぐために、このパッチの適用を最優先で実施すべきです。
本文
Telegram Desktop 遠隔ファイル読み取りとアカウント乗っ取り脆弱性 (CVE-2026-107181) の解説
誰かがあなたの参加する Telegram グループに追加し、その中のリンクをクリックした際に、あなたのアカウントが乗っ取られるリスクが発生する可能性があります。本記事では、その仕組みと対策について解説します。
概要
Telegram Desktop は、ローカルソケットを通じて既に起動中の自身のインスタンスにテキストデータとしてリンクを渡しますが、コマンド区切り文字の処理に欠陥があります。この脆弱性を悪用すると、クリックされた単一リンクが「任意のローカルファイルの読み取り」という指示に変化し、最終的にログイン情報が格納されたファイルを窃取することができます。
攻撃チェーンの仕組み
- インジェクション: リンク内のセミコロン(
)をエスケープせずそのまま扱い、リンク中に複数のコマンドが混在する状況を意図的に作り込みます。;
URI スキーム: 注入されたコマンドのうち、内部 URI スキームinterpret:
を経由してファイルを読み取る機能があり、これが認証チェックなしで任意のファイルをチャットに送信できる脆弱性です。interpret:
これらの欠陥が組み合わさることで、被害者は何気なくリンクをクリックした際にアカウント乗っ取りに至ります。
影響範囲
- ソフトウェア: Telegram Desktop
- 脆弱バージョン: 7.2.8 未満(Windows 版 6.9.3 で確認済み)
- 修正バージョン: 7.2.9(コミット
)db3405699f - CVE-ID: CVE-2026-107181
- 重大度: High (8.1)
- CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N
被害内容
- 遠隔からの任意のローカルファイル読み取り
- 攻撃者によるチャットへのデータ持ち出し(エクスフィルトレーション)
- アカウント乗っ取り(セッション認証の取得)
1 つのリンク、2 つのプロセス
オペレーティングシステムは
tg://... 形式のリンクを検知すると、Telegram を起動します。
プロセスの動作パターン
- 新規起動の場合:
- 新しいプロセスが起動し、URL オブジェクトに変換して処理します。
- 通信は不要です。
- 既に動作中のインスタンスの場合:
- OS は「既に動いている」と判断せず、新たなプロセスを起動します。
- 最初のインスタンスが「サーバー側」でソケットをリスニングしており、新プロセス(クライアント)からリンクを受信して処理します。
シリアライゼーションと脆弱性の発生点
Telegram は独自のフォーマットを採用しています。通信は「バイト列」として行われ、オブジェクト形式ではないため**テキスト行として展開(シリアライズ)**されます。
- 新規プロセス側:
形式で URL を書き出します。OPEN:commands += u"OPEN:"_q + url.toString(QUrl::FullyEncoded) + ';'; - 既存インスタンス側: バイト列を読み取り、セミコロン (
) で分割して複数の指示に分けて処理します。;// セミコロンで分割し、各部分を独立した指示として扱う auto cmd = base::StringViewMid(cmds, from, to - from); if (cmd.startsWith(u"OPEN:"_q)) { ... }
問題:エスケープされていない区切り文字
リンクにセミコロンが含まれている場合(例:
tg://x?a=1;CMD:quit)、新規プロセス側には単一の文字列として届きますが、既存インスタンス側では 2 つの指示に分断されます。
OPEN:tg://x?a=1CMD:quit
これが**「インジェクション」**であり、攻撃チェーンの第 1 の欠陥です。
鍵となるスキーム:interpret:
interpret:通常、Telegram は特定のコマンドのみを受け付けます(
show, quit など)。問題なのは OPEN: コマンドが制限なく「任意の URL」を受け付ける ことです。
内部 URI スキームの存在
Telegram コード内には OS への登録がない独自のスキーム
interpret: が存在します。これは開発中のビルドアーカイブをアップロードするツールで使用されていました。
- 機能: テキストファイルを読み取り、チャットに送信する処理を行います。
- 脆弱性: この関数には認証チェックが施されていません。攻撃者がリンク経由で到達できれば、誰の確認もなくローカルファイルを強制的に読み込ませることができます。
// interpret: スキームの処理ロジック (認証チェックなし) QString InterpretSendPath(not_null<Window::SessionController*> window, const QString &path) { QFile f(path); if (!f.open(QIODevice::ReadOnly)) { ... } const auto content = QString::fromUtf8(f.readAll()); // 任意ファイル内容がここへ読み込まれる }
攻撃者はこの経路を使い、リンクを介して指示ファイルをディスク上から読み込ませます。 例:
tg://x?a=1;OPEN:interpret:instructions.txt
指示ファイルを配置する(エクスフィルトレーション)
攻撃者が被害者のディスク上に指示ファイルを置く方法には、以下の手順があります。
デフォルト動作の活用
Telegram のデフォルト設定では、グループで受信された最大 8 MiB のファイルは自動的にダウンロードされます(ブロードキャストチャンネルではオフ)。
- ファイルは標準フォルダに保存され、名前衝突時は
となります。instructions(2).txt - Windows:
C:\Users\<ユーザー名>\Downloads\Telegram Desktop\<ファイル名>
絶対パスではなく相対パスの解決
interpret: スキームは相対パスを受け付けます。これは Telegram の作業ディレクトリ(%APPDATA%\Telegram Desktop)から解決されます。
これにより、攻撃者は「ユーザー名」を特定する必要なく、決定論的なパスに到達できます。
interpret:../../../Downloads/Telegram%20Desktop/instructions.txt
指示ファイルの構造
窃取対象となるファイルを指定します(例:SSH キー、認証情報ファイルなど)。
file: でパスを指定し、channel: に攻撃者のチャンネルを設定します。
ファイル読み取りからアカウント乗っ取りへ
単なるファイル読み取りでは終わりません。Telegram はセッション認証とユーザーデータを保護するため、強力な暗号化を採用しています。
キーラップ(Key Wrapping)構造
- DEK (Data Encryption Key): ユーザーデータを暗号化する鍵(ランダム)。
- KEK (Key Encryption Key): DEK を暗号化するために使用される鍵。
- KEK はユーザーパスワードとソルトから導出されます。
- 重要: パスコードが設定されていない場合、ソルトのみで KEK が再計算可能です。
秘密ファイルを入手すれば乗っ取りが可能
以下のファイルに含まれる情報は復号化・利用可能です。
: ソルトと暗号化された DEK が明碼(または容易に復元可能)で格納されています。tdata/key_datas- パスコードなしの場合、このファイルを入手すれば KEK を再計算し、DEK を解凍できます。
: MTProto 認証データ(DEK で暗号化)。これがあればアカウントとしての権利が得られます。tdata/D877F783D5D3EF8Cs
: アカウント保存データのインデックス。tdata/D877F783D5D3EF8C/maps
攻撃者は指示ファイルでこれら 3 つのファイルをすべて指定し、読み取ることができます。これらを新しい環境に配置すれば、被害者のアカウントがそのまま動作する状態を再現可能です。
インジェクションによる多重化
1 つのリンクに対し、セミコロンを使って複数の
interpret: コマンドを送信することで、任意の数の秘密ファイルを取得できます。
tg://x?a=1 ;OPEN:interpret:instructions1.txt (tdata/key_datas) ;OPEN:interpret:instructions2.txt (認証ファイル) ;OPEN:interpret:instructions3.txt (インデックス)
リンクの配信方法
攻撃者は Telegram 外部からリンクを配布し、被害者がクリックした後にエクスフィルトレーションを行います。
- ハブページ: 通常の https リンク(例:
)を送信します。https://corvus.sec/rules - リダイレクト: ブラウザが追跡され、最終的に
形式の内部リンクにリダイレクトされます。tg://x?... - 処理: このリンクは OS に「Telegram を起動」または「既存インスタンスに通知」として処理され、脆弱性がトリガーされます。
概念実証(Proof of Concept)
攻撃者の手順概要:
- スーパーグループを作成し、被害者を招待します(承認不要な設定推奨)。
- 指示ファイル(
, 認証ファイル, インデックス)をグループにアップロードします。tdata/key_datas
を省略することでアカウントチェックをバイパス。from:
- チャット内に見せかけ無害な https リンクを共有します。
- 被害者がリンクをクリックすると、内部ソケット経由で指示ファイルの読み取りコマンドが実行され、3 つの秘密ファイルを攻撃者のグループにアップロードされます。
- 攻撃者はこれらのファイルを取得してアカウントにログインします(確認ダイアログなし)。
緩和策
1. アップデート(推奨)
- バージョン 7.2.9 以上へのアップデートを即座に行ってください。これが問題を完全に閉じる唯一の方法です。
2. 設定変更
- 「各ファイルの保存場所を確認する」という設定を有効にする。
- これにより自動ダウンロードが無効化され、指示ファイルがディスク上に到達しません(最も効果的な対策)。
3. 招待者制限
- グループへの招待者を**「自分の連絡先」だけに制限**する。
- チャンネルやスーパーグループへの送信をブロックし、攻撃者がファイルを届ける場所を奪う。
4. パスコードの設定
- ローカルパスワードコード(パスコード)を設定する。
- セッションファイルの復号化を防ぎ、盗まれたアカウントを利用不能化します。
修正詳細
コミット
(2026-09-16) で対応済み。db3405699f
- スキーム削除:
スキームと関連する処理関数を完全に削除。interpret:// - エスケープ実装: 単一インスタンスソケットの区切り文字(レコードセパレーター)に対して、パーセント符号付き 16 進数でエスケープ処理を実装。これによりリンク内のセミコロンが誤ってコマンド区切りに扱われないようにしました。
- 追加対策: 非ローカル URL の検知や不要なレコードスキップなどの補完的な防御策も実装されました。
タイムライン
| 日付 | イベント |
|---|---|
| 2026-06-25 | ZDI に脆弱性報告 |
| 2026-09-16 | ベンダーが独自に修正(コミット公開) |
| 2026-09-17 | Telegram Desktop v7.2.9 リリース |
| 2026-09-30 | ZDI がケースを閉じる |
| 2026-10-03 | この記事の公開 |
| 2026-10-07 | CVE-2026-107181 の割付 |
注: 修正は静かにリリースされました。変更ログにはセキュリティ対策の詳細な記述が含まれておらず、コミットタイトルは「古くなった interpret パスヘルパーの削除」という技術的な表現のみでした。
BeakSec チャンネルへのご案内 もしサイバーセキュリティに興味があれば、YouTube チャンネル「BeakSec」もご覧ください。