Sansan Tech Blog

Sansanのものづくりを支えるメンバーの技術やデザイン、プロダクトマネジメントの情報を発信

新卒エンジニア向けに情報セキュリティ研修を行いました

こんにちは。技術本部 情報セキュリティ部 CSIRTグループ所属の北澤です。Data Hubというプロダクトの開発組織から CSIRTグループのプロダクトセキュリティチームに異動してきて1年が経ちました。

4月21日にSansanでは初めてとなる新卒エンジニア向けの大規模な情報セキュリティ研修を行いました。今まで全社員共通のセキュリティ研修はありましたが、SQL InjectionやXSSなど、開発時に考慮すべき脆弱性対策に特化したエンジニア向け研修を行ったのは今回が初めてになります。本記事ではその研修の内容についてお伝えできればと思います。

研修について

タイムテーブル

研修は以下のタイムテーブルで、丸一日かけて実施しました。

研修のタイムテーブル

最初は領域問わず必要な情報セキュリティの基礎に関する講義を行い、午後にSQL InjectionなどをはじめとしたWebに関する攻撃手法の講義を行いました。2つの講義を行ったあと、用意した 演習用アプリを実際に攻撃してもらうハンズオンを実施しました。

内容としては一番多くのエンジニアがかかわるWebサービスに関するセキュリティに特化しています。 Web 以外の研修も重要度は高いので今後順々に充実させていきたいです。

研修のゴール

新卒の方に研修を終わった後にどうなっていてほしいのか?を部内で話し合い、研修では以下2つの状態を受講者のゴールとして設定しました。

  • プロダクトへの影響を踏まえて脆弱性のトリアージが出来るセキュリティ知識がついている
  • セキュリティ観点を持って日々の業務が出来る

研修のゴール1:プロダクトの状況を踏まえた脆弱性トリアージが出来る

研修のゴール2:セキュリティ観点を持って日々の業務が出来る

どちらも Sansan で働くエンジニアには絶対にあって欲しいものです。

講義内容

情報セキュリティ 基礎編

最初に基礎編の講義を行いました。

基礎編の講義では「領域に関わらず絶対に知っておいて欲しいこと」にフォーカスを当てた内容を話しました。対策をしなかった場合、攻撃を受けた時にどのような被害が生まれてしまうのか?脆弱性の深刻度や攻撃のリスクをどう判断すればよいのか?脆弱性の情報を知るにはどこを見れば良いのか?攻撃の対策をするために社内でどんな制度が利用出来るのか?という、開発を行う際には知っておくべき内容になっています。

具体的な内容としては世の中の脅威動向の紹介と、Sansanが被害を受けた場合のシミュレート結果の紹介をしました。Webサービスを公開していると実際に攻撃リクエストが送られてくるということの具体的な説明も行いました。それからセキュリティ3三要素CIAや情報資産・脅威・脆弱性・リスクなど、基礎的な定義について紹介し、CVSSやCWEなど脆弱性情報の読み方やNVDをはじめとした脆弱性情報がのっているデータベースについて講義を行いました。多層防御、深層防御についての大切さを講義した後、追加で最後に社内で提供しているセキュリティ施策を紹介して基礎編の講義は終了しました。

一部講義資料を画像でお見せします。

セキュリティ三大要素 CIA のうち可用性についての資料

多層防御/深層防御の説明用たまねぎ

情報セキュリティ Web編

Web編ではインジェクションなど OWASP TOP 10:2021で挙げられているものを項目ごとに内容とその対策について講義を行いました。

「A03:2021 – インジェクション」の具体例としてSQLインジェクションの解説

「A08:2021 – ソフトウェアとデータの整合性の不具合」の具体例として、改ざんされたパッケージにサービスを依存させてしまう例

その後Secure-SDLCをもとに、開発工程ごとに行う必要のある脆弱性対策について紹介しました。

ハンズオン

適切にセキュリティ対策をしないとどうなるかを体験してもらうため、用意した脆弱なアプリケーションを実際に攻撃してもらうCTF(Capture the Flag)を開催しました。簡単なSQL InjectionからJWTの署名検証を回避する攻撃まで様々な種類とレベルの攻撃を体験してもらいました。スコアサーバにCTFdを利用し、少しだけ本格的なCTFを実施しました。

攻撃を受けるアプリケーションもCSIRTグループ内で開発を行いました。このアプリの準備についてもどこかでブログに出来ればなと思います。ASP.NET Core製です。以下ではブログ記事の画像用に localhost 上で動かしていますが、本番ではAWS の ECS Fargate上にデプロイし、ドメイン取得+https 化した上で動かしていました。

CTFdの課題一覧画面(一部)
(画像に表示されている以外にも色々な問題を出しています!)

実際に出題した問題と攻撃用のWebサービス画面をいくつか画像で紹介しようと思います。ただ淡々と問題を書くのではなく、少しそれっぽいシナリオが想像できるような文章で作ってみました。(攻撃対象の会社名やサービス名は架空のものです)

SQL Injection 1問目

SQL Injection を利用してパスワードを表示させるクエリを入力

クエリによってユーザ名表示部分にパスワードが表示される

(ログインフォームのユーザ名表示機能の脆弱性を利用し、パスワードを表示させる問題)

Blind SQL Injection 問題

Blind SQL Injection問題。DBから値が取れる場合、取れない場合、構文がエラーになる場合で全て挙動が変化するため、真偽値でパスワードを導いていく。passwordは全て英小文字というヒントがある)

JWTの署名検証を回避する問題

(JWTの検証ライブラリで alg:none が利用出来ることを利用し、adminになりすます問題。少し難易度の高い問題として用意してみました。)

XSS 1問目

スクリプトを検索画面に入力すると

script タグが解釈されアラートが発火する

検索で発火するシンプルなXSSやられアプリ(分かりやすくアラートを表示させています)

反応

前半の講義パートが座学かつ長時間に及んだので新卒の皆さんは辛かったかと思いますが、後半のハンズオンは楽しんでいただけたようでした。アンケートでもポジティブな意見が多く、数か月前から取り組んだかいがあったなと思いました。

終わりに

どのような講義を行うか、どんな問題を出すかの検討からアプリの制作、そこから問題文作成に取り組みました。新卒には海外出身のエンジニアもいるため、資料とCTFのコンテンツを日英両方作成しました。準備には長い期間がかかり大変でしたが、とても濃いセキュリティ研修のコンテンツを作り切ることが出来ました。無事走り切ることが出来て本当に良かったと思います。

日々開発していると、レビュー時にセキュリティ観点が抜け落ちてしまったり、意外と知らないことがあったりします。私もプロダクトエンジニア時代には、「セキュリティ知らん事多いな」と思っていました。そう思っていた過去もあり、新卒のエンジニアの方々に研修としてこういった Web セキュリティの学習コンテンツを届けることが出来て嬉しく思います。今後の業務で今回学んだことが少しでも活きてくれればさらに嬉しいです。

© Sansan, Inc.