2007-07-12 [長年日記]

IEとFirefoxをインストールしている人は要注意--「非常に重大」なセキュリティリスク

日本語が無茶苦茶で意味不明だったので少し調べてみました。

Firefox 2.0.2以降ではfirefoxurlというURLハンドラがレジストリに登録されています。関連付けられているコマンドは「C:\PROGRA~1\MOZILL~1\FIREFOX.EXE -url "%1" -requestPending」で、実際に起動されるときには%1の部分がURLに置き換えられます。このとき、URLが「"」を含んでいると任意のコマンドラインパラメータをFirefoxに渡せてしまいます。Firefoxには-chromeという、指定されたJavaScriptを信頼された環境で実行するコマンドラインオプションがあるため、結果的に任意のJavaScriptを走らせることができ、さらにそこから任意のコマンドを実行することもできる、というのがそもそもの話です。

実際に適当なURLハンドラを登録して実験してみると、確かに指定した文字列が渡されてきます。例えば、testhandlerというハンドラに「testhandler.exe "%1"」を登録して、「testhandler:foo" "bar」というURLを起動するとtesthandler.exeの引数には「"testhandler:foo" "bar"」が渡ってきます。

ところが、mailtoハンドラに同様な関連付けをして、「mailto:foo" "bar」というURLを起動すると、引数は「mailto:foo%22%20%22bar」が渡ってきます。どうやら既知のURLスキーマに関しては、URLとして許されない文字にはURLエスケープが施されるようです。

どうやら世間ではこの問題はIEのバグとして認識されているようですが、そもそもIEじゃなくてshell32.dllの問題だろうというツッコミはおいておいたとしても、IE側の問題と言い切るには難しいところがあるように感じられます。

Unixのシェルによるコマンドラインの処理のようにコマンドライン引数のエスケープ処理に明確な基準があれば、素直に「%1は""に囲まれているものとしてエスケープされます」という仕様にすれば良さそうですが、残念ながらWindowsでは引数のエスケープはアプリケーションによってばらばらなので、この方法は無理そうです。

mailto URLと同様に、全てのスキーマでURLとして許されない文字にはURLエスケープを施す、というのが呼び出し側からの対処方法としては妥当に思えます。ただし、URLエンコーディングを解釈しないアプリケーションが動かなくなってしまいます。

逆に呼び出される側(今回の場合はFirefox)としては、URLハンドラに登録するコマンドでは引数はURLを指定するものだけに絞り、その引数が指定された場合には他の引数(少なくともURLの後に現れた引数)は全て無視する、もしくは他の引数が指定されたらエラーにする、という基準を持てばより安全になるのではないでしょうか。

[]

トップ «前の日記(2007-06-30) 最新 次の日記(2007-08-01)»