FlawOpen

flawopen.com/Teardowns/cve-2026-55269-android-snooplogger-heap-write

● CVE-2026-55269 · CVSS 7.8 · 高
セキュリティ研究 · FlawOpen

CVE-2026-55269:Android Bluetooth SnoopLogger のヒープ範囲外書き込み

CVE-2026-55269 は Android Bluetooth SnoopLogger のメモリー安全性の問題で、ローカル権限昇格につながる可能性があります。特定の開発者向けログ設定では、短いパケットが容量不足のまま固定文字列を書き込む経路に入る可能性がありました。Google は逆になっていた拡張条件を修正し、解析長を制限しました。

💡 わかりやすい解説 (ELI5)

細い小包に「PROHIBITED」の印を押す係を想像してください。本来は先に緩衝材を足すべきですが、逆向きの表示のため、小さな小包ほどその手順を飛ばしていました。修正では印を押す前に短いパケットへ余裕を追加し、記録長を実際に使える範囲に制限します。

主要な概念と専門用語

SnoopLogger
取得した HCI パケットをフィルターし記録する Android Bluetooth のコードです。影響経路には説明されたフィルターログ設定が必要です。
HCI ACL パケット
Bluetooth ホストとコントローラー間のデータパケットです。該当フィルターが有効な場合、極端に短いパケットがバッファー不足の経路に入ると上流変更は説明しています。
EXTRA_BUF_SIZE
フィルター済みパケットに固定文字列「PROHIBITED」を書き込む前に追加する容量です。修正は短いパケットにもこの余裕を確保します。
CWE-20
不適切な入力検証です。CISA ADP がこの弱点を割り当てています。具体的な欠陥は、パケットバッファー処理におけるサイズ条件の逆転でした。

フレームワーク対応

  • FlawOpenによるMITRE CWEへの概念上の対応付けです。ベンダーやCVEレコードがこの研究デモに弱点IDを割り当てたものではありません。 CWE-20

根本原因の分析 (Root Cause)

2026年10月の Android セキュリティ情報では、CVE-2026-55269 の対象として Android 16、16 QPR2、17 が挙げられています。NVD は現在、CISA ADP の CVSS 3.1 7.8(High)を表示する一方、Google の情報は System の項目を Critical としています。これは異なる評価です。上流の Bluetooth コミットでは、SnoopLogger::FilterCapturedPacket が PBAP/MAP フィルター経路に入り、PayloadStrip が固定マーカー PROHIBITED を書く場合があります。脆弱な条件 packet.size() + EXTRA_BUF_SIZE > DEFAULT_PACKET_SIZE は小さいパケットの拡張を省き、容量不足を残していました。修正は演算子を <= にし、length を packet.size() + PACKET_TYPE_LENGTH 以下にします。コミットは悪意ある Bluetooth コントローラーが短い HCI ACL パケットを送るケースを説明していますが、該当する開発者向けオプションと SnoopLogger フィルターの有効化が必要です。インターネットから到達できる Android サービスではありません。攻撃ペイロードは掲載しません。更新の提供時期はメーカーによります。

ステップ・バイ・ステップの攻撃フロー

ステップ 1

特定のログ設定が有効になる

コミットは、開発者向けオプションで Bluetooth SnoopLogger フィルターを有効にし、PBAP/MAP フィルタープロファイルを magic に設定した場合を説明します。すべての Android 端末や既定設定に一般化しないでください。

ステップ 2

コントローラーが極端に短いパケットを送る

悪意ある Bluetooth コントローラーは、短い HCI ACL パケットをフィルター済みキャプチャ経路へ送る可能性があります。パケットバイト列と操作的な発火手順は省いています。

ステップ 3

逆向きの条件が必要な拡張を省く

FilterCapturedPacket は > を使っていましたが、必要なのは <= です。短いパケットに EXTRA_BUF_SIZE が追加されず、その後の処理が小さすぎるバッファーへ PROHIBITED を書く可能性がありました。

ステップ 4

上流修正がバッファーの境界を守る

修正は対象の短いパケットに余裕を追加し、解析長を利用可能なデータに制限します。メーカーから提供されたら、パッチレベル 2026-10-01 以降の更新を適用してください。

ソースコード比較:脆弱 vs 堅牢化

この抜粋は Google の公開変更に沿っています。比較演算子を反転し、短いパケットにマーカー用の追加容量を与え、解析長を使用可能なサイズに制限します。コミットには短いパケットのテストも追加されています。これは上流修正を簡略化した説明であり、端末に直接適用できる独立パッチではありません。メーカーが提供するパッチレベル 2026-10-01 以降の更新を適用してください。

ソース抜粋: snoop_logger.cc

脆弱な実装
if (packet.size() + EXTRA_BUF_SIZE > DEFAULT_PACKET_SIZE) {
  // 短いパケットにはフィルターマーカー用の領域が必要。
  packet.resize(packet.size() + EXTRA_BUF_SIZE);
}

// その後、PayloadStrip が固定マーカー PROHIBITED を書き込む。
堅牢化されたセキュアパッチ
if (packet.size() + EXTRA_BUF_SIZE <= DEFAULT_PACKET_SIZE) {
  // フィルター処理の前に、対象となる短いパケットを拡張する。
  packet.resize(packet.size() + EXTRA_BUF_SIZE);
}

// 解析した長さを、サイズ変更後のパケット内に収める。
length = std::min(
    length, static_cast<uint32_t>(packet.size() + PACKET_TYPE_LENGTH));

エンジニアリング&システム堅牢化チェックリスト

参考資料