Jun 27, 2006

署名されていないスクリプトで各種の特権を取得する方法

JavaScriptで危険な事や妙ちきりんな事をしてみたい人のための覚え書き。一般的なユーザの立場の人はあんまり見ない方がいい話。興味本位で触ると痛い目を見かねない話。

JavaScriptで親ウィンドウや最後のウィンドウを閉じようとしたり、他のドメインへの通信、XPConnectなどなど危険な操作をしようとすると、Firefoxではエラーになる。これはFirefoxに備わった最も基本的なセキュリティ機構の一つだ。

拡張機能やFirefox自身のコードもJavaScriptだけれども、これらはChrome URLでアクセスされる登録済みのスクリプトなので、特別に権限が与えられている。そのため、上記のような操作を何の制限もなしに行える。

登録されていないリソースでは、その都度「これこれこういう操作を行っても良いですか?」とユーザにお伺いを立てて(特権を取得して)からでないと、上記のような操作ができない。そのお伺いを立てるのが、netscape.security.PrivilegeManager.enablePrivilege()というコードだ。

このコード、file://といったFile URLで読み込むリソース(つまりローカルファイル)では動くのだけれども、いつの頃からかhttp://といったURIでアクセスするようなリソースでは使えなくなってしまった。これはセキュリティ向上のために施された変更によるものらしい。

署名されたスクリプトと特権についてのmozilla.orgの技術文書(2006.6.27現在では英語版のみ)によれば、先のような特権の取得を求めるコードは、現在は電子署名済みのスクリプトでしか利用できなくなったそうな。しかし、Codebase Principal(s)といういくらか弱いセキュリティ機構を使うことによって、署名されていないリモートのスクリプトでも特権を取得できるようになるらしい。

やりかたはというと、隠し設定の「signed.applets.codebase_principal_support」の値を「true」にするだけ(デフォルトでは「false」)。これでCodebase Principalが有効になる。

ただし言うまでもないけれども、リモートのあらゆるスクリプトで特権を取得できるようにするということは、悪意ある攻撃者が用意した罠についうっかりで引っかかってしまう危険性を高めてしまう。ましてや、ウザいからって「以後確認しない」チェックボックスをチェックしてしまうなんてのは問題外なわけで。

まあ、一つの非常手段といったところ。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能