P-07AでもJavaScriptが再開され、あらたな制限がみつかった

i-mode2.0は前途多難 - ockeghem(徳丸浩)の日記にて報告したように、ドコモのiモードブラウザ2.0のJavaScript機能が5/28に停止されていたが、本日ケータイアップデートが準備されたので、深夜3時まで待たずに即座にアップデートを実行した。そして、JavaScriptが復活していることを確認した。
iモードブラウザ2.0のJavaScript « mpw.jp管理人のBlogで報告されているように、alert関数や、setRequestHeaderメソッドが無効化されていることを確認した。関数自体は削除されていないのだが、実行しても何もおこらない状態になっている。alertを無効化した理由は理解に苦しむが、setRequestHeaderを無効化したのは、携帯JavaScriptとXSSの組み合わせによる「かんたんログイン」なりすましの可能性で指摘したような危険性を避けるためかもしれない。だが、setRequestHeaderを無効化したことで、あらたなリスクが生じるのだがそれについては稿を改めて報告したい。
JavaScriptの機能制限はそれだけではないようだ。現在忙しいので網羅的な調査はできないが、現時点で気づいた点として、XMLHttpRequestがSame origin Policyすなわちドメインの制約を受けるだけでなく、ディレクトリの制約も受けるようだ。具体的には、XMLHttpRequestが記述されたコンテンツのディレクトリと同じか、そのサブディレクトリのデータのみ読み込める。ディレクトリをさかのぼるようなリクエストはエラーになる。
私がこの現象に気づいたのは、以下のようなテストをしていてのことだ。http://example.jp/i/5.html (ホスト名は仮のもの)からhttp://example.jp/cgi-bin/dump.cgi を呼び出して、HTTPリクエストヘッダを調べようとしていたが、リクエストが発行されていない。試行錯誤の結果、同じコンテンツをhttp://example.jp/6.htmlに配置したら呼び出すことができた。また、http://example.jp/i/5.htmlからhttp://example.jp/i/test.txt は呼び出すことができた。
上記の実験から、P-07Aの(恐らくは、iモードブラウザ2.0の)XMLHttpRequestは、ディレクトリの制限が掛けられており、親ディレクトリにさかのぼるディレクトリは読み込めないと結論づけた。だが、なぜ。
本日公開された「PCでは見えないはず」に頼ることの危険性 (1/3):再考・ケータイWebのセキュリティ(1) - @ITの2ページ目で、私は次のように書いた。

ケータイブラウザではHTMLソースを表示できないことを理由として、ケータイWebは、PC用の一般サイトよりも安全性が高いと思っている方がいますが、これは誤解であり【中略】その理由は、本来見えないはずのHTMLソースが閲覧できる場合があるからです。
【中略】
このほか、クロスサイトスクリプティングXSS脆弱性が当該サイトに存在すると、HTMLソースの一部あるいは全部が閲覧される可能性があります。特に、ケータイのJavaScriptが利用できるようになると、サイトの1個所でもXSS脆弱性があれば、任意のページのHTMLを閲覧できるようになります。

http://www.atmarkit.co.jp/fsecurity/rensai/keitaiweb01/keitaiweb02.html

上記は、通常のJavaScriptでは正しい指摘なのだが、本日分かったiモードブラウザ2.0の新たな制約により、少し訂正が必要となった。「任意のページ」のHTMLではなく、「XSSの存在するページのディレクトリとサブディレクトリ」のHTMLのみが読み込める。
しかし、これがiモードブラウザ2.0にて、XMLHttpRequestディレクトリ制限がかけられた理由かどうかは分からない。
先に紹介した「PCでは見えないはず」に頼ることの危険性 (1/3):再考・ケータイWebのセキュリティ(1) - @ITにも書いたように、ケータイWebの安全性は、クローズドなネットワークと携帯端末の機能制限に依存している部分がかなりある。だから、JavaScriptにも制限を掛けざるを得ないというのは理解できることだ。だが、その制限の範囲や方法には疑問があるし、どのような制限を掛けたかは、NTTドコモのサイトには掲載されていないようだ。これはサイト開発者にとっては不便だろう。私自身、XMLHttpRequestの非常に簡単なサンプルが動かなくて首をひねった。制限はある程度やむを得ないとして、NTTドコモには、もっと情報公開をしていただきたいと希望する。

追記(2009/11/18)

try〜catchで「親ディレクトリをGETした際のエラー」を捕捉すると、「Error: operation is inhibited」となりますので、やはり明確に禁止されているとみるべきでしょう。
また、KCCSにて「ケータイWebセキュリティ対策セミナー」を開催しておりますので、上記のような話も含めた最新の話題を提供したいと思います。あいにく3回のうち、1回目は終了、2回目は明日で申し込みは締め切っておりますが、第3回は12月10日(木) ですので、興味のある方はお申し込み下さい