本文へ移動

Telegram Desktop 7.2.8以前は細工したリンクでファイル流出、7.2.9で修正

Telegram Desktop の脆弱性を Windows で実証した報告を読む。命令ファイルの配置と外部ブラウザからの起動が攻撃の条件で、ローカルパスコードではファイル流出を防げない。修正版は7.2.9だ。

7.2.9 更新すべき最低バージョン 対象は 7.2.8 以前、修正は 7.2.9(コミット db3405699f)。CVE-2026-107181、CVSS 8.1 High。報告はWindows版で実証。

Telegram Desktop の 7.2.8 以前に、細工した外部リンクを起点に、条件がそろうと端末上の任意のファイルが読み取られ、攻撃者の管理するチャットへ送り出される欠陥がある。識別子は CVE-2026-107181、深刻度は CVSS 8.1(High)。修正は 7.2.9(コミット db3405699f)に入っている。報告は Windows 版(6.9.3)で確認されたとしている。業務端末で Telegram Desktop を使っているなら、今日やることはバージョンの確認と 7.2.9 以上への更新だ。

攻撃には、起動済みのTelegram本体へのIPCと、端末上の命令ファイルが必要だ。原報告の「Delivering the link」節では、外部ブラウザで開いたHTTPSリンクから細工したtgリンクへ移る経路を示す。チャット内でtgリンクを直接開く場合はIPCを通らず、この攻撃の入口にならない。ブラウザや利用履歴によってはTelegramを起動する確認が出るため、どの環境でもクリックだけで完了するわけではない。

クリックされたリンクが複数の命令に割れる

Telegram が既に起動している状態で tg:// リンクを開くと、OS は新しいプロセスを立ち上げ、そのプロセスがローカルソケット経由で起動済みの本体にリンクを渡して終了する。ソケットはバイト列しか運べないので、URL はいったんテキストに直列化される。Telegram の形式は単純で、命令語・引数・それを閉じるセミコロンの並びだ。開くべきリンクは OPEN:tg://x?a=1; という一行になる。

問題は、区切りに使うセミコロンが引数の中で現れてもエスケープされない点にある。受信側はセミコロンごとに切って、それぞれを独立した命令として扱う。

# 送られたリンク
tg://x?a=1;CMD:quit

# ソケットに書かれる一行
OPEN:tg://x?a=1;CMD:quit;

# 受信側が切り出す二つの命令
OPEN:tg://x?a=1
CMD:quit

これが一つめの不具合、IPC インジェクションだ。受け付ける命令は4つで、CMD は show と quit しか取らないため単体では害が小さい。効くのは URL のスキームを制限しない OPEN のほうだ。

interpret スキームが確認なしでファイルを送る

コードを追うと、OS には登録されず Telegram の内部だけで解釈される interpret: というスキームがある。OPEN: は任意の URL を受けるので、次の形で到達できる。

tg://x?a=1;OPEN:interpret:instructions.txt

interpret は元々リリース公開の道具で、送信先チャンネル・送るファイル・キャプションを書いた命令ファイルを読み、その中身を送る。命令ファイルの from: は現在ログイン中のアカウント id と照合されるが、その行が無ければ照合そのものが走らない。送信を担う InterpretSendPath は呼び出し元を確認せず、確認ダイアログも出さずにファイルを読んで送る。コマンドラインからしか届かないうちは、既に端末へ侵入している攻撃者にしか使えないので問題にならなかった。ソケットから、つまりインジェクション経由で到達できるようになった時点で、クリック一つで呼べる危険な関数に変わる。これが二つめの不具合、認可の欠落だ。

命令ファイルの配置からアカウント奪取まで

原報告がWindowsで示した配置経路では、Telegram Desktopの既定設定が使われる。グループに届いた 8MiB までのファイルを自動ダウンロードする(ブロードキャストチャンネルでは自動ダウンロードは切れている)。ファイルは Downloads\Telegram Desktop\<名前> に、送信者が付けた名前のまま落ちる。interpret は相対パスも受け付け、基準は Telegram のデータフォルダ(Windows では %APPDATA%\Telegram Desktop)なので、interpret:../../../Downloads/Telegram%20Desktop/instructions.txt と書けばユーザー名を知らなくても確定したパスを指せる。

一回の呼び出しで送れるファイルは1つだが、命令ファイルは何通でも投げられ、インジェクションはセミコロンの数だけ命令を積める。読み取りの primitive は一貫して「任意ファイル読み取り」で、変わるのは何を読むかだ — SSH 秘密鍵、ブラウザのパスワードストア、クラウドの資格情報、API トークンを含む設定。

Telegram のローカルデータは暗号化されているが、報告はそれでも奪取に至る道筋を示す。既定ではローカルパスコードが設定されず、鍵導出に渡すパスワードは空になる。DEK を包む KEK は空文字列とソルトから導かれ、そのソルトは暗号化済みの DEK と同じ tdata/key_datas に平文で入っている。key_datasから復元できるのは暗号鍵であり、セッション認証そのものではない。別途、認証情報などを含むセッション関連ファイルも取得されると、その鍵で復号してアカウントになりすまされるおそれがある。

確認すること

対象は 7.2.8 以前、修正は 7.2.9 だ。ヘルプのバージョン表示が 7.2.9 以上かを確かめ、満たないなら更新する。報告が実機で確認したのは Windows 版(6.9.3)だが、CVE の対象はクライアント全体として記されている。

ローカルパスコードを設定すれば鍵導出のパスワードは空ではなくなる。原報告は、復号を難しくするには十分な強度のパスコードを選ぶ必要があるとしている。ただし任意ファイル読み取りそのものは残るので、SSH 鍵や資格情報の流出までは防げない。根本を断つのは 7.2.9 への更新だ。

出典 種別について