ニュース
「ベアメタル」環境でもRustを採用 Googleが「Android 14」での取り組みを解説
安全性と生産性の両面でC/C++よりも大幅に改善
2023年10月13日 13:29
米GoogleはAndroid OSの開発でRust言語の活用を始めており、一定の成果を上げている。最新の「Android 14」ではこれをさらに推し進め、「ベアメタル」環境でも積極的に利用しているとのこと。10月9日(現地時間)付けで公開された公式ブログ「Google Online Security Blog」の記事で、その一部が紹介されている。
AndroidにおけるRustの採用
Androidのアプリは開発者ではなくランタイムがメモリを管理する「マネージド」なプログラミング言語(Javaなど)で記述されており、メモリ破損のような脆弱性はあまり発生しない。その一方で、コアシステムに関しては歴史的にアンマネージドなC++言語が用いられてきた。C++コードはしばしばメモリ安全性にかかわる脆弱性の温床となってきたが、パフォーマンスの面ではマネージドコードの追随を許さないほどに優秀で、リソース制約の大きいモバイルデバイスには向いている。セキュリティに関してはツールを活用しながら不具合の混入をなるべく避けるとともに、脆弱性の早期検出と解決に努めるしかないのが現実だった。
しかし、この状況を変えつつあるのがRust言語だ。Rustははじめからメモリ安全性に重きを置いて設計されており、実行速度もC++言語と遜色ない。そのため、近年、Android開発でもC++からRustへ移行しようという機運が高まっている。Googleはメモリ破壊の脆弱性を引き起こしているのは比較的最近追加されたC++コードに集中しているという事実に着目し、新規に書き起こされたコンポーネントから徐々にRustの導入を進めている。
しかし、そのコンポーネントのほとんどはLinuxカーネル下のユーザー空間で動作するシステムサービスがほとんどだ。Android OSでセキュリティ上重要なコンポーネントの多くはLinuxカーネルの外側の「ベアメタル」(OSを介さずにハードウェアへ直接アクセスする)環境で動作しているが、これらは相変わらずC言語で記述されていた。
「Android 14」で導入されたRust pVMファームウェア
最新の「Android 14」ではこれにもメスが入っており、「Android Virtualization Framework」の保護された仮想マシン(pVM)ファームウェアがRustで書き直されている。この過程で得られた知見はRustコミュニティにもフィードバックされており、Android以外でも活用されているとのこと。
また、Rustはまだまだ若い言語であり、既存のプログラミング言語にはない概念も少なくないため、エンジニアの育成も大きな課題だった。そこで、さまざまなバックグラウンドを持つプログラマーにベアメタルRustの育成コースを提供したが、アンケートに答えた受講者の97%がこのコースを有意義であったと回答したという。CやC++で犯しやすいミスを避けられる言語設計は、エンジニアからも評価されているようだ。
Rustの課題
とはいえ、Rustはメリットばかりではない。
たとえばRustの型システムは「メモリはプログラムによってのみ割り当てられ、プログラムによってのみ使用される」という暗黙の前提で設計されているが、ハードウェアを扱うベアメタルプログラミングはいつでもそうあるとは限らない。MMIO(Memory Mapped I/O)や共有メモリ、割り込みハンドラーや例外ハンドラーをキレイにカプセル化するのはまだ難しく、今後の改善に期待がかかる。ページテーブルの操作といった安全が保証されない操作もCと同様、プログラマー自身が安全性を気にかけながらプログラミングしなければならず、「Rustだから安全」というわけにはいかない。
また、ベアメタルにRustを採用するにあたってはバイナリサイズへ懸念を示す人もいる。たとえば、前述のRust pVMファームウェアのバイナリは約460kBだが、以前のCバージョンはたったの220kBだった。サイズが2倍以上に膨れ上がったことになる。
ただし、Rust版では機能追加も行われているため、公平な比較とは言えない。また、バイナリサイズの最適化についてはまだ改善の余地があり、依存性に注意しながら文字フォーマットを避ければ、Cバージョンと同等のサイズに抑えられるようだ。
そのほかにも、アーキテクチャーの対応状況でも懸念は残る。Androidデバイスでよく採用されているArmやRISC-VといったCPUは十分にサポートされているものの、Qualcomm Hexagon DSPなどではCに比べて足りないところがあるという。
とはいえ、全体的に見てみればRustは有望で、安全性と生産性の両面でC/C++よりも大幅に改善されている。今後もRustの採用は進みそうだ。