この日、個人的に興味を引いた発表はHow to win Pwniumでした。PwniumとはGoogleのChromeチームが開催している、ChromeやChrome OSに対するハッキングコンテストで、Pwn2Own同様、成功すると賞金がもらえるというものです。この発表では、Chromeの開発者であるイアン・ビアー氏が、Pwniumで成功するための入り口として、Chromeの設計やブラウザーのサンドボックスの現状、これまでに実際にあった脆弱性の例などを紹介してくれました。
近年ブラウザーのエクスプロイトというと、これまで多かったバッファーオーバーフロー系の脆弱性の攻撃から、「Use-after-free脆弱性」に対する攻撃へと移り変わりつつあります。バッファオーバーフロー系の脆弱性はアプリケーション側での対策が進んだこと、またプラットフォーム側でもそのエクスプロイトを難しくするような機能が盛り込まれていることがその理由だと思われます。
この発表では、Use-after-free脆弱性の攻撃を緩和するためにChromeに実装されている機能の1つが紹介されました。それは「パーティショニング」という機能で、簡単に説明すると同じ型、同じサイズのオブジェクトを特定のメモリ領域からのみ確保するようにする、という機能です。
Use-after-free脆弱性の問題点は、ある型のオブジェクトとして一度確保されたメモリ領域を、別の値で上書きしてしまい、それを元のオブジェクトとして扱ってしまうという問題です。
一般的なC++の実装では、オブジェクトを格納する領域に、そのオブジェクトが呼び出すべきメソッドのアドレスが一緒に格納されています(正確には関数ポインタテーブルへのポインターですが、ここでは概念のみ説明します)。このアドレスの値を別の値で上書されてしまうと、このオブジェクトを利用したときに、本来呼び出すべきアドレスでない場所を呼び出してしまいます。
パーティショニングでは、ある型のオブジェクトとして一度確保されたメモリが、その後も同じ型のオブジェクトとしてのみ確保されるため、仮にこのようなバグがあっても、それを攻撃につなげることが難しくなります。
いまさらながら、アプリケーションレベルでこのような保護機能を実装しているあたり、Chromeはセキュリティに関して非常に高い関心を持って開発されているという印象を受けました。ちなみに、この機能の実装はソースコード上で読むことができます。
イアン・ビアー氏と個人的に話をしたところ、Use-after-free脆弱性は検知も難しく、簡単にはなくせないのが現状のようでした。そして、これまでのバッファオーバーフロー系の脆弱性についても決して収束に向かっているという印象ではないようです。
ブラウザーのような複雑なアプリケーションでは、これらの問題を取り除くのは非常に困難であるという現状です。
Copyright © ITmedia, Inc. All Rights Reserved.