Hatena::ブログ(Diary)

葉っぱ日記 このページをアンテナに追加

2013-02-06

[] GoogleのJSON(モドキ)の先頭にwhile(1); がつく理由  GoogleのJSON(モドキ)の先頭にwhile(1); がつく理由を含むブックマーク

これはクロスサイト・リクエスト・フォージェリ対策。

違うよ!全然違うよ!

攻撃者の作成した罠ページにてJSONを<script src="target.json">みたいに読み込んで、ゴニョゴニョやることでJSON内の機密情報に攻撃者がアクセス可能というのは合ってるけど、それを「クロスサイト・リクエスト・フォージェリ」とは言わない。無理に何か名前をつけて呼ぶとすれば、「JSON Hijacking」という俗称や、あるいは単純にクロスサイトでの情報漏えい、程度ですかね。

ちなみに、ArrayコンストラクタやObjectでのアクセサを定義してJSONをJSとして読み込んで内部にアクセスする手法は、現在のところ公にされているところでは古いAndroid端末でのみ有効で、それ以外では通用しません。

このあたりの対策は

が非常によくまとまってます。

個人的には、while(1); にしろ、for(;;); にしろ、バッドノウハウすぎるのでこういう方法は他に方法がない場合やそれが引き起こす副作用*1を把握した上で覚悟して使うべき。こんなバッドノウハウ、ふつうの開発者は覚えておく必要ないです。


あと、ついでに書いておくと

悪意のあるサイトからはsame-origin policyでAjaxではアクセスできないが

これも、Ajaxから読めない理由として、いまどきはSOPで制約を受けるのではなく、CORSの仕組みに基づいて読める範囲が決まるからです。

※ malaさんにわかりにくいんじゃボケと言われてる感じなのでちょっと修正。

*1:JSON提供側はこれで盗み見を抑えられるけど、ユーザー側はブラクラになるかもしれない

yuku_tyuku_t 2013/02/06 17:45 Qiitaの元記事を投稿したものです。一点質問させてください。

僕自身もCSRF対策というのに最初違和感があって、ちょっと調べたんですが、結論としてCSRFは「悪意あるページからサイトをまたいで不正なリクエストを送る攻撃の総称」なのかなという結論に達してCSRF対策とそのまま書いたんです。
実際クロスサイト・リクエスト・フォージェリて日本語訳すると「サイトをまたいだリクエスト偽装」じゃないですか。

教えて頂きたいのですが、一般的にCSRFはリクエストをPOSTするものでGETは範囲外、ということなのでしょうか?

hasegawayosukehasegawayosuke 2013/02/06 17:54 「悪意あるページからサイトをまたいで不正なリクエストを送る」という部分は間違いではないのですが、CSRFと言った場合は掲示板への書込みやオンラインショップへの決済など、そのリクエストによって発生する副作用を狙った攻撃を指します。そういう意味で、POSTのほうが対象としては多くはなりますが、GETでのCSRFももちろん存在します。単にJSONを取得される、というだけの場合はCSRFに含めません。

yuku_tyuku_t 2013/02/06 17:59 WikipediaのCSRFをよくよく読んでみると、例示されている攻撃がimgタグでGETリクエストを送る(「ぼくはまちちゃん」騒動についての箇所)となっているのでGETは範囲外ということはなさそうですね。(Wikipediaの記事がそもそも間違っている可能性はありますが)

となるとますます「全然違う」という指摘の根拠が分からないのですが、この事例がCSRFに含まれないとするなら id:hasegawayosuke さんにとってのCSRFの定義はどういったものなのですか?

(なんだか粘着してるみたいですみません。こういう認識の問題って現場の人に聞く以外になかなか知る手立てがないので教えていただければ幸いです。)

yuku_tyuku_t 2013/02/06 18:00 すみません。入れ違ってしまいました。
なるほど理解しました。
2個目は無視してください。

hasegawayosukehasegawayosuke 2013/02/06 18:07 JSONにwhile(1); つけるというの、たしかに非常識すぎておもしろいですね。でもまあ、ほんとにこれバッドノウハウすぎて万人には勧められない感じなので、ちょっと勢いで書いてしまいました。べつに責めてるわけじゃないので、すみません…。

aa 2013/02/07 00:40 まあ、蛇足かもしれませんが勝手に補足すると、アプリの実装に依存してGETに副作用がある場合があるので、その場合はフォージュリ可能になって、レスポンス内の情報を盗もうとすることが目的なら副作用を起こすことを意図していないのでフォージュリではないです。

hasegawayosukehasegawayosuke 2013/02/07 00:52 GETでCSRF可能というのであれば、while(1);つけてようがつけていまいが、script srcとして読んだ時点でCSRF成立しますね。なので while(1); はCSRF対策としては役に立ちません。