ガジェットは小物か?
ガジェットやウィジェットという言葉を聞いたことがあるでしょうか。デスクトップやWebに表示された時計やカレンダーのような小さなソフトウェアのことです。大規模なことを行うソフトウェアではなく、かゆい所に手が届く小物といった位置づけです。HTMLやJavaScriptを使って作られるため、開発もインストールも容易であることが広まった理由だと思います。元々は、「Window + Gadget = Widget」という関係にあったようですが、現在はどちらも同じ意味で使われることが多くなっています。そのため、この記事でも同じ意味として用いることにします。
Windows VistaではWindowsサイドバーという名称でデフォルトでインストールされています。図1の画面右側に表示されているのがサイドバーで、1つ1つのパーツをガジェットと呼びます。
さて、HTMLやJavaScriptを用いて開発されるということは、Web関連の脆弱性が存在する可能性があります。その証拠に、Googleデスクトップのサイドバーにガジェットを追加する際には図2のような警告が表示されます。
これは何かセキュリティ上の問題を含んでいそうです。では、デスクトップに設置するガジェットには具体的にどのような危険があるかを考えていきます。
ガジェットのセキュリティを考えるポイント
Same-Originポリシーは機能しているか
Same-Originポリシーが破られた場合の被害については第2回で説明しましたが、ガジェット内でサイトをまたがってページ遷移を行うことは稀です。他のサイトにログインしていなければ、ログイン後のページの情報を盗まれることはありません。しかし、次の「Cookie情報は引き継がれるか」と併せて考えることで、クロスドメインアクセスによりセキュリティ侵害が発生するケースがあります。
Cookie情報は引き継がれるか
Webブラウザでサイトを閲覧した際に保存されているCookieをガジェットからも送るようになっていた場合、スクリプトを使用してクロスドメインアクセスを行うことにより、被害者しか見ることができないはずの機密情報を提供するページの内容を攻撃者が取得することができます。
どのOrigin(ドメイン)に属するか
マイコンピュータのドメインに属する場合には、スクリプトを使用してローカルコンピュータのファイルにアクセスすることが可能になります。
どのセキュリティゾーンに属するか
マイコンピュータのセキュリティゾーンに属するアプリケーションであった場合、セキュリティ設定はインターネットゾーンに比べてデフォルトで低くなっています。そのため、どのセキュリティゾーンに属するかについて気を配る必要があります。ちなみに、Internet Explorerのインターネットオプションにはマイコンピュータのセキュリティゾーンは表示されませんが、レジストリを参照することで、設定を確認することができます(※)。
また、マイコンピュータのセキュリティゾーンに属する場合には、「ドメイン間でのデータソースのアクセス」がデフォルトで有効になっています。これはクロスドメインアクセスが可能であることを意味し、Same-Originポリシーが機能しないことになります。
どのような追加機能があるか
ガジェットによっては追加の機能が用意されているものがあります。たとえばCPUやメモリの状態を取得するAPIが用意されています。中にはJavaScriptから任意のコマンドを実行できるものまであります。
実際のケース
それではいくつかのガジェットでは実際にどのようになっているかを紹介します。なお、動作検証を行ったOSは、WindowsサイドバーについてはWindows Vista、それ以外はWindows XPです。
Windows Vistaのサイドバー
ローカルのファイルへのアクセスが可能です。さらにどのセキュリティゾーンにも属さず、確認ダイアログ無しでActiveXの実行が可能ですので、任意のコマンドを実行することが可能です。また、ActiveXを使用せずともSystem.Shell.execute()というAPIで任意のコマンドを実行可能です。
Internet Explorerのセキュリティ設定は引き継がれず、非常に制限の緩い状態で実行されます。ガジェットはマイコンピュータゾーンに属すると思われがちですが、実際はどのセキュリティゾーンにも属していません。Cookie情報はInternet Explorerのものを引き継ぎません。
Googleサイドバー(バージョン:Google デスクトップ 5.1.0709.19590-ja-pb)
XMLHttpRequestオブジェクトを使用してローカルファイルへのアクセスが可能です。任意のコマンドを実行するためのAPIは用意されていませんが、ActiveXを用いることで任意のコマンドを実行することが可能です。CookieはInternet ExplorerのCookieの中で有効期限が「セッション限り」でないものであれば送られます。そのため、セッション限りでないCookieをセッションとして使用しているサイトの情報が盗まれる可能性があります。
Yahoo!ウィジェット(バージョン:4.0.6)
XMLHttpRequestオブジェクトからはローカルファイルへアクセスすることはできませんが、追加のAPIが用意されており、そのAPIを利用することでローカルファイルへアクセスすることが可能です。また、runCommand()というAPIも用意されており任意のコマンドを実行することが可能です。なお、CookieはInternet Explorerのものを使用しません。
Opera Widgets(バージョン:Opera 9.24)
XMLHttpRequestオブジェクトからはローカルファイルへアクセスすることはできません。CookieはOpera Webブラウザのものを使用しません。
足並みの揃わないセキュリティモデル
このように、ローカルファイルへのアクセス、任意のコマンド実行、Cookieの扱い等の観点で見てセキュリティの実装はガジェットによってばらばらな状態です。非常に緩いセキュリティ設定になっているガジェットもあります。各社独自に開発を進めており、セキュリティモデルに統一見解が存在しないのがその原因でしょう。
ガジェットは実行ファイルと同等
ガジェットを登録することはEXE形式の実行ファイルをインストールするのと同じだと考えてください。違いといえば、HTMLやJavaScriptで記述されたガジェットの場合はソースコードを読むことで、動作を把握することができるのに対して、EXE形式の実行ファイルはリバースエンジニアリングを行っても、難読化の技術が進んでおり正確に動作を把握することは難しい状況にあるということです。しかしながらガジェットでも、規模が大きくなるとソースコードを読んで動作を把握することは難しくなります。そのため、実行ファイルをインストールするのと同じだと考えておいたほうがよいでしょう。セキュリティを考えると決して小物ではありません。サイドバーの中には何の警告も無くガジェットを登録してしまうものがありますが、ユーザは十分に注意するべきです。