結局、CSRFって何だったの?
先週末から世間を騒がせた CSRF って結局何だったのでしょう。わかりやすい解説記事が @IT に出ていました。
mixiでのはまちちゃんに関して、かなりわかりやすく書かれています。具体的なHTMLの記載がないのが残念です。
さて、はまちちゃんの詳細を書くのもアレですので、実際に他のアンケートサイトであった CSRF の事例をもとに、もう少し具体的にCSRFについて書いてみましょう。
とあることについて違和感の有無を問うアンケートなのですが、これのHTMLソースは次のようになっていました。(主要な部分のみ)
<form action=1.cgi method=post> <tr> <td>なまえ:</td> <td><input type=text name=n size=30> <font size=-2>※必ず入れてください</font></td> </tr> <tr> <td>ひとこと:</td> <td><input type=text name=m size=80> <font size=-2>※1文字以上入力すると公開されます。</font> <tr> <td>主張:</td> <td><input type=radio name=v value=0>違和感ある <input type=radio name=v value=1>違和感ない</td> </tr> <tr> <td><input type=button value='投票' ></td> </tr> </form>
このアンケートに限った話ではなく、あちこちのWebサイトがそうなのですが、実は HTML 上は method=POST になってはいるものの、CGIプログラムの実装上の不備だろうと思いますが、GET のパラメータも受け入れてしまっていることが非常に多いです。
このアンケートCGIでも、各パラメータを GET で渡すために & で並べて
http://example.com/cgi-bin/1.cgi?n=名前&m=メッセージ&v=1
といったURLにアクセスすることにより、「違和感ない」に投票することが可能でした。
つまり、第三者にこのURLをクリックさせることさえできれば、その人の判断を介在させることなく、特定のオペレーションを実行させることができます。これがCSRFです。
ここでは GET での攻撃手法を例に挙げて説明しており、また IPA の資料「ソフトウエア等の脆弱性関連情報に関する届出状況[2005 年第1 四半期(1月〜3月)]」においても
この攻撃ではHTTP のGETメソッドが使われることが多いため、フォームの処理にPOSTメソッドのみを使用することで、悪用されにくくなります。
とありますが、実際には POST であっても簡単にCSRFを動作させることができるのは、はまちちゃんが実証したとおりです。
さて、CSRFへの対策を、と思ったのですが長くなったのでこのあたりで。気が向けば続きを書くかも知れません。