Google、Pixel 10のベースバンドファームウェアにRustを導入
(security.googleblog.com)Googleは、Pixel 10のセルラーベースバンド(モデム)ファームウェアに、メモリ安全な言語であるRustベースのDNSパーサーを導入した。リモート攻撃面が大きいベースバンドにおいて、メモリ安全性の脆弱性群を減らすための先手を打つ対応だ。
重要ポイント
- Pixel 9ではメモリ安全性の脆弱性に対する緩和策を適用し、Pixel 10ではさらに一歩進めて、Rustコードを実際のベースバンドファームウェアに組み込んだ。
- 最初の適用対象はDNSパーサーだ。DNSはブラウザーだけでなく、着信転送のような移動通信の基本機能にも使われ、信頼できないデータを直接パースするため、脆弱性が発生しやすい領域でもある。
- GoogleはオープンソースのRust DNSライブラリ
hickory-protoを採用した。保守状況、テストカバレッジ、コミュニティでの採用度を高く評価した。 - ただし、ベアメタル環境に必要な
no_stdのサポートが不足していたため、Googleは関連crateと依存関係に自らno_stdサポートを追加し、upstreamに貢献した。 - コードサイズはおよそ371KBと測定された。このうち350KBが
hickory-protoと依存関係、17KBがcore・alloc・compiler_builtins、4KBがモデムと接続するshimコードだ。 - Googleは、Cargoで独立したstaticlibを複数貼り合わせる方式ではなく、既存のモデムビルドシステム(Pigweed/GN)にRustのコンパイル段階を直接統合する方式を選んだ。
- Rustのメモリアロケータとpanic処理も、既存のモデムファームウェアのallocator、crash backendとFFIで接続して統合した。
- リンク段階では、
compiler_builtinsが既存モデム向けに最適化されたmemcpy/memset実装を上書きし、性能低下が発生したが、これをone-lineスクリプトで削除して解決した。 - Googleは今回の適用が一度限りの措置ではなく、今後ベースバンド内の他の高リスクなパーサーやコードにもメモリ安全な言語を拡大していくための基盤だと説明した。
なぜ重要か
セルラーベースバンドは外部と直接接する低レベルソフトウェアであり、攻撃対象としての価値が高い。実際、Project Zeroが過去にPixelモデムでインターネット経由のリモートコード実行を実演したこともある。このような環境では、C/C++中心のコードにおけるメモリ安全性の問題は構造的なリスクになりやすい。
今回のGoogleの発表は、単に「Rustを使った」というレベルにとどまらず、モバイルベースバンドのように制約が大きく機微なファームウェア領域でも、メモリ安全な言語を実運用に投入できることを示す事例だという点で意義が大きい。
技術的に目を引く点
hickory-protoをbare-metalで動かすためにno_stdサポートを追加した。- Rustと既存のC/C++コード間のインターフェースはFFIで接続した。
- 応答パースはRustが担当し、既存のCメモリ構造の更新には従来のC関数コールバックを再利用した。
- 外部crateが30個以上あるため、手作業のビルドルールではなく、Fuchsiaの
cargo-gnawを使ってGNビルドルールを生成した。
まだコメントはありません。