結局、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への対策を、と思ったのですが長くなったのでこのあたりで。気が向けば続きを書くかも知れません。