ニュース

「Chrome」からメモリ関連の脆弱性を取り除くには? ~Googleがその取り組みを解説

Mozillaが開発した「Rust」言語に期待

公式ブログ「Google Online Security Blog」

 Webブラウザーのセキュリティは「いたちごっこ」で、攻撃が巧妙になるのに合わせて常に新しい防御策を講じる必要がある。「Google Chrome」ではこれまでにもサンドボックス化やサイトの分離(Site Isolation)を基盤としたマルチプロセスアーキテクチャーを整備するとともに、ファジング(問題を起こしそうなデータを送り、その挙動から不具合を検出するテスト手法)による不具合の洗い出しを精力的に行っている。しかし、これらの手法だけでは限界に達しつつあり、新たな手法が必要とされている。そこで米Googleは9月21日(現地時間)、公式ブログ「Google Online Security Blog」で、「Google Chrome」のメモリ安全性に対する取り組みを明らかにした。

 同社によると、「Chrome」における深刻なセキュリティバグのうち、実に70%以上がメモリ安全性に関わる問題であるという。C/C++言語では確保したメモリをプログラマーが責任をもって扱う必要があるが、プログラムが肥大化・複雑化すると、どうしてもメモリ破損や解放後メモリ利用(use after free)といったミスが生まれてしまう。これらは最悪の場合、任意のコードが実行される脆弱性につながる。

 こうした問題に対処する手段としては、一般に以下の3つが有力とされている。

  1. C++言語の利用を継続し、ポインター(メモリにアクセスする仕組み)が正しく用いられていることをコンパイル(ソースコードからバイナリを構築する)時にチェックする
  2. C++言語の利用を継続し、ポインターが正しいかどうかをバイナリを実行するときに随時チェックする
  3. C++言語の利用を一部であきらめ、メモリセーフ(メモリ安全性を最初から考慮して設計すること)な言語を利用する

 しかし、これらは一長一短だ。

 もっとも理想なのは1番目のコンパイル時チェックだが、残念ながらC++はそのように設計されておらず、完全に行うことはできない。メモリセーフなRust言語で用いられている「借用」という仕組み(borrow checker)をC++言語に導入することも検討されたが、C++言語にはフィットしないと結論付けられている。

 一方、2番目の実行時チェックはパフォーマンス上のペナルティがデメリットだ。それぞれのチェック処理は非常に短い時間で済むが、それも塵が積もれば山となる。とくに非力であったり、消費電力にシビアなモバイルデバイスや組み込みデバイスでは大きな問題となるだろう。

 しかし、現状ではもっとも現実的な選択肢であるのも確かだ。C/C++言語の安全性を高める技術としては「MiraclePtr」などがあり、これは「use after free」バグを50%以上排除できる可能性があるという。

 3番目のメモリセーフ言語を採用する方法は、もっとも大胆で効果的だ。もっとも有力視されるRust言語はコンパイル時チェックでメモリ安全性を保証できるため、速度低下なしに安全性を飛躍的に高めることができる。

 しかし、既存のC++コードはあまりにも大規模なため、すぐにRustで置き換えるのは現実的ではない。そのため、新規に書き起こす部分にRust言語を利用し、既存のC++コードといかに同居させるかが課題となる。「Chromium」のソースコードツリーでは限定的なRustの導入が始まっているが、まだ「Chrome」の製品版には含まれておらず、あくまでも実験的なものにとどまっているという。

 結論としては、短期的には「MiraclePtr」などの技術を導入しながらコンパイル時チェックで対処しつつ、長期的にはRust言語の可能性に期待することになりそうだ。