情報処理安全確保支援士の勉強をしていると、クロスサイトスクリプティング(Cross Site Scripting: XSS)と クロスサイトリクエストフォージェリ(Cross Site Request Forgeries: CSRF)がどう異なるのか、混同する人は少なくないようです(かく言う私も)。
どちらも、ユーザーが意図しない動作を悪意を持った第三者が実行する、という点では似ていますね。
自分の勉強も兼ねて、両者の違いについて実際に起きた事件を引用しつつ、まとめました。
XSSはユーザ環境で悪意あるスクリプトを実行させるもの
悪意ある第三者がスクリプトを仕込んだWebサイトのページを、閲覧者であるユーザーが読み込むと、仕込まれたスクリプトが実行されてしまうものです。
Javascriptがcookieを読めてしまう場合、cookieの情報が窃取される危険性があり、これがXSSの怖いポイントの1つ。
後述するCSRFではユーザーがSNSなどのサービスにログインしていることが利用されますが、XSSでは必ずしもそうではありません。
探すと実例は色々出てきますが、例えば、YouTubeの事件。
ユーザーのブラウザでJavascriptを実行させ、虚偽のメッセージを表示させたりしますが、サービスにログインしているかどうかは関係ありません。
要するに、アクセスして来た人の環境で悪意あるコードが実行される、というのがXSS。
XSSのややこしいところはコーディングレベルで対処する必要があることで、完全な対策が難しいのが現状です。
CSRFはユーザのリクエストを偽装する
実例を見たほうが早いかもですね。
有名なのは、2012年のパソコン遠隔操作事件。
複数の手口を実施したそうですが、そのうちの1つがCSRF。犯人はあるWebサイトを用意し、ある人にサイトのリンクをクリックさせることで、自治体に脅迫メールを自動送信させた、というもの。「リンクをクリックしてしまった人」が脅迫メールを送ったように見えてしまいます。
もう対策済ですがFacebookの事例。
「いいね」や「友達」の情報が第三者に盗まれるというもの。ログインした該当ユーザーしか実行できない処理を、悪意を持った第三者が実行できてしまう、というものです。
相当昔のものですが、もう一つはmixiの実例(大分昔なので恐らく既に対策済みでしょう)。
mixiにログインした状態のあるユーザーが、あるURLをクリックすると、勝手に日記をアップロードされてしまうというものです。
いずれも、ユーザーがURLを踏んでしまうことで、ユーザーの意図とは関係なく勝手にリクエストが行われてしまう、というもの。これにより、ユーザーが意図しない動作が実行されてしまいます。
CSRFではリクエスト偽装の仕掛けが用意されて罠を踏ませる、というものです。
まとめ
まとめると
- XSS:ユーザーに悪意あるスクリプトを実行させる
- CSRF:あるユーザーのリクエストであることを偽装する。
ということになります。
参考サイト
クロスサイトスクリプティング:
情報処理推進機構(IPA) – 2. クロスサイト・スクリプティング
https://www.ipa.go.jp/security/vuln/vuln_contents/xss.html
TREND MICRO – クロスサイトスクリプティング(XSS)
https://www.trendmicro.com/ja_jp/security-intelligence/research-reports/threat-solution/xss.html
クロスサイトリクエストフォージェリ:
IPA – 3. CSRF (クロスサイト・リクエスト・フォージェリ)
https://www.ipa.go.jp/security/vuln/vuln_contents/csrf.html
TREND MICRO – クロスサイトリクエストフォージェリ(CSRF)
https://www.trendmicro.com/ja_jp/security-intelligence/research-reports/threat-solution/csrf.html