コンテンツにスキップ

CSRF のハンズオンブックを作った

作成した資料

https://csrf-guidebook.sasakiy84.net/

ハンズオンを作成した経緯

きっかけは、2022 年夏に参加したセキュリティキャンプの選考課題でした。
選考課題のなかの一問として、以下のような問題がありました。

Cross-Site Request Forgery (CSRF) とは何か、現代の Web ブラウザ・Web アプリケーションフレームワークが備える仕組みを深く考慮しながら、自分の言葉で説明してください。なお、関連する仕様や実際の実装例の挙動を論拠にする場合は、ぜひその出典を明記してください。

当時の私は、CSRF という言葉を聞いたことがある、くらいのレベルで、たとえばよく言われるような XSS との違いを説明せよ、という問いにも答えられないようなレベルでした。
そのため、様々な資料を参照して、CSRF とはどのような脆弱性、あるいは攻撃なのかということから、どのような対策がなされているか、そして、今後どのような対策を行うべきかを調べ、解答として提出しました。

ハンズオンを作成したのは、せっかくきちんと調べたのだから、ある程度まとまった形で公開しようというモチベーションが主なものです。

作成のときに考えていたこと

自分の調査結果をまとめることが主要な動機とはいえ、すでにネット上に転がっているものをまとめて公開しただけ、というのは避けたいと思っていました。公開することに対して、世界にたいしての積極的な理由づけがほしかったのです。
私が考えていた理由づけは、以下の三点です。

日本語資料であること

CSRF について学べる資料のなかで、私が見つけたもっともまとまった資料は、OWASP が公開している以下の資料です。

https://owasp.org/www-community/attacks/csrf
https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html

これらはとてもよくまとまっており、基本的な説明から、場合に応じた対策方法まで記載されています。CSRF について学ぼうとする場合、この資料がとても役に立つでしょう。知識がある人には、この資料を教えれば十分かもしれません。
しかし、この資料は英語で執筆されています。そのため、 (Google 翻訳等があるとはいえ、) 日本語で書かれたという点で OWASP の資料と差別化できると考えました。

まとまったハンズオン資料であること

日本語にも多くの優れたものがあります。ですが、 OWASP のようなまとまった資料を発見することはできませんでした。
「まとまった」というのは、「CSRF について何もしらない人が最新の防御方法をみにつけることができるような」という意味です。
たとえば、徳丸本はさまざまな脆弱性がわかりやすくまとまった資料ですが、少なくとも CSRF に対する防御手法について OWASP ほどの詳細さで語られてはいません。
ネット上の記事にも、どのような脆弱性であるかをわかりやすく記載したものや、最新の防御手法についてまとめたものはありますが、散逸しています。

そこで、自身の資料を「まとまった」ものにするために、選考課題に以下の工夫を付け加えました。

実際のシナリオを提示しながらハンズオン行うこと

こちらは、なにも知らない人が、CSRF を理解するための工夫です。
CSRF とはなにかを説明した技術記事を読んでいると、攻撃が発生する原因のコアの部分だけを説明したものを見かけました。たとえば、以下のような説明です。

ログインした利用者からのリクエストについて、その利用者が意図したリクエストであるかどうかを識別する仕組みを持たないウェブサイトが、外部サイトを経由した悪意のあるリクエストを受け入れてしまう問題のこと

これは、前提知識がある人向けに、CSRF を端的に説明する場合は分かりやすい説明となります。しかし、セキュリティについての前提知識がない人は、「悪意のあるリクエスト」とはどのようなものか、などの情報を補完することができず、具体的な事例を思い浮かべることができません。具体的な事例を思い浮かべられないと、理解した気分になれないので、CSRF とはなにかを説明するときは、シンプルなシナリオを用意して、状況をイメージできるようにしました。また、現実世界で起きた事例も紹介するようにしました。

一度に学ぶことを可能な限り小さく分割すること

こちらも、なにも知らない人が、CSRF を理解するための工夫です。
一度にすべてのことを説明しようとすると、たいていの人は処理能力を越えてしまいます。そのため、一度に理解しなければいけない内容をできるだけ細かく区切りました。
具体的には、「サーバー側がリクエストを検証できない事例」として、ログイン認証を伴わない&GETリクエストで投稿ができるの匿名掲示板の事例を検討しています。
セッション管理の概念や、HTTPメソッドの概念を知らない人も、このような事例を通して、セッション管理などを知らない人もサーバー側がリクエストを検証できないとはどういうことか、について理解することができるでしょう。

考えられる防御方法を列挙し、情報源を提示しながらそれぞれの方法を検討すること

こちらは、最新の防御手法を学ぶための内容です。
CSRF がどのような攻撃なのかを理解したとして、次はどのように防げばいいのかという話題になります。そのとき、デファクトスタンダードになっている防御手法にみを解説する方法もあります。しかし、過去行われてきた(間違った、あるいは不十分な)防御手法や、まだ整備が進んでいないが将来的に使えるであろう防御手法、そして、特定の状況でのみ効力を発揮する防御手法などを説明することは、きちんと CSRF を理解するうえで役に立つはずです。

セキュリティについての入門書でもあること

セキュリティの知識は幅広く、1 つの脆弱性について理解したとしても、他に学ばなければいけないことは数多くあります。
そして、他の脆弱性を学ぶときに、世の中の資料がどのような資料を参照して、あるいはどのような人の意見を参考にして書かれているかを知ることは、自身で新しい知識を学ぶときに役に立つでしょう。
以上のような考えのもと、CSRF について調べるときにどのような資料を参考にしたのかについても記載しました。
また、個別の脆弱性特化ではなく、CWE などのセキュリティデータベースやフレームワークを提示することで、特定の脆弱性を全体の中に位置づけ、セキュリティについての知識体系を読者が意識できるようにしました。

全体のなかに位置づけるというのは、セキュリティキャンプの講義の影響を受けています。
セキュリティキャンプにおいて、サプライチェーンの講義で、実装者からの観点だけでなく、技術的な面からではなく、政治的な面からの取り組みについて述べている講義がありました。
よりセキュアにするという目的のために、技術的な面からだけでなく政治的・制度的な面からも対策を考えていくことはとても有効な視点ですが、今まで私は技術的な視点からしか考えていなかったので、この講義をうけることができたのはとても幸運でした。
その講義のような構成を目指して、制度的な面も組み込んでみたのですが、結果としてはフレームワークがあることの紹介だけに留まってしまった感じがあります。そもそもの知識量が足りていないのでしょう。

実際の講習会で使ってみた

作成した資料の一部を使って、所属サークルの後輩に講習会を行ってみました。
全員セキュリティの前提知識を持たない人々でしたが、終わった後に感触を聞くと、全くわからないという人はいなかったので、上に挙げた入門者向けの工夫はある程度機能していたのかな、と思います。
また、サークル内で運用していた wiki に追加されていた、過去の先輩が書いたプラグインに脆弱性があったため、その脆弱性を用いたデモを行いました。自分で動かす初心者向けのハンズオンと、実際に運用されているサービスでの脆弱性の活用方法を合わせて講習会ができたので、今後セキュリティについて意識してくれる人が増えたと思います。