3日間で徳丸試験で9割取った方法
こんにちは、iCAREサーバーサイドエンジニアの寺井(@krpk1900_dev)です。
今後iCAREではより信頼性の高い開発を進めていくために、デザイナーとQAEを含む開発部全員でウェブ・セキュリティ基礎試験(通称:徳丸試験)の受験を推進していく方針が決定しました。
これはあくまで個人的な推測ですが、おそらく下期終わり(2023年7月末)のタイミングで部署全体の合格者数の振り返りを行うために、7月あたりまでに勉強を進めて受験していくことになると思っています。
この記事を書いた理由
徳丸試験は過去問や問題集の情報がほとんどないため、どのように勉強したら良いのか分からずに不安な人もいるのではないかなと思いました。
実はこちらで書いた通り私は2023年3月末をもってiCAREを退職することを決めて今日が最終出社日だったため、急いで徳丸試験を受験してきて、これから徳丸基礎試験を受験するiCARE Devチームのみなさんと、同じような悩みを持って今この記事を読んでいるみなさんの参考になればと思い、受験体験記を書き残したいと思います。
急いでいる人のために先に結論
- その脆弱性はどういうことか?(概要)
- その脆弱性はどこで、どうやって発生するのか?(発生箇所・原因)
- その脆弱性が起きてしまったらどうなるか?(影響)
- その脆弱性はどうやったら防げるのか?(対策)
上記の4つの項目を、徳丸本に載っている脆弱性それぞれに対して自分の言葉で説明できるようにしていけば合格できるはずです!
やったこと
徳丸試験受験を部署で推進していく方針が決まったのが3月だったため、最終出社日までに受験するとなるとかなり時間が限られていました。
最終出社日が近くて平日の夜はいろんな予定が入っていたこともあって、実際にがっつり時間を使える予定だったのは受験日も含めて3/4(土)、3/11(土)、3/12(日)の3日間でした。
そのため、今回はやらないことも決める必要があり、計画的に学習を進めていきました。
1. まずは出題レベルを知る
市販の徳丸試験の過去問や問題集はありませんが、徳丸先生自身が公開されている予行問題が3問あったので、まずはそれを解いてみて出題レベルを知ることから始めました。
この動画を見て、最終的なゴールが「XSSやCSRFなどの徳丸本で紹介されているそれぞれの脆弱性について、このレベルの問題を正解できるようになること」に決まりました。
また副次的な情報として、徳丸基礎試験では
- PHPなどの特定言語に依存した問題は出題されない
- 7章 脆弱性診断入門からは出題されない
ことも知ることができました。
2. 出題範囲を知る
次にこちらの記事を読んで、各章から出題される問題数には大きな傾向があることを知りました。
そこで、環境構築の2章と出題範囲から外れている7章を除いた各章をまずは1周、徳丸本のメインである3章と4章は最低でも2周読むことを目標にしました。
ページ数はかなり多く見えますが、前述した通りPHPのコードに関する出題はないことを知っていたので、サンプルコードはかなり流し読みで進めました。
3. アウトプットを起点にして読み進める
何も目的もなく読み進めていくのではなく、それぞれの脆弱性について以下の4つの項目を自分で説明できるようになることを目指して読み進めました。
例えばXSSの場合は、
- XSSとは何なのか?(概要)
- XSSはどこで、どうやって発生するのか?(発生箇所・原因)
- XSSが起きてしまったらどうなるか?(影響)
- XSSはどうやったら防げるのか?(対策)
の 4つです。
本を開く度、寝る前、起きた後など、何度も何度も「CSRFとは〜〜」「SQLインジェクションとは〜〜」「セッションハイジャックとは〜〜」と自分の言葉で説明できるかどうかを確認して、小さなアウトプットをとにかく反復しました。
4. どうしても暗記しないといけない内容を減らす
これは徳丸試験に限らずどんなことにも当てはまると思いますが、暗記することは労力が大きい上に思い出すことが難しいので、どうしても暗記しないといけない内容をできる限り減らすような学習をしました。
CORSとCSRFとXSS
例えば、私はアルファベットで省略されているような用語は必ず省略される前の英単語でインプットするようにしています。
CORSはシーオーアールエスで覚えるのではなく、クロスオリジンリソースシェアリング(Cross-Origin Resource Sharing)でインプットしておくと、いつでも「オリジンをまたがってリソースを共有するための仕組みだったな」と復元することができます。
また、XSSはCross-Site Scriptingでも良いのですが、JavaScriptインジェクションとも呼ばれることを知っておくと、
XSSとは悪意のあるJavaScriptが注入されること
→ つまり、発生する箇所はフォームなどの入力からHTMLやJavaScriptを作るところ
→ ということは、アプリケーションの中でエスケープ処理をすれば対策になる
というように、無理な暗記をすることなく自然と論理を繋げていくことができます。
CSRFもRequest Forgeries、つまり簡単に言ってしまうとリクエスト偽造のことです。
暗記することをなくしていくと、CORSとCSRFとXSSがごちゃまぜになることもありませんし、例えごちゃまぜになったとしてもすぐに再現することができます。
nosniff
徳丸本を読み進めていくと「レスポンスヘッダにX-Content-Type-Options: nosniffを指定する」という内容がいくつかの脆弱性の対策として紹介されています。
私は最初、これを暗記しようとしてしまっていたので、どれとどれの脆弱性の対策だったかがいつも分からなくなっていました。
そこでnosniffの意味を調べていくと、no sniffで分けられ、sniffはスニッフィングを表していることを知りました。
スニッフィング(ここではMIMEスニッフィング)とは、リソースからMIMEタイプを推測することのようなので、「正しいMIMEタイプを設定すること」が対策になる脆弱性については「レスポンスヘッダにX-Content-Type-Options: nosniffを指定する」こともあわせて対策になると理解することができました。
結果
無事合格していました!
徳丸試験は7割が合格ラインで、今回はぴったり9割でした。
セクションごとに見ていくと、4章以外の範囲は満点で、4章で4問間違えてしまったようです。
感想
去年の秋は情報処理安全確保支援士の勉強をしていたのですが、思った以上に今回の徳丸試験の学習範囲と重なるところが少なく、新たな知識を体系的に身につけることができました。
新しい学びが非常に多かったので、受験して良かったです。
徳丸試験は基礎試験と実務試験の2つがあり、今回受験した徳丸基礎試験は基本的な概念を扱う試験でしたが、徳丸実務試験はより開発者に向けて作られた試験となっています。
徳丸実務試験に合格するためには、ソースコードを見てどこに脆弱性があるのか、ソースコードをどう修正すれば脆弱性をなくせるのかを理解する必要があるため、徳丸実務試験を受験するときは今回読み飛ばしてしまったソースコードもしっかり読み解きながら学習したいと思います。
これから徳丸試験を受験するみなさんへ
それぞれの脆弱性について、
- その脆弱性はどういうことか?(概要)
- その脆弱性はどこで、どうやって発生するのか?(発生箇所・原因)
- その脆弱性が起きてしまったらどうなるか?(影響)
- その脆弱性はどうやったら防げるのか?(対策)
を1つずつ理解していけば確実に合格できると思います。
また、その場限りの暗記ではなく大まかな概念を理解する方が試験対策にも繋がると思いますし、そうやって身につけた内容こそがこれから役に立つはずです。
この記事が少しでも役に立つと嬉しいです。