Google Security Blogの投稿によると、Pixel 10シリーズは、セルラーモデムのソフトウェア内部にメモリ安全なRustで記述されたコンポーネントを統合する初のPixel端末となる。この取り組みでは、Rustで構築されたドメインネームシステム(DNS)パーサーをモデムのファームウェアに導入し、信頼できないデータを扱う部分におけるメモリ安全性に関連する脆弱性のリスクを減らすことを目指している。
この取り組みは、セルラー通信モデムの悪用に対する防御を強化するGoogleの取り組みの一環だ。同社はPixel 9に複数のメモリ安全性脆弱性への緩和策を導入したが、モデムのファームウェアは複雑で攻撃対象領域も広いため、さらに積極的な対策が必要だと考えている。Googleによれば、Project Zeroは以前、インターネット経由でPixelのモデム上にリモートコード実行を達成できた。また、Pixelのモデムには数十メガバイトの実行可能コードが含まれている。
なぜGoogleはDNSパーサーを選んだのか
DNSは、ブラウザーがウェブサイトを見つけるのを助けるためだけに使われるわけではない。現代のセルラー通信がデジタルデータネットワークへ移行するなか、通話の転送などの基本的な処理もDNSサービスに依存している。この複雑なプロトコルは、信頼できない可能性のあるデータを解析する必要があるため、メモリ保護を欠く言語で実装された場合には重要な攻撃ポイントとなる。投稿によれば、これはCVE-2024-27227の脆弱性にも関連する種類のリスクだ。
Googleは、RustでDNSを実装する複数のオープンソースパッケージを評価し、保守状況、75%を超えるテストカバレッジ、Rustコミュニティでの普及度を基準に、hickory-protoライブラリを選択した。当初、このライブラリには、リソースが限られた環境やオペレーティングシステムなしで動作する環境に必要なno_stdのサポートがなかった。そのためGoogleは、このライブラリと一部の依存関係に同サポートを追加した。この作業により、rust-urlプロジェクトのURLパーサーにもno_stdサポートがもたらされた。
サイズのコストと既存ソフトウェアとの統合
サイズ調査では、Rustで記述された中間コンポーネントが4キロバイト、core、alloc、compiler_builtinsの各コンポーネントが17キロバイト、hickory-protoライブラリとその依存関係が350キロバイトを消費し、合計は371キロバイトとなった。Googleは、Pixelのモデムメモリのサイズに厳しい制約はないと考えており、現段階ではサイズの最適化よりもコミュニティによるサポートとコード品質を優先した。ただし、この増加分は他の組み込みシステムにとって障壁になる可能性があり、将来的には不要な機能を除外するコンパイルオプションによって削減できると指摘している。
既存のCおよびC++で記述されたコードベースにRustを統合するため、チームは基本的な算術処理、動的メモリ割り当て、言語間の接続インターフェースを検証するユニットテストを使用した。また、Cargoを通じて別個の静的ライブラリを作成するのではなく、Rustのコンパイル手順を既存のビルドシステムに直接統合する方式を選択した。この方法は、Rustコンポーネントを追加する際の拡張が容易で、シンボルが衝突する可能性を減らせるためだ。
基本的なビルドシステムにはPigweedを使用し、ファームウェアに存在するメモリ割り当てシステムをRustのallocコンポーネントに接続するため、またRustとC/C++間でパニック処理を統一するために、FFIインターフェースを使用した。リンク時には、modem向けに最適化されたmemsetおよびmemcpyの実装がcompiler_builtins由来の実装に置き換わったことで、性能と電力消費に関する問題が発生した。チームは、リンク段階の前に静的ライブラリからcompiler_builtinsのファイルを削除することで問題に対処した。
DNSインターフェースと次の段階
GoogleはDNS応答を処理するC言語のAPIを定義し、それをRustで実装した。応答の解析後、コンポーネントは既存のC関数を呼び出し、元のプログラムで使用されるデータ構造を更新する。データ型間の複雑な変換に必要な接続コードの生成には、bindgenツールを使用した。
Googleによれば、Pixel 10シリーズは、メモリ安全な言語をモデム内部に統合する初のPixel端末であり、重要な節目となる。この目標は単一のパーサーを置き換えることにとどまらない。同社は、このプロジェクトが、将来的にメモリ安全な言語で記述された他のパーサーやコンポーネントをセルラー通信基盤のコードベースへ導入するための基盤になると考えている。