当社のAIエンジンNeutronが、UCバークレーのCyberGymベンチマークで97.1%のスコアを記録しました。 詳細を見る

ディープダイブ

ディープダイブ

Telegram for Androidの音声通話RCE、12.10.4で修正

Telegram for Android 8.6.2~12.10.3では、被害者が音声通話に応答すると発信者がコードを実行できました。既知の悪用なし。12.10.4で修正済み。

要点

  • Telegram for Androidの欠陥により、攻撃者は被害者が応答した時点で音声通話経由で被害者の電話上でコードを実行できました。セキュリティ企業NebuSecが2026年10月29日に開示したものです。攻撃者に必要なのは通常のTelegramアカウントだけで、NebuSecはARM64端末での実行を確認しています。2026年10月29日時点でCVE識別子もCVSSスコアも存在しません。
  • 2022年3月リリースの8.6.2から、2026年9月リリースの12.10.3までの全バージョンが、NebuSecによれば影響を受けます。Telegram for iOSは5月の12.7で、Telegram Desktopは7月の7.0.1でこの修正を取り込み、Androidが最後に受け取るプラットフォームになりました。
  • 実際の攻撃での悪用は知られていません。The Hacker NewsがNebuSecとTelegramに欠陥が使われたかどうかを問い合わせましたが、10月29日時点でどちらも公には回答していませんでした。技術解説や概念検証コードもこの時点で公開されておらず、デモンストレーションはNebuSecの動画です。
  • Telegram for Androidを今すぐ12.10.4以降に更新してください。バージョン番号はアプリの設定ページの下部に表示されます。

影響を受けるか

Telegram for Androidを8.6.2から12.10.3までのいずれかで使っている場合に影響を受けます。これらのバージョンは2022年3月から2026年9月の間にリリースされたため、2026年9月末以降更新していないインストールはすべて該当します。

スマートフォンでバージョンを確認してください。Telegramを開き、設定を開き、ページの下部に表示されるバージョン番号を読みます。古いバージョンの端末では、Google PlayのTelegram掲載ページに「更新」ボタンが表示されます。

欠陥は通話中の2つのアプリが交換するコード内にあるため、危険にさらされるには被害者が応答する音声通話が必要です。

Telegram for iOSとTelegram Desktopは、Androidより先にライブラリの修正を出荷しました(iOSは2026年5月の12.7、Desktopは2026年7月の7.0.1)。NebuSecは、この欠陥がそれらやグループ通話に影響する証拠を持っていません(よくある質問を参照)。

修正方法

Google Play経由でTelegram for Androidを更新してください。

  1. バージョン12.10.4以降をインストールします。
  2. 設定を開き、ページ下部のバージョン番号を確認します。

2026年10月29日時点で、Telegramはアドバイザリも回避策も公表しておらず、更新以外の設定でこの欠陥を取り除くものはありません。

欠陥の発火には被害者の応答が必要なため、知らないアカウントからの通話を断ればトリガーを避けられます。ただし欠陥を直すものではなく、ベンダーの指針でもありません。

端末フリートでは、MDMツールのアプリレポートで、Google PlayにおけるTelegram for Androidのパッケージ名である org.telegram.messenger のインストール済みバージョンを確認してください。

根本原因

MediaState通話メッセージを解析するコードは1つのフィールドを検証した後、別の省略可能なフィールドのイテレーターを読んでおり、2番目のフィールドを省いたメッセージは、マップの終端イテレーターを逆参照させて、触れてはならないメモリにアクセスさせていました。

Telegramの通話中、2つのアプリは通話の確立と状態報告のため、短いメッセージを交換し合います。その1つMediaStateは、マイクがミュートか、カメラが有効か、映像がどう回転しているかを伝えます。

解析コードは、TelegramのAndroid、iOS、デスクトップの各アプリが通話に使うライブラリtgcallsの同梱コピー、TMessagesProj/jni/voip/tgcalls/v2/Signaling.cpp にあります。このコードはjson11を使い、json11の Json::object は std::map<std::string, Json> であり、object.find() はフィールドがないときマップの end() イテレーターを返します。

パーサーは正しく始まります。省略可能な videoState フィールドを探し、フィールドがなければデフォルトの分岐に入り、videoState イテレーターは end() を指したままになります。

const auto videoState = object.find("videoState");
if (videoState != object.end()) {
    ...
} else {
    message.videoState = MediaStateMessage::VideoState::Inactive;
}

