|
||
このブログが何かの役に立ちましたら → はてなポイントを送る / Amazon wishlist
jQueryのマイナーバージョンアップがリリースされて取り敢えずバージョンアップしましょう、みたいになる状況を想定してたんだけど1ヶ月以上経ってしまったのでブログに書きます。twitterなどでちょくちょく書いていたので知っている人は知っていると思いますが、jQueryにXSSを誘発しやすい問題があります。
これは簡潔に書くと、$() 関数がCSSセレクタとして動作することを意図して書かれたコードが、タグ生成として機能する問題です。前提知識としてjQueryの$()関数には複数の機能があり、$("#id")はCSSセレクタとして機能し、$("<p>")はHTMLを生成します、また$(function(){...})はDOMReadyです。$()関数がタグを生成した際に、表示中のDOMツリーに挿入されていなくても、img src=dummy onerror=... といった形式で任意のJavaScriptコードを実行することが出来ます。
そのため
全てのWebサイトやjQueryを使ったライブラリにはXSS脆弱性があります。ちなみに第一発見者は自分ではなくて@t_ashulaさんです。
もちろん $() や $(element).html() でタグを意図的に生成している場合には、ユーザー入力値がそのまま出力されないか責任を持たないといけない。
典型的には$(location.hash)がこれに該当します。なぜこういう実装が多いのかというと、location.hashは#で始まるため「idセレクタとして機能するだろう、もしユーザーが適当な値を入力しても指定したHTML要素が見つからなくてエラーが起きるだけだろう」と考えているためだと思われます。$("#tab_" + location.hash.substring(1) ) というようなケースもアウトです。
機能的な傾向で言うと、location.hash で「タブ切り替え」や「指定要素へのスクロール」「指定した要素の強調表示、デザイン変更」を実装しているコードの多くに問題があります。ブラウザのXSSフィルタは検知しませんし、また、URLの#以降はサーバーサイドのアクセスログに残らないので悪用されたことを検知しづらいという問題もあります。
Google Code Searchなどを使って問題のある実装を多く見つけることが出来ます。自分が関わっているサービスや、いくつかの超有名なサイトでも同様のXSSがありました。
バグではなく仕様、と見なすことも出来ますが、jQueryの設計思想に起因する問題であることは確かです。$() が万能な関数であり、$(String) の挙動が文字列の内容によって変わるため、意図しない挙動が起こる可能性があります。jQueryを使ってるサイトが全て影響を受けるわけではありませんが、ユーザーがこの問題を知らなかった場合に、意図せずに危険なコードを書いてしまう可能性が非常に高いです。いくつかのライブラリ(jQuery pluginと呼ばれるもの)には明確にバグがあります。
なんか進展があったら適当に追記する