Googleは最近、Android仮想化フレームワークの保護された仮想マシン用ファームウェアをRustプログラミング言語で書き直し、その経験をもとに他の開発者にも、“メモリセーフ”な言語である、Rustへの移行を強く推奨し、ブログでその詳細を解説している。
なぜGoogleはファームウェアにRustを選んだのか
Googleのエンジニア、Ivan Lozano氏とDominik Maier氏は、レガシーなC/C++コードをRustに置き換える技術的詳細について詳細な解説を行った。彼らは「Rustの代替実装を使用してセキュリティを向上させるのがいかに簡単か、そして特殊なベアメタルターゲットをRustツールチェーンで効率的に処理できることを実証する」と述べている。
Rustは一般的に急な学習曲線で知られているが、Googleはその採用を積極的に推進している。その主な理由として、以下の点が挙げられる:
- メモリ安全性の大幅な向上:ファームウェアは多くの場合、メモリ安全でない言語であるCやC++で書かれている。Rustは、バッファオーバーフローやuse-after-freeなどのメモリ安全性の問題を設計段階から回避することができる。
- 高パフォーマンスと小さなコードサイズの両立:RustはCやC++と同等の高いパフォーマンスとコンパクトなコードサイズを提供しながら、メモリ安全性を確保できる。
- シームレスなCとの相互運用性:RustはCとのオーバーヘッドなしの相互運用性をサポートしており、既存のコードベースとの統合が容易である。
- 開発者の生産性の飛躍的向上:Googleの内部調査によると、Rust開発者はC++エンジニアの2倍の生産性を持つという結論が出ている。
この動きは、米国政府機関や主要技術企業による重要なオープンソースプロジェクトをRustで書き直す大規模な取り組みとも連動している。サイバーセキュリティ・インフラストラクチャセキュリティ庁(CISA)は昨年、ソフトウェアベンダーに対して「メモリ安全性の脆弱性を削減し、最終的に製品ラインから完全に排除することを企業の最重要目標にする」よう強く推奨している。
この流れを受けて、GoogleのAndroidプログラミング言語エンジニアリング担当ディレクターであり、Rust Foundationの理事会議長でもあるLars Bergstrom氏は、次のように述べている。「私たちは、スタックのあらゆるレベルで安全で信頼性の高いソフトウェアを構築する上で、Rustが果たす重要な役割を認識しています。Googleでは、メモリ安全性の脆弱性を減らすために、Android、Chromium、その他のプロジェクトでRustの使用を拡大しています」。
Rustをファームウェアに導入する具体的な方法
Googleは、既存のファームウェアコードベースにRustを段階的に導入する方法を提案している。この方法は、新規コードと最もセキュリティクリティカルなコードに優先的にRustを適用することで、最小限の労力で最大のセキュリティ効果を得ることを目指している。
具体的なアプローチは以下の通りである:
- 段階的なRust導入:
- 新規コードをRustで書く
- 外部からの信頼できない入力を処理する既存コードなど、高リスクの部分を優先的にRustで置き換える
- 時間をかけて、残りのコードを徐々にRustに移行する
- 既存のCコードベースとの統合:
- 薄いRustラッパーを作成し、既存のC APIとRust APIの間を橋渡しする
- Bindgenツールを使用して、RustからCの関数を呼び出すためのFFIバインディングを自動生成する
- パニックハンドラ、グローバルアロケータ、クリティカルセクションハンドラをRustから既存のファームウェアC関数にフックする
- ベアメタル環境への対応:
- no_std互換のクレート(Rustライブラリ)を選択または既存のstdクレートをno_stdに変換する
- メモリ割り当ての失敗を適切に処理するために、fallibleな割り当てを使用するか、静的に割り当てられたコレクションを使用する
- ビルド最適化とパフォーマンスの考慮:
- リンク時最適化(LTO)を有効にしてコードサイズを最適化する
- 単一のRust静的ライブラリを最終的なリンケージに含めるよう注意する
- Rustのパフォーマンスは一般的にCと同等であり、Linuxカーネルドライバでの実験では「RustバインダーはCバインダーと同様のパフォーマンスを示した」という結果が得られている
Googleは、このアプローチを用いることで、大規模なレガシーファームウェアコードベースに即座にRustを導入できると主張している。セキュリティクリティカルなコンポーネントを、オフザシェルフのオープンソースのメモリセーフな実装に置き換え、新機能をメモリセーフな言語で開発することで、重大な脆弱性を減らしながら、開発者の体験も向上させることができるとしている。
この取り組みは、Androidチームが以前からベアメタルファームウェア向けのRustについて議論し、この領域に特化したトレーニングを開発してきた経緯とも合致している。Googleは、この方法を通じて、ファームウェア開発の安全性と効率性を大幅に向上させることを目指している。
Sources
- Google Security Blogo: Deploying Rust in Existing Firmware Codebases
- via The Register: Google says replacing C/C++ in firmware with Rust is easy
コメント