フェンリル

Developer's Blog

ブラウザのセキュリティを高めるサンドボックスについて

こんにちは。開発担当の森本です。

今回は、Sleipnir 3 for Windows の webkit エンジンでも使用されているサンドボックスについてお話しします。

Web 上にあるデータは危険かもしれない

Web の発展と共にブラウザで表示できるものは、どんどん複雑になってきています。
それに伴って、ブラウザのセキュリティを破る方法も多種多様になってきているのが現状です。

そもそも、(trident を除いて)ブラウザのエンジン部分のソースは公開されており、攻撃者は防御側に比べると比較的優位にあります。
さらに、開発にかけられるコストが有限である以上、セキュリティホールが全くない状態を維持することは現実的ではありません。

私たちは危険かもしれない状態のブラウザを使い続けないといけないのでしょうか?

破られても重要な部分にアクセスできなければ OK

「セキュリティを破る」を言い換えると、「通常ではアクセスできない重要な部分に無理矢理アクセスする」となります。
これを踏まえて、原理的に「通常ではアクセスできない重要な部分に無理矢理アクセス」できなくすれば良い、と考えるのはどうでしょうか?
そもそもブラウザが「重要な部分にアクセス」できないならば、セキュリティホールを攻撃されても被害は最小限で済みます。

サンドボックスとは、その名のネットワークを経由して外に繋がっている部分から PC 側へアクセスできない様に囲い込む手法で、上記の方法を実現する有力な方法と言えます。

Sleipnir 3 for Windows でも使用されている実装の説明は、
ここ
(英語です) などにあります。

そして、この実装がトリッキーではあるものの、非常に興味深い方法で実現されているので、今回は紹介をしてみました。

サンドボックス のつくりかた

簡単に動きを解説すると、下記の様になります。
1. exe を実行すると、監視プロセスが起動する。
2. CreateProcessAsUser API を使用して、ブラウザのプロセスを何の権限もない状態で起動する。
3. API Hook を行い、ブラウザのプロセスの API を自前のものに置き換える。
4. SetThreadToken API で、ブラウザのプロセス権限を普通に戻す。

この後、ブラウザのプロセスで、ファイルやレジストリなどにアクセスしようとすると、自前ルーチンが呼び出されます。
このルーチンは監視プロセスにお伺いを立て、許可してもらえた場合、API Hook が解除され本来の API を呼び出すような作りになっています。

この方法はシンプルですが、とても良くできているように思います。

まず、起動時点で権限が低いため、起動時にウイルス等が悪さをする事を阻止できます。
また、本来の API 自体が書き換えられているため、プロセス内に侵入できても本来の API を呼び出すのは不可能です。
さらに、監視プロセス自体を書き換えてしまうような API の使用も拒否できるので、監視の無効化も難しいでしょう。
ここまでやれば、権限の及ばない情報に対するアクセスはほぼ不可能、と言っていいように思います。

余談ですが CreateProcessAsUser や SetThreadToken などは Windows XP から追加された新しい API で、
正直なところ全く使用したことがなかったのですが、こういう使い方があったのかと感心しきりです。

まとめ

ブラウザだけでなく、ネットワークに少しでも関連するソフトウェア全てがこのような方法でセキュリティを確保する様になれば、
Web からの攻撃も大きく減らせる様に思うので、このような技術がどんどん普及していって欲しいとおもいます。
ここ
にある通り、自分のアプリに導入するのも非常に難しいわけではないので、自信のある方は一度挑戦してみるのも良いかと思います。

このような技術を駆使して、改善され続ける Sleipnir をこれからもよろしくお願いします!

ソーシャルアカウント

Sleipnir の Facebook ページでは、ユーザーの方たちとのコミュニケーションや最新情報の投稿などを行なっています。よろしければいいね!してください!

フェンリルの開発者アカウントでは、フェンリルプロダクトの最新開発情報などをつぶやいています。よろしければフォローしてください!

関連記事

Facebook コメント

コメント

名前(必須)

メールアドレス(必須)

URL

スタイル用のタグが使えます

このコメント欄でのご質問、ご要望には、開発チームから回答できない場合があります。ご質問、ご要望は「User Community」内のフォーラムまでお寄せください。