こんにちは。テクマトリックスの長久保です。

ソフトウェア開発において、セキュリティは極めて重要な要素です。セキュリティの不備は、機密情報や個人情報の漏洩、システムへの不正アクセス、悪意のある攻撃など、さまざまなリスクを引き起こす可能性があります。
ただ、「大切なのはわかるが実際に脆弱性をどうやって学んだらいいの?」といった方もいると思いますし、SQLインジェクションという単語は知っていても、具体的な問題点や発生時の影響、対策方法を理解していない人もいるでしょう。

今回は、社内の別のチームに協力してもらい、プログラミングの実務レベルでセキュリティを学習できる「Secure Code Warrior」をお試しで触らせてもらいました。その概要や使い方、そして感想を共有します。

詳細につきましては、こちらのページを参照ください。

セキュアコーディング学習プラットフォーム Secure Code Warrior

Secure Code Warriorとは

Secure Code Warriorは、開発者のためのセキュアコーディング学習プラットフォームです。豊富なセキュアコーディング学習プログラムが搭載されており、学習者に合わせたコースを設定できます。また、管理者が学習の進捗や学習内容の定着を確認できるため、組織全体のセキュアコーディングの推進が期待できます。
具体的には次の特徴があると感じました。

1.脆弱性のあるサンプルコードを修正しながら学べる

よくある動画や文章だけでなく、例えば実際に操作して画面上でSQLインジェクションを発生させてみたり、具体的な脆弱性のあるコードを表示し実際のコードで学習を進めることが出来ます。また、確認するだけでなく実際に手を動かして問題を解きながら学習を進めることが可能です。学習教材やエディタなど、学習に必要なものがすべてオンラインで完結するのは楽で良いと感じました。
こちらは「実際に触ってみる」で具体的に紹介します。

2.幅広い言語やフレームワークに対応

Java、JavaScript、Python、C#、PHPなど、メジャーな言語をカバーしています。また、単に言語だけでなく、各フレームワークに応じたコースも用意されています。

「Java」でもServletsやSpring、Strutsなどフレームワークごとにもコースが用意されています。

学習するための教材も各言語を用いて学習を進めることが出来るので、学習イメージがつきやすいのではないかと思います。また、各言語特有の脆弱性やベストプラクティスを学ぶこともできそうです。
対応している開発言語については「セキュアコーディングを学習できる開発言語」を参照ください。

3.様々なセキュリティ脆弱性の学習

OWASP Top 10、OWASP Mobile Top 10、OWASP API Security Top 10、CWE/SANS Top 25などに含まれる、150を超えるセキュリティ脆弱性を学習できるとのことです。
XSSやSQLインジェクションなど、Webアプリで頻出の脆弱性を体系的にカバーしているようです。また、以下の通り、同じテーマに対して難易度が分かれているコンテンツもあるため、自身の習熟度に合わせて能動的に学習を進めていくこともできます。

詳細については「セキュアコーディングを学習できる脆弱性」を参照ください。

4.様々な指標での確認

ゲーミフィケーション的な要素も積極的に取り入れられているようです。演習をクリアするとポイントやバッジがもらえるなど、ゲーム感覚で学習を継続できます。

例えば「トーナメント」という仕組みがあります。脆弱性に関する問題が出題され、回答することでポイントを獲得し、獲得ポイントで参加者と競いながら学習を進めたり、自身の習得度合を確認することも可能かと思います。

世界中から攻撃を受け、それを防御するようなイメージで問題を解いていく、ゲームのような選択画面が用意されています。

実際に触ってみる

JavaのSQLインジェクションの学習を進めながら使用感を紹介します。

動画、ガイドライン、ウォークスルーミッション、課題、コーディングラボと分かれており、順に学習を進めていきます。

動画

まず動画を用いて、その脆弱性はどういった概念なのかを学習することができます。

動画自体は英語のコンテンツですが、字幕が用意されていますし、イラストも豊富にありますので、特に学習をしていて困ることはありませんでした。

ガイドライン

ガイドラインセクションでは実際のコードを確認しながら学習を進められます。

サンプルコードも選択した言語を元に学習を進められるので、ストレスなく学習を進められました。

ウォークスルーミッション

Secure Code Warriorを触っていて素晴らしいと感じた1つ目になります。実際に画面上で「SQLインジェクション」を発生させ、具体的にどういった問題が発生するのかを体験することができます。

