Googleはセキュリティを向上させるためにRustでAndroidの一部を開発中

click fraud protection

Google は、C や C++ と比較して OS 全体のセキュリティを向上させるために、Android の一部を Rust で作成および書き換えています。 さらに詳しく知りたい方は続きをお読みください。

完全な OS ソリューションとしての Android には、多くの可動部分が含まれます。 非常に大まかに言えば、これらの部分はアプリのエコシステム、そして OS 自体です。 開発者として選択するプログラミング言語は、Android のどの部分に取り組んでいるかによって異なります。 アプリ開発者にとって、Java と Kotlin は人気のあるオプションです。 OS とその下位レベルに取り組む開発者にとって、これまでのところ C と C++ が一般的な選択肢となっています。 Android オープンソース プロジェクトが OS 自体の開発に Rust プログラミング言語をサポートするようになったことで、現在、Google は OS 開発者向けに 3 番目のオプションを追加しています。

C および C++ の制限

Android OS の下位レベルでは、C や C++ などのシステム プログラミング言語が必要です。 これらの言語は、開発者に制御性と予測可能性を提供します。これは、低レベルのシステム リソースやハードウェアにアクセスするときに重要です。

残念ながら、C および C++ はメモリの安全性を保証していないため、バグやセキュリティの脆弱性が発生しやすくなっています。 開発者はこれらの言語でメモリの有効期間を管理する責任がありますが、複雑でマルチスレッドのコードベースでは、言うは易く行うは難しです。

C と C++ は合わせて、Android プラットフォーム上で数千万行のコードを構成します。 これらのメモリ安全性のバグは、コードの不正確さの最も対処が難しい原因となり、Android の重大度の高いセキュリティ脆弱性の約 70% を占めています。 これらのバグを修正するだけでは問題に対処するには不十分であり、最初からバグを防ぐことがより良いアプローチとなります。

メモリの安全性が保証されていないため、開発者は厳しく制限された特権のないサンドボックス内で Android プロセスを実行する必要があります。 しかし、サンドボックスはリソースが高価であり、追加のオーバーヘッドを消費し、待ち時間が発生します。 また、サンドボックス化によってコードの脆弱性が完全に排除されるわけではなく、バグ密度が高いため有効性が低下し、さらに攻撃者が複数の脆弱性を連鎖させる可能性があります。

もう 1 つの制限は、C および C++ に固有のものではなく、すべてのメモリ安全性の問題に当てはまりますが、エラー状態を検出するには、インストルメント化されたコード内で実際にトリガーする必要があることです。 そのため、コードのテストが優れていたとしても、実際のバグは検出されないままになる可能性があります。 また、バグが見つかった場合、それを修正するのは別の作業であり、必ずしも正しい修正につながるとは限らない、長くてコストのかかるプロセスが伴います。 したがって、バグ検出の信頼性は低くなり、これらの制限を考慮すると、バグの予防がより良いアプローチとなります。

ここで、Rust のようなメモリセーフな言語への切り替えが登場します。

Rustとその利点

Rust は、オブジェクトの有効期間/所有権を強制するためのコンパイル時チェックと、メモリ アクセスが有効であることを確認するための実行時チェックを組み合わせて使用​​することにより、メモリの安全性を保証します。 この安全性は、C および C++ と同等のパフォーマンスを提供しながら実現されます。 また、Rust はサンドボックスの必要性を減らし、開発者がより安全でリソースを節約できる新機能を導入するためのオーバーヘッドの余地を増やすことができます。

確かにRustには利点がありますが、Android OS全体を一夜にしてRustに切り替えるのは現実的ではありません。 Android のメモリ バグのほとんどは新しいコードまたは最近変更されたコードで発生しており、約 50% は 1 年未満のものであるため、その必要さえないかもしれません。 Google は、メモリセーフ言語への取り組みは、成熟した C および C++ コードを書き直すよりも、新しい開発に重点を置くのが最善であると考えています。

また、Rust はバグの検出に重点を置くのではなく、バグの防止に重点を置いているため、コードの正確性が向上します。 メモリの安全性、データの同時実行性、より表現力豊かな型システム、不変など、いくつかの重要な機能を備えています。 デフォルトでの参照と変数、より安全な整数処理、標準ライブラリでのより適切なエラー処理など もっと。

Android にとって Rust への切り替えは何を意味しますか?

Google は、過去 18 か月間 Android オープンソース プロジェクトに Rust サポートを追加してきたと述べています。 しかし、Android プラットフォームに新しい言語を追加するのは大変な作業です。 一部のツールチェーンと依存関係は維持する必要があり、テスト インフラストラクチャとツールを更新し、開発者をトレーニングする必要があります。

Google には、今後数か月以内に共有する予定の早期導入プロジェクトがいくつかあります。 しかし、そうであっても、Rust サポートをより多くの OS に拡張するには、複数年かかるプロジェクトであることが明らかになりつつあります。

私たちが見る限り、Google はすでにいくつかの場所で Rust を使用しています。 Android の新しい Bluetooth スタック書き換えコード名「」ガベルドルシュ」をRustで書いています。 Android 11 の頃に Gabeldorsche での作業が開始されましたが、まだ使用されていません。 アンドロイドの キーストア 2.0 モジュールは Rust で書かれており、バインダーのユーザースペース部分、Android の IPC ドライバーも同様です。 Androidとは関係ありませんが、 フクシアの新しい ネットスタック もRustで書かれています。

アプリ開発者にとって、この切り替えによって、アプリ開発者としてのアプリの作成方法やフレームワーク API の動作方法は何も変わりません。 このスイッチは、OS の作成方法にのみ影響します。 Android Developer Relations チームのメンバーによると, Googleも現時点ではRust NDKをリリースする予定はありません。 アプリ開発でサポートされる言語は、引き続き Kotlin、Java、C、および C++ になります。