欠陥は次のブロック、映像の回転を解析する部分にあります。このブロックは videoRotation を探し、値が数値であることを確認した後、間違ったイテレーターから回転を読みます。4つの比較すべてが、検証したばかりの videoRotation イテレーターではなく、存在しない可能性のある省略可能フィールドのイテレーター videoState->second を読みます。バージョン12.10.3のコードです。

const auto videoRotation = object.find("videoRotation");
if (videoRotation != object.end()) {
    if (!videoRotation->second.is_number()) {
        RTC_LOG(LS_ERROR) << "Signaling: videoRotation must be a number";
        return absl::nullopt;
    }
    if (videoState->second.int_value() == 0) {              // reads videoState, not videoRotation
        message.videoRotation = MediaStateMessage::VideoRotation::Rotation0;
    } else if (videoState->second.int_value() == 90) {      // reads videoState, not videoRotation
        message.videoRotation = MediaStateMessage::VideoRotation::Rotation90;
    } else if (videoState->second.int_value() == 180) {     // reads videoState, not videoRotation
        message.videoRotation = MediaStateMessage::VideoRotation::Rotation180;
    } else if (videoState->second.int_value() == 270) {     // reads videoState, not videoRotation
        message.videoRotation = MediaStateMessage::VideoRotation::Rotation270;
    } else {
        ...
    }
}

videoRotation の数値を持ちながら videoState の文字列を持たないMediaStateメッセージ、つまり解析コードが他の場所では許容する形であるメッセージは、比較で end() を逆参照させます。NebuSecの説明と一致します。コードは「存在しないフィールドを正しく処理せず、触れてはならないメモリにアクセスしていた」。NebuSecがこの読み取りをARM64端末でのコード実行にどう変えたかは、2026年10月29日時点で公開されていません。

悪用の仕組み

概念検証コードは公開されていないため、以下の手順はThe Hacker Newsが伝えるNebuSecの開示とデモ動画に基づきます。

  1. 通常のTelegramアカウントだけでよい攻撃者が、アプリから被害者に音声通話をかけます。
  2. 被害者が応答します。この瞬間から、2つのアプリは通話の確立と状態を伝える短いメッセージを交換します。
  3. 攻撃者のクライアントは、欠陥用に細工したMediaStateメッセージを送ります。videoRotation の数値は存在し、省略可能な videoState フィールドは省かれています。
  4. 被害者のアプリはメッセージを解析し、回転の数値を検証した後、メッセージのフィールドの先を指す videoState イテレーター経由で回転を読みます。
  5. パーサーは触れてはならないメモリを読み、NebuSecのデモは電話が攻撃者の制御下に置かれる様子を示します。通話開始から約30秒後、被害者の電話はホーム画面に切り替わり、アプリのアイコンが画面から落下し、「HACKED BY NEBUSEC」のロゴが表示されます。

攻撃フロー

連鎖は1メッセージで完結します。被害者が呼び出しに応答し、攻撃者が1つのフィールドを含め1つを省いたMediaStateメッセージを送り、パーサーが終端イテレーターを越えて触れてはならないメモリを読みます。