適切に処理をされていない検索ボックスに「’」や「’ –」と検索欄に入力して検索するとどうなるか、URLのリクエストパラメータに「’ UNION Select * From Users –」などと入力しアクセスするとどういったことができてしまうのか、など、用意されたアプリケーションを触りながら実際にSQLインジェクションを発生させ、体験することができます。
脆弱性の知識の定着にとても良いコンテンツだと感じました。

このSQLインジェクションのウォークスルーミッションについては、デモサイトから体験することも可能です。

課題

こちらもSecure Code Warriorの素晴らしい点だと感じました。

このように実際のコードを確認し、問題がある箇所がどこなのかを選択することで理解を深めることができます。選択肢の中から脆弱性のあるコードを選択して回答します。

正解しました。

問題があると思うコードの箇所をチェックし送信するとすぐに解説も確認することが可能です。

単純に誤っている箇所だけでなく、どのように修正をすればよいかという問題もありました。
ヒントの有無や、回答回数について、コース作成時に制限を加えることが可能なので、単なる学習にとどまらず、試験の要素を持たせることもできそうです。

コーディングラボ

一番難易度が高いと感じたセッションです。コーディングラボでは、問題を選択して回答するだけでなく、実際のコードを修正ながら学習を進めることができます。

実際に触ってみての感想としては、ヒントはあるものの、理解していないと回答できないレベル感だとは感じました。また、課題では個人的にあまりなじみのないコードの書き方が提示され、少し混乱しながら回答をしました。
全て正解するとCongratulations!と表示されるので、いい気分です。

使ってみた感想

ポジティブ

今回チュートリアルドキュメントを用いて、管理者・開発者それぞれの立場として使用しましたが、特に違和感なく利用することが出来ました。
また、よくある動画やテキストで「こういう脆弱性があります」と聞いても「そうなんだ」で終わってしまうところが、実際の画面を用いて操作しながら脆弱性の理解を進めることが出来ます。
先述の通り、Secure Code Warriorでは具体的にサンプルアプリでSQLインジェクションを発生させ、より具体的にイメージしながら学習を進めることが出来ます。問題に対しての正答がわからなくても、ヒントが用意されているので、参考にしながら問題を解いていくことができます。
また、演習環境を含め、すべてブラウザ上で完結するため、実行までの手間もなくスムーズに学習を進めることができるのもポジティブです。

ネガティブ・注意したいポイント

  1. サンプルコードの理解が初見だと多少大変
    演習で出題されるサンプルコードは、ある程度シンプルな例であることが多かったですが、それでも初めて見るコードベースに当たるとどの部分がどう繋がっているかを追うのに時間がかかります。例えばコーディングラボですが、初めて使うメソッドだったり仕組みだったりすると調べながら実装することになるので、それなりに時間がかかることを見越して取り組むべきでしょう。隙間時間でやるような内容ではないかと感じました。
    Secure Code Warriorのブログでも触れられているので、実施するタイミングの調整は必要そうです。
    私のワークフローを乱すのはやめてください適切なセキュリティトレーニングを適切なタイミングで受ける方法
  2. 翻訳されていないページがある。
    教材の動画には字幕がついていたり、テキストは日本語訳されていたりするのですが、部分的に英語のままのページも散見されます。私自身英語が得意ではなく、ブラウザの自動翻訳も受け付けないため(2025/1/28現在最新のChromeで実施)、都度翻訳ツールを経由するのが少し手間でした。
  3. 実務に直結させる工夫が必要
    例えば今回のコーディングラボの2問目では、CriteriaBuilderを用いたSQLインジェクション対策を書きましたが、私自身JDBCを直接使用し、PreparedStatementを使用してパラメータをバインドするという実装をしていることが多かったため、実装方法に少し手間取りました。
    演習で得た知識を本番プロジェクトに適用する際、プロジェクト固有のルールやフレームワークのバージョンによって差が生じる場合があるでしょう。
    Secure Code Warriorで選択した言語やフレームワークで、実装方法がどこまでフォローされているかは不明ですが、学んだ内容を活かすにはチーム内での情報共有や追加説明が必要になる場合もあるのかなと思いました。
  4. 難易度が高い
    取り扱う題材が複雑な内容のため仕方がないというのは前提ですが、難易度は高いと感じました。
    例えばコーディングラボについて、学習の仕組みとしては素晴らしいですが、自力でコードを書く必要があるため、本当の初心者であればヒントを見ながらでも解くのは難しく思います。新人に実施させる場合、先輩社員のフォローは必要かと思います。また、途中でわからなくなった際に元に戻すボタン(リセットボタン)が見つからなかったので、少し苦労しました。

