ニュース

Rustの採用が進んだ「Android 13」、メモリ破壊バグは減少、脆弱性の深刻度も低下傾向

2022年はメモリ安全性の脆弱性がAndroidの脆弱性の大部分を占めない最初の年に

公式ブログ「Google Online Security Blog」

 ここ10年以上にわたり、製品や業界全体の脆弱性において常に半数以上を占めてきたのは「メモリ安全性」(Memory Safety)にかかわる欠陥だ。メモリ安全性を損なう脆弱性はさまざまだが、本来アクセスできないはずのデータを読んだり、実行できてしまうため、比較的影響の大きい脆弱性につながることで共通している。

 そこでGoogleは、メモリセーフなプログラミングとしてRust言語をAndroid OSの開発に採用する方針を以前から表明している。同社は12月1日(現地時間)、公式ブログ「Google Online Security Blog」でその状況と成果の一部を明らかにした。

新規コードでRustの採用が進む

 Googleは、Androidへ新規に追加するコードでRust言語の採用を進めている。これはメモリバグのほとんどは最近追加されたり、修正された新しいコードで発生しているという事実があるからだ。

 もちろん、メモリセーフではないC/C++言語で書かれた資産が多すぎ、今すぐ置き換えを図るのは現実的ではないということもあるが、新規に起こされるコードをメモリセーフなプログラミング言語で実装すれば、理論上は新しいメモリ破損バグを未然に防止できる。

Androidへ新規に追加するコードでRust言語の採用が進む

 今年リリースされた「Android 13」は、新規コードの多くをRust、Java、Kotlinといったメモリセーフなプログラミング言語で記述している。そのため、新しいコードの大半をメモリセーフなプログラミングにした最初のバージョンになった。

「Android 13」は新しいコードの大半をメモリセーフなプログラミングにした最初のバージョンに

 それでも、ネイティブコード(C/C++/Rust)だけでいえば、Rustの採用はまだ約21%にとどまっている。同社はC/C++に関しても、メモリ安全性を高めるためのチェックツールに投資していくとしている。

Androidではメモリ安全性にかかわる脆弱性が漸減

 毎月公表されているAndroidのセキュリティ情報によると、過去数年のリリースでメモリ安全性にかかわる脆弱性の件数は大幅に減少している。たとえば、2019年のメモリ安全性にかかわる脆弱性は223件だったが、2022年は85件だ。2022年は、メモリ安全性の脆弱性がAndroidの脆弱性の大部分を占めていない最初の年となった。

 相関関係は必ずしも因果関係を意味しないが、メモリ安全性にかかわる脆弱性の減少がメモリセーフ言語の採用拡大と軌を一にしているのは興味深い結果であるといえるだろう。

メモリ安全性にかかわる脆弱性は漸減

 そして重要なのは、現在までのところ、AndroidのRustコードで発見されたメモリ安全性の脆弱性はゼロだということだ。Rustコードにも非Rustコードと対話するために安全ではない部分があり、追加で精査しなければならないこともあるが、純粋なC/C ++実装よりもはるかに安全であるという。

 また、Rustのメモリ安全性はパフォーマンスの向上にも寄与している。メモリセーフでないプログラミング言語を安全に運用しようとすると、サンドボックス機構、サニタイズ処理、ランタイムによる脆弱性軽減、ハードウェア保護の追加などを行う必要があり、だんだんとパフォーマンスが損なわれていく。その点、Rustはパフォーマンスと安全性を少ない犠牲で両立できる。

脆弱性の深刻度は低下傾向

 しかし、メモリ安全性にかかわる脆弱性が減少しているにもかかわらず、セキュリティ情報で報告される脆弱性の件数はそれほど変化がない。それはなぜなのだろうか。

 その原因は不明だが、Androidの脆弱性には報奨金がかけられており、セキュリティ研究者はそれに見合う時間を脆弱性の発見に費やしている。そのため、発見される脆弱性の総数は、研究者が調査に費やす時間におおよそ比例すると考えられる。

 同社によると、メモリ安全性にかかわる脆弱性が減った代わりに、そのほかのタイプの脆弱性の報告が増えているとのことだが、このことはメモリ安全性にかかわる脆弱性が見つかりにくくなったため、研究者が他のタイプ脆弱性を見つけることにリソースを集中していることを示唆している。

 そのためもあり、全体として、脆弱性の深刻度は低下の傾向にあるようだ。

脆弱性の深刻度は低下の傾向にある

 Androidの既存コードのほとんどはC/C++だが、開発者やアプリがアクセスするAPIはJavaで実装されており、メモリ破壊バグの影響を受けない。そのため、今後はJavaコードのロジック部分にある脆弱性が指摘されることが増えるかもしれないが、それらの深刻度は比較的低い。

 同社は今後、そうしたタイプの脆弱性に対しても、Rustの豊富な型システムが防止に役立たないか調査をしていくという。また、ネイティブコードが必要な部分でRustの採用を一層進めていくとのこと。「Linux 6.1」でRustのサポートが開始され、カーネルドライバーから採用が進んでいく点にも注目しているようだ。