C言語/C++に変わる言語として近年人気が高まっている「Rust」だが、Googleは2019年から、このRustで書かれたコードをAndroid OSに統合している。そしてこのRustの統合が、Androidの脆弱性の減少に繋がっているとのことだ。
- Google Security Blog: Memory Safe Languages in Android 13
- The Register: Google says Android runs better when covered in Rust
ChromeとAndroidでは、メモリセーフティのバグ(out of bounds read and writeやuse after freeなど)が、深刻度が高いまたは重要なバグの脆弱性の65%以上を占めている。この数字自体は他のベンダーのソフトウェアでも同様で、Androidが特別高いわけではない。これらの欠陥は、早期に発見されないと、セキュリティを低下させ、ソフトウェア開発のコストを増加させる。
だが、AndroidがRustのコードを統合するようになって以降、この数字は減少しているとのことだ。
Google Security Blogの投稿によると、「ここ数年/リリースでメモリセーフティの脆弱性が大幅に減少していることが分かります。2019年から2022年にかけて、メモリ安全性の脆弱性の年間件数は223件から85件に減少しています。」とのことだ。
そして、この減少の理由として、プログラミング言語のシフトが考えられるという。つまり、メモリセーフティが保証されている言語への以降が要因とのことだ。
昨年のAndroid 12から、RustはAndroidプラットフォームの言語となった。そして今年の、Android 13では、リリースで追加された新しいコードの大半が、メモリセーフな言語、つまりRust、Java、Kotlinで書かれていると、Googleはブログで述べている。
Androidに流入するメモリセーフではないコードが減ったことで、2019年にはAndroidの脆弱性の76%を占めていたメモリ安全性の欠陥は、2022年には35%になり、ついにメモリセーフティのバグが脆弱性の過半数を占めない最初の年になったのだ。
その他の脆弱性は長期的に安定しており、過去4年間、毎月約20件の割合で出現している。重大な問題のほとんどをメモリセーフティバグが占めていたため、表面化した脆弱性はそれほど深刻ではない。
こういった、メモリセーフな言語への移行に力を入れているのはGoogleのみではなく、MetaやMicrosoftにも同様な動きが見られるとのことだ。特に数カ月前、MicrosoftのCTOであるMark Russinovich(マーク・ラシノビッチ)氏は、「新しいプロジェクトを始める際には、もはやC/C++を使うべきではなく、ガベージコレクションのない言語が必要なところにはRustを導入すべきである」と述べていた。
では、C/C++の利用を即座に廃止すべきかというと、事はそう単純ではない。C++の生みの親であるBjarne Stroustrup氏は、C++の進化を支援することは、言語を非推奨にして安全でないコードを放置するよりも有益であると考えており、ISO標準のC++でも、静的解析によって型安全性とメモリ安全性を確保できることを指摘し、Russinovich氏の指導に異議を唱えている。
Googleも、「私たちの目標は、既存の C/C++ を Rust に変換することではなく、時間をかけて新しいコードの開発をメモリセーフな言語に移行することなのです。」と述べている。
Google自身も、C/C++の安全性を向上させるツールへの投資を続けており、Android端末における過去数回のリリースでは、Scudoのハード化されたアロケータ、HWASAN、GWP-ASAN、KFENCEを導入している。そして、Googleはファジングの利用を増やしてきたという。しかし、こうした対策がメモリセーフティバグの減少に寄与している一方で、脆弱性減少の大部分はAndroidがメモリアンセーフな言語からメモリセーフな言語への移行を進めていることが大きな要因であると、Googleは考えている。
Android 13では、新しいネイティブコードの約21パーセントがRustで書かれている。これには、Android Open Source Project(AOSP)内の約150万行のRustコードが含まれ、Keystore2、新しいUltra-wideband(UWB)スタック、DNS-over-HTTP3といった、以前であればC++で書かれていたであろうコンポーネントで構成されている。
そして、結果としてRustはメモリセーフティの脆弱性をなくすことを実現しているのだ。Googleはブログの中で、「現在までのところ、AndroidのRustコードで発見されたメモリセーフティの脆弱性はゼロです。この数字が永遠にゼロのままであるとは思いませんが、2つのAndroidリリースにまたがる新しいRustコードの量と、Rustが使用されているセキュリティ上重要なコンポーネントを考えると、これは重要な結果です。」と述べている。
Rust Foundationのエグゼクティブディレクター兼CEOであるRebecca Rumbul氏は、The Registerへの電子メールで、「Rustは、速度とメモリ安全性の組み合わせにより、幅広いプロジェクトに最適な選択肢となります。Rustが既存のプロジェクトや製品にますます統合されるのは当然のことであり、AndroidにおけるRustを論じたGoogleの最近のブログは、そのセキュリティ上の利点を如実に表しています。」と述べている。
Rumbul氏は、さらに、「それらのセキュリティ上の利点は、世界中の政策立案者にも認識されており、ヨーロッパや北米の政府は、過去に経験したセキュリティ問題のいくつかの解決策としてRustを認めています。」と述べている。
また、メモリアンセーフなコードを利用することのデメリットとして、Googleはパフォーマンスの低下を挙げている。「サンドボックス、サニタイザー、ランタイム緩和、ハードウェア保護の追加など、セキュリティとパフォーマンスの間でトレードオフを行う必要があることがよくあります。残念ながら、これらはすべて、コードサイズ、メモリ、およびパフォーマンスに悪影響を及ぼします。」
「AndroidでRustを使用することで、より少ない妥協でセキュリティとシステムの健全性の両方を最適化することができます。例えば、新しい UWB スタックでは、既存のプロセス内で実行することにより、数メガバイトのメモリを節約し、IPC レイテンシを回避することができました。新しい DNS-over-HTTP/3 の実装では、Rust の async/await 機能を使用して、1 つのスレッドで多くのタスクを安全に処理することにより、同じ量の作業を実行するのに少ないスレッドを使用しています。」
コメントを残す