午前I問題
セキュアコーディングにおける入力値検証の考え方として、最も適切なものはどれか。
ア)攻撃に使われる可能性のある文字列パターン(ブラックリスト)をあらかじめ列挙し、それらに一致する入力のみを拒否すれば、未知の攻撃も含めて防御できる。
イ)許可する文字種・長さ・形式(ホワイトリスト)をあらかじめ定義し、それに合致しない入力をすべて拒否することで、想定外の入力を排除できる。
ウ)入力値検証はクライアント側のJavaScriptで実施すれば十分であり、サーバ側での再検証は冗長であるため省略してよい。
エ)入力値検証は文字列長のみを確認すればよく、文字種や形式の妥当性は確認する必要がない。
午前I の解答・解説を見る
正解: イ)
解説:
- ア)不正解。ブラックリスト方式は既知の攻撃パターンしか列挙できず、新種の攻撃手法や表記のバリエーション(エンコーディングの違いなど)による回避を防げない。網羅性に本質的な限界がある。
- イ)正解。ホワイトリスト方式(許可リスト方式)は、許可する値の範囲をあらかじめ限定し、それ以外をすべて拒否する。未知の攻撃パターンであっても許可範囲外であれば拒否できるため、ブラックリスト方式より堅牢性が高く、セキュアコーディングの基本原則とされる。
- ウ)不正解。クライアント側の検証はブラウザの開発者ツールやプロキシツールで容易に迂回できるため、UX向上のための補助手段に過ぎない。信頼できる検証はサーバ側で必ず実施する必要がある。
- エ)不正解。文字列長だけでなく、文字種(英数字のみか等)や形式(メールアドレス形式か等)の妥当性確認も必要であり、長さのみの検証では不正なペイロードの混入を防げない。
午前II問題
出力エンコーディング(出力エスケープ)に関する記述のうち、最も適切なものはどれか。
ア)出力エンコーディングは常に同一の処理でよく、HTML本文・HTML属性値・JavaScript内・URLのいずれに出力する場合も区別する必要はない。
イ)出力エンコーディングは入力値検証の代替にはならないが、入力値検証を適切に行っていれば出力エンコーディングは省略してよい。
ウ)出力先のコンテキスト(HTML本文、HTML属性値、JavaScript文字列内、URLパラメータなど)ごとに適切なエンコーディング方式を選択する必要があり、コンテキストを誤ると防御が無効化される場合がある。
エ)出力エンコーディングはSQLインジェクション対策として用いられる手法であり、XSS対策には無効である。
午前II の解答・解説を見る
正解: ウ)
解説:
- ア)不正解。出力先のコンテキストによって特殊文字の意味が異なるため、同一のエンコーディング処理では防御できない場合がある。例えばHTML本文では
<``>のエスケープが有効だが、JavaScript文字列リテラル内に出力する場合はクォートやバックスラッシュのエスケープが必要になる。 - イ)不正解。入力値検証(バリデーション)と出力エンコーディングは異なる防御レイヤーであり、片方が他方の代替にはならない。入力値検証をすり抜けた値や、他の経路(DBに保存された値など)から取得した値が出力される場合もあるため、出力時のエンコーディングは省略できない多層防御の要である。
- ウ)正解。HTML本文用エスケープ、HTML属性値用エスケープ、JavaScript用エスケープ、URLエンコードはそれぞれ対象とする特殊文字とエスケープ方法が異なる。例えばHTML本文用のエスケープのみをJavaScript文字列内の出力に適用しても、クォート文字によるコンテキストブレイクを防げずXSSが成立する場合がある。OWASPのXSS防止チートシートでもコンテキストごとのエスケープが強調されている。
- エ)不正解。出力エンコーディングはXSS対策の根本的な手法である。SQLインジェクション対策としてはプリペアドステートメント(パラメータ化クエリ)が主に用いられる。
午後問題
F社では自社開発の会員制Webサービスにおいて、外部のセキュリティ専門家によるソースコードレビューを実施した。レビューの結果、以下の実装が確認された。
指摘①:プロフィール表示機能
echo "<div class='intro'>" . $_POST['introduction'] . "</div>";
会員が入力した自己紹介文(introduction)を、サニタイズ処理なしにそのままHTMLへ出力していた。
指摘②:検索キーワードのJavaScript埋め込み
echo "<script>var keyword = '" . htmlspecialchars($_GET['q']) . "';</script>";
検索キーワードをJavaScript変数に埋め込む際、htmlspecialchars()(HTML用エスケープ関数)のみを適用していた。
指摘③:入力検証方針
開発チームへのヒアリングの結果、「入力値検証は攻撃でよく使われる <script> OR 1=1 などの既知パターンを正規表現でブロックするブラックリスト方式を採用している」との回答を得た。
F社はレビュー結果を受け、開発ガイドラインをOWASP ASVS(Application Security Verification Standard)を参考に改訂することにした。
設問1
指摘①・指摘②それぞれについて、想定される脆弱性の種類と、攻撃が成立する理由を80字以内で述べよ。
設問1の解答・解説を見る
正解例:
- 指摘①:クロスサイトスクリプティング(XSS)。エスケープ処理をせずユーザ入力をHTMLにそのまま出力しているため、
<script>タグ等を含む入力がブラウザ上でスクリプトとして実行される。(78字) - 指摘②:クロスサイトスクリプティング(XSS)。HTML用エスケープはJavaScript文字列内のシングルクォートを想定しておらず、
q=';alert(1);//のような入力でクォートを閉じてスクリプトを注入できる。(79字)
解説: 指摘①はエスケープ処理そのものが欠落しているため典型的な反射型・格納型XSSが成立する。指摘②はより見落とされやすいパターンで、htmlspecialchars()はHTMLの特殊文字(<``>``&``"等)はエスケープするが、シングルクォート(')をデフォルトではエスケープしない場合があり、またJavaScript文字列リテラルのコンテキストにおけるエスケープルール(バックスラッシュ処理等)とは異なる。そのため「HTML用のエスケープ関数を使っているから安全」という思い込みがコンテキスト不一致のXSSを生む典型例となる。
解説・採点基準(計15点):
| 採点項目 | キーワード | 配点 |
|---|---|---|
| 指摘①の脆弱性名 | XSS(クロスサイトスクリプティング) | 3点 |
| 指摘①の理由 | エスケープ未処理でスクリプトタグがそのまま実行される旨 | 4点 |
| 指摘②の脆弱性名 | XSS(クロスサイトスクリプティング) | 2点 |
| 指摘②の理由 | 「HTML用エスケープとJavaScript用エスケープのコンテキスト不一致」「クォートが閉じられる」旨 | 6点 |
指摘②で単に「エスケープが不十分」とのみ書きコンテキストの違いに触れていない場合は理由欄を2〜3点とする。
設問2
指摘③のブラックリスト方式について、OWASP ASVSが推奨する方式の観点からその問題点を40字以内で指摘せよ。また、指摘①〜③を踏まえてF社が開発ガイドラインに明記すべき原則を2つ挙げよ。
設問2の解答・解説を見る
正解例:
- 問題点:既知パターンしか防げず、未知の攻撃手法や表記のバリエーションによる回避を防げない。(39字)
- 原則1:入力値検証はホワイトリスト方式(許可する文字種・形式のみ許可)を基本とする。
- 原則2:出力エンコーディングは出力先のコンテキスト(HTML本文・属性・JavaScript・URL等)ごとに適切な方式を選定する。
解説: OWASP ASVSはV5(Validation, Sanitization and Encoding)の章で、入力値検証はポジティブ(許可リスト)方式を基本とすることを求めており、ブラックリスト方式は迂回可能性が高いため推奨されていない。また出力エンコーディングについてもコンテキストごとの適切な処理を要求している。指摘①〜③はいずれも「防御は入れているが方式や適用箇所が不適切」という共通点があり、ガイドラインには入力検証の方式(ホワイトリスト)と出力エンコーディングのコンテキスト別適用の両方を明記する必要がある。
解説・採点基準(計15点):
| 採点項目 | キーワード | 配点 |
|---|---|---|
| 問題点の指摘 | 「既知パターンのみ対応」「未知の攻撃・迂回を防げない」旨 | 5点 |
| 原則1 | ホワイトリスト方式への言及 | 5点 |
| 原則2 | コンテキストに応じた出力エンコーディングへの言及 | 5点 |
原則が「入力検証を強化する」など具体性を欠く記述のみの場合は該当項目を1〜2点とする。
重要キーワード
| 用語 | 説明 |
|---|---|
| セキュアコーディング | 脆弱性を作り込まないことを目的とした、実装フェーズにおけるコーディング規約・実践の総称 |
| ホワイトリスト方式(許可リスト方式) | 許可する値の範囲をあらかじめ定義し、それ以外を拒否する入力値検証方式。ブラックリスト方式より堅牢 |
| 出力エンコーディング(出力エスケープ) | 出力先のコンテキストに応じて特殊文字を無害化し、意図しないコード実行を防ぐ処理 |
| コンテキスト別エスケープ | HTML本文・属性値・JavaScript・URLなど出力先ごとに異なるエスケープ方式を適用する考え方 |
| OWASP ASVS | Application Security Verification Standard。アプリケーションのセキュリティ要件を検証レベル別に定めたOWASPの標準 |
| 多層防御(Defense in Depth) | 入力値検証・出力エンコーディング等、複数の防御層を組み合わせて単一障害点を作らない設計思想 |
まとめ
- 午前I視点: 入力値検証はホワイトリスト方式が原則。ブラックリスト方式は既知パターンしか防げず未知の攻撃を許すという弱点をセットで理解する。
- 午前II視点: 出力エンコーディングは出力先のコンテキスト(HTML本文・属性・JavaScript・URL)ごとに方式が異なる点が頻出の落とし穴。「エスケープしているから安全」と即断しない。
- 午後視点: ソースコードレビューでは「対策の有無」だけでなく「対策の方式・適用箇所が適切か」まで踏み込んで指摘できるようにする。OWASP ASVSはホワイトリスト検証とコンテキスト別エンコーディングを求める代表的な基準として押さえる。