flowchart LR A["攻撃者がTelegramの
音声通話を発信"] --> B["被害者が呼び出しに応答"] B --> C["攻撃者がMediaStateメッセージを送信:
videoRotationあり、
videoState省略"] C --> D["パーサーはvideoRotationを検証後、
videoStateイテレーター経由で
読み取る"] E["videoStateの検索はend()を返した:
フィールドが存在しない"] --> D D --> F["終端イテレーター経由の
範囲外読み取り"] F --> G["NebuSecによれば、被害者のARM64電話で
コード実行"]

攻撃者に可能なこと

攻撃者は、被害者が応答した通話から、発信側の権限は通常のTelegramアカウントだけのまま、被害者の電話でコードを実行できます。NebuSecは1対1の通話でARM64端末上の実行を確認しました。動画は端末が画面を切り替え、攻撃者のロゴを表示する様子を示しています。

攻撃に必要な条件:

  • 被害者の電話で、8.6.2から12.10.3までのTelegram for Android。このメッセージを使う通話機能のコードは、NebuSecが挙げる最初のバージョン8.6.2で有効になりました。
  • 被害者が着信音声通話に応答すること。ユーザー操作が唯一の関門で、欠陥は応答後に発火し、着信音時ではありません。
  • Android上の1対1の通話であること。影響をTelegram for iOS、Telegram Desktop、グループ通話に広げる証拠はありません(よくある質問を参照)。

NebuSecは2026年10月29日にこの欠陥を開示しました。The Hacker Newsは、この欠陥が実際の攻撃で使われたかどうかをNebuSecとTelegramに尋ねました。また、攻撃者のコードが電話上で何に届き得るかも尋ねました。10月29日時点で、どちらの企業も回答を公表していません。

修正が機能する理由

バージョン12.10.4の修正は、検証したイテレーターから回転を読みます。ブロック内のすべての比較が videoState->second.int_value() から videoRotation->second.int_value() に変わります。

if (videoRotation->second.int_value() == 0) {
    message.videoRotation = MediaStateMessage::VideoRotation::Rotation0;
} else if (videoRotation->second.int_value() == 90) {
    message.videoRotation = MediaStateMessage::VideoRotation::Rotation90;
} else if (videoRotation->second.int_value() == 180) {
    message.videoRotation = MediaStateMessage::VideoRotation::Rotation180;
} else if (videoRotation->second.int_value() == 270) {
    message.videoRotation = MediaStateMessage::VideoRotation::Rotation270;
} else {
    ...
}

ブロックは最初の比較の前に videoRotation->second が数値であることを確認済みのため、同じ値を読む限りメッセージのフィールドの外に出られません。同じ4行の変更は、アプリがコンパイルするパーサーのもう1つのコピー v2_4_0_0/Signaling_4_0_0.cpp にも加えられました。こちらにも同じ誤りがありました。存在しない videoState フィールドは、引き続きデフォルト値 Inactive になります。

この修正は、プラットフォームごとに異なる時期に届きました。同じ訂正が共有ライブラリtgcallsに2026年4月21日、「Fix camera rotation」というタイトルのコミットで入りました。プラットフォームは1つずつ取り込みました。Telegram for iOSは2026年5月リリースのバージョン12.7から、Telegram Desktopは2026年7月リリースの7.0.1から修正済みライブラリを含みます。Telegram for Androidは2026年9月の12.10.4で受け取りました。Androidアプリが TMessagesProj/jni/voip/tgcalls に独自のライブラリコピーを持ち、各プラットフォームが別々に更新するためです。

Androidは共有ライブラリの修正から156日後に修正を受け取った
図1: 2026年4月21日のtgcalls修正は、2026年9月24日の12.10.4で初めてAndroidアプリに届きました。出典: TelegramMessenger/tgcallsとDrKLO/Telegramのコミット、2026年10月29日確認。

侵害されたかを確認する方法

侵害指標は存在しません。悪用が報告されていないためです。NebuSecの開示は欠陥を説明するもので、10月29日時点で、同社もTelegramも、誰かに対して使われたとは述べていません。

開示は、防御者が探すための材料も提供しません。攻撃は通常の通話交換と同じMediaStateメッセージに乗り、パーサーの範囲外読み取りは、公開源のどこにも名前を挙げられた痕跡を残しません。更新自体を是正とみなし、12.10.3以前のままの電話は侵害済みではなく露出していると扱ってください。

経緯

  • 2022年3月:バージョン8.6.2がリリース。NebuSecが影響ありとする最初のバージョンで、The Hacker Newsのソースレビューによれば、このメッセージを使う通話機能のコードを有効にしたリリースです。
  • 2026-04-21:訂正が共有ライブラリtgcallsに「Fix camera rotation」コミットで到着。
  • 2026年5月:Telegram for iOSがバージョン12.7から修正済みライブラリを含む。
  • 2026年7月:Telegram Desktopがバージョン7.0.1から修正済みライブラリを含む。
  • 2026-09-17:最後の影響を受けるバージョン、Telegram for Android 12.10.3がコミットされる。
  • 2026-09-24:欠陥を修正するTelegram for Android 12.10.4がコミットされる。The Hacker Newsは9月末のリリースとしています。
  • 2026-10-29:NebuSecが欠陥を開示。

よくある質問

どのバージョンのTelegram for Androidが影響を受けますか?

NebuSecによれば、8.6.2から12.10.3までの全バージョンです。つまり2022年3月から2026年9月までの全リリースです。2026年9月24日にコミットされたバージョン12.10.4が最初の修正版で、確認すべきバージョンは12.10.4以降です。

Telegram for iOSやTelegram Desktopは影響を受けますか?

実証されていません。3つのアプリは欠陥があった通話ライブラリtgcallsを共有していますが、iOSは2026年5月の12.7から、Desktopは2026年7月の7.0.1から修正済みライブラリを含み、9月のAndroid修正に先行しました。NebuSecはこれらのアプリやグループ通話に直接影響する証拠を持たず、The Hacker Newsは、以前のコードがそこで悪用可能だったかどうかは示されていないと述べています。

CVEやCVSSスコアはありますか?

いいえ。この欠陥は2026年10月29日時点でCVE識別子を持たず、CVSSスコアも公表されていません。影響の記述はNebuSecの開示によるもので、被害者が通話に応答したとき、攻撃者のコードが被害者の電話上で実行されます。

この欠陥は実際の攻撃で悪用されていますか?

2026年10月29日時点で、実際の攻撃での使用は報告されていません。NebuSecもTelegramも、使われたかどうかを公には明らかにしていません。この欠陥はCISAのKnown Exploited Vulnerabilitiesカタログにはなく、同カタログはCVE識別子しか追跡しません。

テストできる概念検証はありますか?

動画だけです。NebuSecのデモは、攻撃者側と被害者側と印された2台の電話を示し、通話開始から約30秒後、被害者の電話が攻撃者の制御下に置かれます。動画は被害者の電話が実行していたTelegramやAndroidのバージョンを示しておらず、2026年10月29日時点でNebuSecのサイトに技術解説はありませんでした。

グループ通話は同じ経路をさらしますか?

そのような証拠はありません。NebuSecの開示は、2者間の通話、つまり2つのアプリが直接MediaStateメッセージを交換するものであり、グループ通話が影響を受ける証拠を同社は持っていません。

OstorlabでAndroidアプリをスキャンする

開発または配布しているAndroidアプリに対してOstorlabのモバイルスキャンを実行してください。同梱されたネイティブライブラリを含めてアプリパッケージを解析するため、リリースがユーザーに届く前に脆弱なコンポーネントを検出できます。

参考資料

  • The Hacker News「Telegram Android Flaw Lets Attackers Run Code When Users Answer Voice Calls」、2026年10月29日。NebuSecの影響範囲、ARM64の確認、iOSとデスクトップの修正バージョン、欠陥コードと修正コードのソースレビューを含む:https://thehackernews.com/2026/10/telegram-android-flaw-lets-attackers.html (2026年10月29日確認)
  • NebuSecのX上の開示、2026年10月29日、The Hacker Newsが引用:https://x.com/nebusecurity/status/2115601122727702634 (2026年10月29日確認)
  • Telegram for Androidバージョン8.6.2のソース、2022年3月20日のコミット「Update to 8.6.2」。tgcalls/v2/Signaling.cpp をビルドに加え、通話プロトコル4.0.0を利用可能なバージョンに追加:https://github.com/DrKLO/Telegram/commit/0abe4541ddbafa65bb79beff5d81c452c7e9626d (2026年10月29日確認)
  • Telegram for Androidバージョン12.10.3のソース、tgcalls同梱コピー内の欠陥のある MediaStateMessage_parse、2026年9月17日のコミット「update to 12.10.3 (7089)」:https://github.com/DrKLO/Telegram/blob/9552e5541e1274b9557c9832b204dbfcaf44b3dc/TMessagesProj/jni/voip/tgcalls/v2/Signaling.cpp#L720-L740 (2026年10月29日確認)
  • Telegram for Androidバージョン12.10.4のソース、修正された解析ブロック、2026年9月24日のコミット「update to 12.10.4 (7099)」:https://github.com/DrKLO/Telegram/blob/c84801762fd5f936c8296ecf09a14a48ebfc4fe4/TMessagesProj/jni/voip/tgcalls/v2/Signaling.cpp#L727-L747 (2026年10月29日確認)
  • tgcalls上流の修正コミット「Fix camera rotation」、2026年4月21日。v2/Signaling.cpp と v2_4_0_0/Signaling_4_0_0.cpp の両方を変更:https://github.com/TelegramMessenger/tgcalls/commit/a6ea40ebf18233fad5aae29aa3d30561f839a6a8 (2026年10月29日確認)
  • Telegram for iOSリリース12.7、tgcallsサブモジュールが修正コミットを指す:https://github.com/TelegramMessenger/Telegram-iOS/tree/release-12.7/submodules/TgVoipWebrtc (2026年10月29日確認)
  • Telegram Desktop 7.0.1、2026年7月14日リリース、tgcallsサブモジュールに修正を含む最初のDesktopリリース:https://github.com/telegramdesktop/tdesktop/releases/tag/v7.0.1 (2026年10月29日確認)
  • Google PlayのTelegram for Android、掲載ページの「更新」ボタン:https://play.google.com/store/apps/details?id=org.telegram.messenger (2026年10月29日確認)
  • CISA Known Exploited VulnerabilitiesカタログのJSONフィード、2026年10月29日、この欠陥の識別子の不在を確認:https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json