サイトアイコン やさしいネットワークとセキュリティ

CSRF(クロスサイトリクエストフォージェリ)【平成29年度 春期 情報処理安全確保支援士試験 午後1 問2 設問2】

平成29年度 春期 情報処理安全確保支援士試験 午後1 問2 設問2

(略)

(略)

 Xさんが、ログインできなくなる前にどのような操作をしたかをL氏に聞いたところ、サイトα内の掲示板に投稿していた人のプロフィール画面を見て、そこに記載されていたリンクをクリックしたとのことであった。リンク先は、別サイトのURLであり、かつ、Xさんが確認した時点ではリンク先は既に削除されていた

(略)

〔脆弱性1について〕

 脆弱性1は(a:クロスサイトリクエストフォージェリ)の脆弱性であった。脆弱性1を確認した手順を表2に示す。

表2は、手順としては画面遷移(え)(お)である「退会処理〜退会確認〜退会完了」のパターンごとの、「退会確認〜退会完了」のPOSTデータを変えた場合の結果を表したものです。

表1の画面遷移(お)のPOSTデータの仕様では、「action_id=submit&taikai_token=xxx」(xxxは画面遷移(え)で生成された値)となっています。

表2では項番1は想定している手順で、結果として「退会完了」で正常終了しています。

項番2と4、5は結果が「エラー画面」となり、仕様で認められない手順やPOSTデータであるため、結果として異常終了となっています。

項番3は、POSTデータが「action_id=submit」で「taikai_token=xxx」がないにも関わらず、結果として「退会完了」で正常終了してしまっています。この部分が脆弱性を持っていると考えることができます。

 次は、XさんがJ社の情報処理安全確保支援士K氏から、脆弱性1についての方向を受けた時の会話である。

Xさん:開発委託時の要件に(a:クロスサイトリクエストフォージェリ)の脆弱性への対策を含めていたので、脆弱性1の対策はできていると思っていました。

K氏:対策を試みたけれど、プログラムの実装に不備があったようです。プロフィール確認画面についても脆弱性1が確認されています。

Xさん:そうですか。退会処理が行われてしまった利用者がクリックしたリンク先はどのようなものだったのでしょうか。

K氏:例えば、図2のようなHTMLです。このHTMLは、表2中の項番(b:3)のような動作をWebブラウザにさせます。

Xさん:変更操作がある画面のうち、パスワード変更画面は、そもそも(a:クロスサイトリクエストフォージェリ)の脆弱性への対策をしていませんが、問題ありませんか。

K氏:パスワード変更画面では表1にあるように、(c:現在のパスワード)を入力させる仕様です。(c:現在のパスワード)は攻撃者が(d:知り得ない)情報であることを前提としてよいので、問題ありません。画面遷移(お)のような実装の不備もないようでした。

【出典:情報処理安全確保支援士試験 平成29年度春期午後1問2(一部、加工あり)】

a:クロスサイトリクエストフォージェリ

今回の事象を整理すると、L氏がログインできなくなる前の操作は「サイトα内の掲示板に投稿していた人のプロフィール画面を見て、そこに記載されていたリンクをクリックした」であり、「リンク先は、別サイトのURLであり、かつ、Xさんが確認した時点ではリンク先は既に削除されていた」ということです。

そして、リンク先のHTMLの例として図2が挙げられています。

図2を見ると、iframe、form、scriptがそれぞれ2つあり、formでは退会処理ページに対し、POSTのパラメータが異なるパターンが設定されています。

そして、scriptにより、退会処理ページを開いた後に1つ目のformの値をsubmitして、その1秒後に2つ目のformの値をsubmitされるようにしています。

これにより、退会処理が自動的に行われてしまったと考えられます。

このように、サイトを跨いで、不正なスクリプトにより、意図しない操作が引き起こされてしまう攻撃をCSRF(クロスサイトリクエストフォージェリ)といいます。

b:3

不正スクリプトにより、表2の項番3の脆弱性をついた動作をさせることができてしまいます。

c:現在のパスワードd:知り得ない

表1のパスワード変更処理の画面遷移(い)を確認すると、POSTデータの仕様では、「action_id=submit&old_passwd=xxx&new_passwd1=yyy&new_passwd2=yyy」とあります。

「old_passwd」として現在のパスワードがパラメータに含まれていて、攻撃者は知り得ないものです。このため、クロスサイトリクエストフォージェリの攻撃は成立しないことになります。

e:confirm

1つ目のformで指定する「action_id」は、表1の画面遷移(え)に相当する「action_id=confirm」になります。

f:submit

同じく、2つ目のformで指定する「action_id」は、表1の画面遷移(お)に相当する「action_id=submit」になります。

モバイルバージョンを終了