ニュース

Rust言語でAndroidはより強固・安全に ~GoogleがOS開発への導入を進める

C/C++コードの完全な置き換えは非現実的だが、新規コードへの活用は不具合の予防に効果あり

公式ブログ“Google Online Security Blog”

 米Googleは最近、AndroidのOS開発でRust言語を活用しているという。4月6日(現地時間)付けで公開された公式ブログ“Google Online Security Blog”の記事で、その一部が紹介されている。

 Androidの“アプリ”開発には、JavaやKotlinなどのマネージド(managed)言語が広く用いられている。マネージド言語では開発者に代わりAndroidランタイム(ART)がメモリを管理するため、安定性の低下やセキュリティを損なう不具合が混入しにくい。

 しかし、Androidの“OS”開発ではCやC++言語といったシステム開発向けのプログラミング言語が採用されている。これは使えるリソースに制限があったり、ハードウェアを扱ったり、パフォーマンスを確保するには開発者自身がメモリを管理した方がよいためだが、その一方で安定性を損なう不具合が混入する危険性がある。

生産性が重視されるアプリ開発ではJavaやKotlinなどのマネージド言語が有利。しかし、OSのコアなど低レベル開発では以前C/C++言語が有利だ

 実際、同社によるとメモリ安全性に関わる不具合はOS安定性に関わる問題の最大の原因となっており、Androidで深刻度の高いセキュリティ脆弱性の約70%を占めているという。当然、Googleもさまざまな防止策や対応策を講じているものの、なかなか減らせないでいるのが実情だ。とくに複雑でマルチスレッドなコードベースでは、メモリ管理で間違いが起きやすくなる。

 そこで最近注目されているのが、Rust言語だ。Rustは所有権や借用といった概念を導入し、コンパイル時にオブジェクトライフサイクルの管理を開発者に強制する。概念の学習に少しコストがかかったり、コンパイラーの厳格なチェックに悩まされることはあるものの、C/C++と同等の実行速度を確保しつつ、メモリの安全性を保障できるのが魅力だ。

 もちろん、C/C++言語にもサンドボックス化や不具合の検出技術といった対策がいくつかある。

 サンドボックス化は、外部からデータを受け取る処理を他の処理から隔離して、万が一問題が発生しても影響が及ばないようにする技術だ。C/C++言語にはメモリ安全性の保障がないため、もしメモリが壊れても他に影響が及ばないような隔離設計(サンドボックス)が必要となる。実際、Androidのプロセスはすべてサンドボックス化されており、セキュリティの面でも一定の効果が得られている。

 しかし、一般的にサンドボックス化を行うとリソース消費が増えたり、レイテンシ(遅延)が長くなるなどのコストがかかる。また、サンドボックス化は脆弱性の影響を最小限にするものであって、脆弱性をコードから排除するものではない。そのため、複数の脆弱性を連鎖させた攻撃により、その効果が低くなってしまうこともある。

 一方、テストやサニタイズ、ファジングといった不具合検出技術は、ソフトウェアの品質を向上させるために非常に重要だ。しかし、不具合を検出するためにはその状態を発生させなければならない。また、検出技術がカバーできる範囲には限りがあるので、かならずしも不具合を検出できるとは限らない。

 加えて、不具合は検出するよりも修正する方が困難で、長い時間とコストがかかる。複雑なC/C++コードベースの場合、修正プログラムの開発とレビューができる人がわずかしかいないことも少なくなく、修正に多くの労力をつぎ込んでも、パッチが正しくない場合もある。

 その点、Rustはメモリセーフな言語であるため、メモリが壊れること自体をあまり心配しなくて済む。これはサンドボックスの有効性を高めるだけでなく、サンドボックスの必要性を減らし、リソースを節約することにもつながる。不具合の検出と修正に力を入れるよりも、不具合を予防することに注力する方が効率的だ。

 とはいえ、既存のC/C++言語のコードベースは膨大なので、それをすべてRustに置き換えることは現実的ではない。しかし、同社によると、メモリバグのほとんどは最近追加されたり、修正された新しいコードで発生しているという(約50%は1年未満のもの)。古いコードは不具合が出尽くしているため、むしろ安全なのだ。そのため、新しい部分からRustの活用を進めるのは理にかなっているといえるだろう。

Androidで発見されたメモリ安全性バグの“年齢”。半数は1年未満に追加・修正された部分が占める

 Androidプラットフォームに新しい言語を追加するのは大変な作業で、ツールチェーンや依存関係の維持、テストインフラやツールのアップデート、開発者のトレーニングなどが必要となるが、同社はこの18カ月の間、Android オープンソース プロジェクト(AOSP)にRust対応を追加する取り組みを行ってきたとのこと。Microsoftの「Rust/WinRT」「Dropbox」の新しい同期エンジン「Nucleus」などでもRust言語を採用する動きは広まりつつあるが、こうした流れは今後も続くとみられる。