GoogleはAndroid開発におけるメモリバグの除去にRustを信頼している

Table of Contents

GoogleはAndroid開発におけるメモリバグの除去にRustを信頼している

Google は、メモリベースのセキュリティ脆弱性の蔓延を制限するために、低レベルのシステムコードで Rust プログラミング言語をサポートすることを発表しました。

Androidプロジェクトは主に2つの言語で構築されています。UIなどのオペレーティングシステムの高レベル部分には、Java(および最近ではKotlinなどのJVM互換言語)が好まれてきました。カーネルやドライバなどのOSの基礎部分は、通常C言語で記述されており、C++も一部使用されています。

C言語、さらにはC++は、高水準言語では実現が難しい、基盤となるハードウェアへの近似度合いを備えているため、システムレベルのプログラミングに適していると考えられています。Java仮想マシンのような中間抽象化層は存在しません。また、C言語は移植性が高く、メモリ処理などに関しては開発者が自由に開発できます。

しかし、この柔軟性は諸刃の剣であることが繰り返し証明されています。ガベージコレクションに頼ることができないため、単純なメモリ管理エラーがバッファオーバーフローやオーバーリードといった深刻なセキュリティ問題につながることが頻繁にあります。Googleによると、Androidオープンソースプロジェクトで発見された重大度の高いセキュリティ脆弱性の70%はメモリ安全性に関するバグです。

2010 年に Mozilla によって導入された Rust プログラミング言語は、C の低レベルのパワーと Java などの高レベル言語に見られるメモリの安全性の間の適切な中間点を提供します。

しかし、そのアプローチは斬新です。RustはC言語のように手動のメモリ管理を重視していません。また、Javaスタイルのガベージコレクタも搭載されていません(ただし、Rustのガベージコレクタの存在はやや議論の的となっています)。むしろ、メモリ使用量をスコープと密接に関連付けるという、第三のアプローチを採用しています。

コードを表示したノートパソコンの前に置かれた Google Android のおもちゃ

GoogleとAppleが助けてくれないなら、Linuxの方法で解決しよう:21社がMobile Native Foundationを結成

続きを読む

Rustの核となる概念は所有権です。簡単に言えば、すべての値には所有者が存在します。所有者がスコープ外になると、値は破棄されます。これにより、メモリベースのセキュリティバグのリスクが軽減されると同時に、安全性を確保するために必要なコード量も抑えられます。

さらに、Rustではすべての変数を使用前に初期化する必要があるため、GoogleがAndroidのセキュリティ脆弱性の3~5%の根本原因であると主張する問題を回避できます。Rustには、メモリセキュリティのもう一つの脅威であるバッファオーバーフローに対するネイティブ保護機能も搭載されています。

Googleは、Androidのコードが数百万行に及ぶことを考えると、OS全体をRustで書き直すことは途方もない作業となるため、その意向はないと述べています。むしろ、今後もRustを使い続ける意向です。これは、新しく書かれたコードにはメモリ安全性に関するエラーが不釣り合いに多いためだとGoogleは述べています。古いコードは比較的堅牢で、既にエラーが除去されています。

AndroidのRust導入は一夜にして実現するものではない。Googleはこの作業を「大規模な取り組み」と表現し、膨大な量の基盤作業が必要であることを強調した。「ツールチェーンと依存関係の維持、テストインフラとツールの更新、そして開発者のトレーニングが必要だ」と同社は述べている。

同社では Rust を活用した早期導入プロジェクトをいくつか進行中だが、この言語を広く普及させるには「複数年にわたるプロジェクト」が必要になる。

AndroidがRustを採用したことは、この言語の人気の高まりを示唆しています。昨年7月、リーナス・トーバルズ氏は、RustがLinuxプロジェクト、特にデバイスドライバ分野で活用される可能性を示唆しました。これは、2020年にDebian開発者でありMozillaディレクターでもあるシルベストル・ルドル氏が、GNU Coreutilsスイート(基本的なファイル、シェル、テキスト操作ユーティリティのスイート)をRustに移植する前のことでした。®

Discover More