他のツールと連携しての活用方法

Secure Code Warriorは単体でも学習プラットフォームとして活用できますが、他のツールや開発プロセスに組み込むことも可能です。

GitHubとの連携

GitHubと連携することで、プルリクエスト時に脆弱性があるか確認し、脆弱性がある場合学習コンテンツのURLを作成してくれます。

GitHubのマーケットプレイスから「Secure Code Warrior for GitHub」をインストールします。スキャン対象はすべてのリポジトリか特定のリポジトリを選択してインストールすることが可能です。

例えばSQLインジェクションのあるコードをプルリクエストすると、以下のようにプルリクエストにコメントが付きます。

解説動画や、Secure Code Warriorの学習コンテンツへのリンク、参考情報リンクなどが表示されます。自然と開発プロセスに組み込むことができ、教育コストの軽減にもつながるかと思います。
こちらの機能の詳細については、次のページを参照ください。
参考:GitHubの課題とプルリクエストのためのセキュアなコードウォリアー

SARIFファイルとの連携

静的解析ツールで作成することができるSARIFファイルを元に、学習コンテンツのリストを作成することも可能です。
例えばGitHub Actionsに「Add Secure Code Warrior contextual training to SARIF」を組み込むと、静的解析で作成されたSARIFファイルを読み取り、関連するSecure Code Warriorの学習コンテンツへのリンクを付与できます。

サンプルとして、Parasoft C/C++testで作成された上記のSARIFファイルをsarif/findings.sarifに配置し、以下のActionsのyamlファイルを作成し、実行します。

name: Add SCW Training

on:
  push:
    branches:
      - main

jobs:
  add-scw-training:
    runs-on: ubuntu-24.04
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3

      - name: Add SCW Training
        uses: SecureCodeWarrior/github-action-add-sarif-contextual-training@v1
        with:
          inputSarifFile: sarif/findings.sarif
          outputSarifFile: sarif/findings.processed.sarif
          githubToken: ${{ secrets.GITHUB_TOKEN }}

      - name: Import Results
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: sarif/findings.processed.sarif

      - name: Upload processed SARIF as artifact
        uses: actions/upload-artifact@v4
        with:
          name: processed-sarif
          path: sarif/findings.processed.sarif

処理後のSARIFファイル (sarif/findings.processed.sarif) は、以下の2つの方法で確認できます。

GitHub Code Scanningアラート
Import Resultsステップが成功すると、処理されたSARIFファイルはGitHubにアップロードされ、リポジトリのSecurityタブのCode Scanningで結果を確認できます。

Secure Code Warriorのトレーニング情報は、各アラートの詳細内に表示されます。

上記リンクをクリックすることで、該当のSecure Code Warriorのコンテンツへアクセスが可能です。

GitHub Actionsのアーティファクト

Upload processed SARIF as artifactステップにより、処理後のSARIFファイルがワークフローのアーティファクトとしてアップロードされます。

これにより現在のコードに発生している脆弱性に対して、Secure Code Warriorの学習コンテンツの一覧を得ることができます。この一覧を元にSecure Code Warriorの「コース」を作成し、定期的に開発者に学習させることで、効果的に学習を進めることもできるかと思います。

今回はマーケットプレイス内のAdd Secure Code Warrior contextual training to SARIFを利用し、SARIFファイルを連携しましたが、Secure Code WarriorはAPI経由で教材のダイレクトリンクを取得することが可能です。そのため、他CIツールとの連携も問題なくできるかと思います。

まとめ

  • Secure Code Warriorは、実際のコード修正を通じてセキュリティを学ぶことができる、非常に実践的なプラットフォーム。
  • ゲーミフィケーション要素があるので、続けやすく楽しく学習できる。
  • GitHubや静的解析ツールと連携すれば、普段のコードレビューやプルリクエストにセキュリティ学習を自然に組み込める。

セキュリティは、もはやセキュリティ専任チームだけでは対処しきれない時代になっています。開発者が自らの手で安全なコードを書く力を身につけることがとても重要になっています。
もし開発チームでセキュリティ意識を高めたいと考えているなら、Secure Code Warriorは有効な手段の一つかと思います。

セキュアコーディング学習プラットフォーム Secure Code Warrior

By nagakubo

主にCI環境構築をメインで担当しています。 Certified CloudBees Jenkins Engineer (CCJE)