午前I問題

ソフトウェア開発ライフサイクルの各フェーズにおいて、セキュリティ上の欠陥を発見・修正するコストが最も低くなるのはどの段階か。

ア)設計フェーズ イ)実装フェーズ ウ)テストフェーズ エ)要件定義フェーズ

午前I の解答・解説を見る

正解: エ)要件定義フェーズ

解説: バリー・ボームが提唱したコスト曲線によると、セキュリティ欠陥の修正コストは発見が遅れるほど指数的に増大する。要件定義フェーズ(エ)での修正コストを1とすると、設計フェーズ(ア)では約5倍、実装フェーズ(イ)では約10倍、テストフェーズ(ウ)では約20〜50倍、運用フェーズでは100倍以上になるとされる。そのためセキュリティ活動を開発ライフサイクルの早期フェーズで実施する「シフトレフト」の考え方が重要視される。

午前II問題

SAST(Static Application Security Testing)の説明として、最も適切なものはどれか。

ア)動作中のアプリケーションに擬似的な攻撃リクエストを送信し、レスポンスを解析して脆弱性を検出する。

イ)ソースコードや中間コード・バイトコードを実行せずに解析し、潜在的な脆弱性箇所を検出する。

ウ)本番環境にデプロイしたアプリケーションに対して実施するため、CI/CDパイプラインには組み込めない。

エ)ブラックボックステストの一種であり、内部の実装ロジックを参照しないで脆弱性を発見する。

午前II の解答・解説を見る

正解: イ)

解説:

  • ア)はDAST(Dynamic Application Security Testing)の説明。DASTは実行中のアプリケーションに対して外部からテストを行う。
  • イ)正解。SASTはソースコードや中間コード・バイトコードを静的に解析するため、アプリケーションの実行が不要。コードコミット時やビルド時にCI/CDパイプラインへ自動組み込みが可能で、開発者に早期フィードバックを返せる。
  • ウ)誤り。SASTはアプリケーションの実行を必要としないため、コードコミット時にパイプラインへ組み込んで実行できる。
  • エ)DASTの特徴の説明。ブラックボックステストはDASTに相当し、SASTはソースコードを参照するホワイトボックスまたはグレーボックステストの性質を持つ。

午後問題

ECサイトを運営するA社では、自社開発のWebアプリケーションのセキュリティ強化を目的に、SSDLC(セキュア開発ライフサイクル)の導入を決定した。情報セキュリティ部門のB氏が開発部門と連携して体制を構築することになった。

現状の開発体制は次のとおりである。

  • 開発チームはアジャイル開発(2週間スプリント)を採用しており、機能追加を頻繁にリリースしている
  • セキュリティテストはリリース直前に外部委託のペネトレーションテストのみ実施しており、脆弱性が見つかるとリリースが数週間遅延する問題が繰り返し発生している
  • 昨年、本番環境のWebアプリケーションにSQLインジェクション脆弱性が存在し、攻撃者に悪用されて顧客の個人情報約1万件が漏洩する事故が発生した

B氏はこの現状を改善するため、CI/CDパイプラインへのセキュリティツール統合と、実装レベルの根本的なセキュリティ対策の両面から計画を立案することにした。

設問1

B氏はCI/CDパイプラインにSASTとDASTを組み込む計画を立てた。両ツールを実行するのに最も適切なタイミングを、それぞれ「①コードコミット・ビルド時」「②ステージング環境へのデプロイ後」「③本番環境へのデプロイ後」から1つずつ選び、その理由とともに答えよ。(各選択肢は1回のみ使用可)

設問1の解答・解説を見る

正解例:

  • SAST:①コードコミット・ビルド時
  • DAST:②ステージング環境へのデプロイ後

解説: SASTはアプリケーションを実行せずにソースコードや中間コードを静的解析するため、アプリケーションが動作していなくてもよい。コードコミット・ビルド時に実行することで、問題を早期発見し開発者にすぐフィードバックできる(シフトレフト)。DASTは動作中のアプリケーションに対してHTTPリクエストを送信して脆弱性を検出するため、アプリケーションが起動している環境が必要。ステージング環境(②)を選ぶのが適切であり、本番環境(③)でDASTを実行すると、実データへの影響や誤動作によるサービス障害が生じるリスクがあるため不適切である。

採点ポイント:

  • SASTを①と選択し、「ソースコード静的解析」「実行不要」「早期フィードバック(シフトレフト)」のいずれかに言及(4点)
  • DASTを②と選択し、「動作中アプリケーション」「ステージング環境が必要」に言及(4点)
  • ③を避ける理由(本番データへの影響・障害リスク)に言及(2点)

設問2

昨年発生したSQLインジェクション攻撃による個人情報漏洩の再発防止策として、設計・実装フェーズで実施すべきセキュリティ対策を2つ挙げ、それぞれ有効な理由を述べよ。

設問2の解答・解説を見る

正解例(下記から2つ):

  1. プリペアドステートメント(パラメータ化クエリ)の使用 SQLクエリとパラメータを分離してDBMSに送信する方式。ユーザ入力がSQL文の一部として解釈されないため、SQLインジェクションを根本的に防ぐことができる。

  2. 入力値のホワイトリスト検証 SQLに渡すすべての入力値に対して、許可する文字種・桁数・形式をあらかじめ定義し、それ以外を拒否する。不正な文字列がクエリに混入するリスクを低減できる。

  3. ORマッパー(ORM)の使用 O/Rマッパーライブラリを利用してSQLクエリを自動生成させることで、生のSQLを記述する箇所を排除し、インジェクションが混入しにくい構造を実現する。

不正解例: WAF(Webアプリケーションファイアウォール)の導入→これは運用フェーズの対策であり、設計・実装フェーズの対策とはいえない。

採点ポイント:

  • プリペアドステートメントまたはパラメータ化クエリを挙げ、SQLとデータの分離という理由に言及(5点)
  • ホワイトリスト検証またはORMを挙げ、不正入力の排除という理由に言及(5点)
  • WAFなど運用フェーズの対策のみの場合は0点

重要キーワード

用語説明
SSDLCセキュアソフトウェア開発ライフサイクル。要件定義から廃棄まで全フェーズにセキュリティ活動を組み込む開発手法
SASTStatic Application Security Testing。ソースコード・中間コードを実行せず静的に解析して脆弱性を検出する手法
DASTDynamic Application Security Testing。動作中のアプリケーションに擬似攻撃を行い外部視点で脆弱性を検出する手法
DevSecOps開発(Dev)・セキュリティ(Sec)・運用(Ops)を統合し、CI/CDパイプラインにセキュリティを自動化・内包する開発文化
シフトレフトセキュリティテストや品質保証活動を開発ライフサイクルのより早い(左の)フェーズで実施するアプローチ
プリペアドステートメントSQLクエリとデータを分離してDBMSに送信する方式。SQLインジェクション対策として最も基本的かつ有効な実装手法

まとめ

  • 午前I視点: ボームのコスト曲線が示すとおり、セキュリティ欠陥の修正コストは発見フェーズが遅いほど指数的に増大する。要件定義段階での発見・対応が最もコスト効率が高い。
  • 午前II視点: SASTは静的解析(ソースコード対象・実行不要・CI/CDに統合可)、DASTは動的解析(動作中アプリ対象・ブラックボックス)という違いを正確に区別することが重要。
  • 午後視点: DevSecOpsの実践ではSASTをコミット時・DASTをステージング環境でという配置設計が核心。SQLインジェクション対策はプリペアドステートメントによる根本対策と入力値検証の組み合わせが実装レベルの正答。