メモリ安全性

メモリ安全性の欠如

メモリ安全性のバグ(ネイティブ プログラミング言語でのメモリ処理のエラー)は、Android コードベースでよくある問題です。重大度が高いセキュリティの脆弱性の 60% 以上と、ユーザーが経験する何百万件ものクラッシュはこれが原因です。

 メモリ安全性のバグは、ユーザー エクスペリエンス、コスト、セキュリティに影響します。
図 1: メモリ安全性のバグと、品質、セキュリティ、コストに与える悪影響

メモリ安全性のバグは、品質と安定性に悪影響を及ぼし、エンドユーザーのデバイスで発生するクラッシュの大部分を占めます。そのため、メモリ安全性のバグの多さは、ユーザー エクスペリエンスの低下に直接関係します。
C、C++、アセンブリなど、メモリ安全でない言語で記述されたネイティブ コードは、Android プラットフォーム コードの 70% 以上を占め、Play ストア アプリの約 50% に存在します。
コードの複雑さが増していることを考えると、メモリ安全性のバグはこのまま放置しておくと徐々に増えていきます。そのため、このようなバグを検出して軽減できるツールやテクノロジーをエコシステムに提供することは、長期的な成功に不可欠です。
ここ数年、Google はハードウェア パートナーと緊密に連携して、Arm Memory Tagging などのハードウェア テクノロジーを開発し、Android コードベースに Rust を導入してきました。
こうしたテクノロジーは、メモリ安全性への Google の取り組みを加速させ、ソフトウェア業界がさらに幅広く重要な問題領域に対処する後押しとなります。

メモリ安全性のバグは品質に悪影響を与える

潜在的なメモリ安全性のバグは、システムの状態に応じて、非決定的な結果を引き起こすことがあります。この予測不可能な動作がクラッシュにつながり、ユーザーに迷惑をかけることになります。

毎日、エンドユーザーのデバイスから何百万ものネイティブ クラッシュが確認されています。Google は GWP-ASan を導入することで、その大半がメモリ安全性のバグによるものであることを突き止めました。
このデータポイントはメモリ安全性のバグの多さと品質の相関を示しており、Chrome の同僚が確認した内容と一致しています(Chrome の GWP-ASan バグ ホットリストをご覧ください)。

メモリ安全性のバグはセキュリティに悪影響を与える

メモリ安全性のバグは、Android の最初のリリースまで遡っても、常に Android のセキュリティ脆弱性の最大要因となっています。

メモリ安全性のバグはセキュリティに悪影響を与えます。
図 2: Android の脆弱性の要因となるメモリ安全性のバグ

これが Android だけの問題ではないということは救いですが(ChromeMicrosoft の統計をご覧ください)、ユーザーの安全のためにさらに取り組む必要があります。
Google の Project Zero チームは、ユーザーに対する実際の攻撃で使用されたゼロデイ エクスプロイトを、ゼロデイ脆弱性として追跡しています。これらは仮説のバグではなく、ユーザーに対する攻撃で盛んに悪用されている弱点です。メモリ安全性のバグ(メモリ破損、解放後の使用)が圧倒的に大きな割合を占めています。

メモリ安全性のバグはコストを増やす

セキュリティに関する修正でデバイスを最新の状態に保つことで、ユーザーの安全を維持できますが、エコシステムに金銭的なコストが発生します。

メモリ安全性のバグは、カスタム変更の多い低レベルのベンダーコードに集中しているため、修正とテストのコストが大幅に増加します。ただし、開発サイクルの早い段階でバグを検出することで、このようなコストは削減できます。

調査によると、バグを早期に検出することでコストを最大 6 倍削減できます。ただし、エコシステムの複雑さ、ベンダーが管理するコードベースの平均数、ソフトウェアの複雑化を考えると、コストをさらに削減できる可能性があります。

メモリ安全性

Android 12 以降、Android コードベースにおけるメモリ安全性のバグを減らすために、体系的な変更が行われています。Google は Android のメモリ安全性ツールを拡張し、エコシステムがこのカテゴリのバグに対処することを奨励する新しい要件を導入しています。これはユーザーにとっては品質とセキュリティの向上につながり、ベンダーにとってはコスト削減につながります。

メモリ安全性は今後数年間で品質とセキュリティの差別化要因になる可能性が高く、Android がそれをリードしていく予定です。

メモリ安全性をサポートするための要件

Android 互換性定義ドキュメント(CDD)では、開発時にメモリ安全性ツールを使用することが強く推奨されています。
Google は、メモリ安全性ツールの利用を増やし、継続的インテグレーション プロセスとテストプロセスに統合するために、エコシステムと緊密に連携しています。
いずれ、メモリ安全性ツールを使用して、各デバイスが完全な互換性テストスイート(CTS)の実行に合格し、そのようなバグは見つからなかったということを示すようにしたいと考えています。たとえば、Arm v9 プラットフォームでは Memory Tagging を有効にして CTS を実行する必要がありますが、Arm v8 プラットフォームでは、HWASAN と KASAN を使用して CTS を実行する必要があります。

プラットフォーム コード用の新しいプログラミング言語としての Rust

Android 12 では、プラットフォーム言語として Rust を導入しました。Rust は、C / C++ のようなパフォーマンス レベルでメモリとスレッドの安全性を提供します。ほとんどの新しいネイティブ プロジェクトで Rust を使用することをおすすめします。しかし、現在 Android プラットフォーム コードの 70% 以上を占めるメモリ安全でないコードをすべて Rust に置き換えることは、現実的ではありません。今後、Rust はメモリ安全性ツールの補完となります。

メモリ安全性ツール

Android は、メモリ安全性のバグを検出するために役立つさまざまなツールをサポートしています。利用可能な Android のメモリ安全性ツールの分類は下図のとおりです。

メモリ安全性のバグはセキュリティに悪影響を与えます。
図 3: Android のメモリ安全性ツールの状況

Google のツールは、さまざまなデプロイ シナリオとターゲットをカバーしています。以降のドキュメントで各ツールについて説明し、お客様のプロダクトで使用するためのリファレンスを提供します。