情報処理安全確保支援士 2017年 秋期 午後1 問02
Webアプリケーション開発におけるセキュリティ対策に関する次の記述を読んで、設問1~3に答えよ。
A社は、Webマーケティングを支援する従業員数40名の企業である。A社では、現在、Webマーケティング分析システム(以下、Wシステムという)をWebアプリケーションとして独自に開発し、クラウドサービス事業者S社のクラウドサービス上で顧客にサービスとして提供している。Wシステムでは、A社独自の分析アルゴリズムを用いて、顧客のWebサイトを分析する。顧客の評価は高く、販売も好調である。
〔Wシステムの概要〕
Wシステムの開発は、役員T氏とシステム担当のK氏が行っている。T氏がアルゴリズムなどの基本的な仕様を決め、K氏が、Java、サーブレットや開発フレームワークなどを用いて開発している。また、ブラウザ側での機能性向上のためにJavaScriptも用いている。開発はK氏が管理するPC(以下、開発用PCという)上で行い、完成したプログラムをシステム管理者のF氏が本番システムにデプロイし、運用している。
Wシステムの画面構成は、次のようになっている。
・総ページ数は8である。
・“ログインページ”で利用者を認証し、認証が成功すると、“ダッシュボードページ”へ遷移する。
・“ダッシュボードページ”からは、“分析キーワード入力ページ”などへ遷移できる。
Wシステムのシンプルなページの構成は、顧客にも好評である。
〔Wシステムの実装に関する脆弱性〕
A社では、Wシステムのセキュリティ検査を、あらかじめ定められた手順に従いK氏がブラウザを用いて手動で実施している。しかし、昨今の他社のセキュリティインシデント増加を受け、念のために、先月実施した社内のセキュリティ検査とは別に、今月になり初めて、外部の専門家にセキュリティ検査を依頼することにした。
そこで、セキュリティ専門会社L社の情報処理安全確保支援士であるN氏が、Wシステムのセキュリティ検査を担当することになった。
まず、N氏が脆弱性検査ツールを使って本番システムを検査したところ、図1のJavaコードで書かれたサーブレットSearchServletに、SQLインジェクション脆弱性及びクロスサイトスクリプティング(以下、XSSという)脆弱性があることが判明した。図2は、図1のSearchServletを呼び出すHTMLコードである。
続いてN氏が本番システムのソースコードを確認し、次の指摘をした。
・SQLインジェクション脆弱性への対処としては、図1のア行目からイ行目までを①適切なコードに置き換える必要がある。
・XSS脆弱性への対処としては、XSS脆弱性を招く可能性の否定できない箇所について、HTML形式での出力時に処置するよう改修することとする。
今回指摘された脆弱性は、検査すべき項目の中に含まれており、K氏によるブラウザを用いた手動のセキュリティ検査によって発見され、開発用PC上のコードでは先月に修正されていた。しかし、K氏からファイルを受け取ったF氏が、本番システムに修正版をデプロイし忘れたので、本番システムに脆弱性が残存したままとなっていた。

〔Wシステムの設計に関する脆弱性〕
以前のWシステムは、ログイン状態で30分間操作しないと、サーバ側で自動的にログアウトする仕様であった。自動的にログアウトした場合、ログアウト直前のページを閲覧するには、再度ログインをして、ダッシュボードページから所望のページを選択する必要があるので、不便だとの指摘が顧客からあった。これを改善するため、自動的にログアウトした場合に、ログアウト直前のページの閲覧を試みると、一旦はログインページに遷移するが、認証が成功すると、閲覧を試みたページへリダイレクトする機能(以下、リダイレクタ機能という)を導入した。例えば、WシステムのURLであるhttps://w-system.a-sha.jp/ で動作するWebアプリケーションにおいて、Wシステムにログインしていない状態で、https://w-system.a-sha.jp/dashboard.jsp というURLにアクセスすると、図3のように生成されたURLへリダイレクトされる。

認証用サーブレットLoginServletで認証が成功すると、https://w-system.a-sha.jp/dashboard.jsp へリダイレクトされる。
リダイレクト機能を含めてWシステムの設計に関して検査を実施したところ、N氏から幾つかの指摘があった。主な指摘は次の3点であった。
指摘1:Wシステムの認証後のリダイレクタ機能は、オープンリダイレクタの問題を招く。修正する必要がある。
指摘2:WシステムからのCookie発行の際、TLS通信時だけCookieをブラウザから送信するa属性を設定する必要がある。
指摘3:JavaScriptからCookieを操作できないようにするb属性を設定する方がよい。
K氏は、指摘1に対しては、Wシステムの特性を考慮して、②ホワイトリスト方式によるリダイレクタ機能を採用することにした。指摘2と指摘3については、N氏の指摘どおりに改修することにした。
〔脆弱性対策の強化〕
脆弱性が残存した原因も踏まえ、脆弱性対策の強化として、次のとおり提案と指摘をN氏は行った。
・変更管理プロセスを改善すべきである。
・③脆弱性検査手順を改善すべきである。
・K氏によるブラウザを用いた検査には問題がある。WシステムにXSS脆弱性があったとして、適当な検査用文字列を入力しても、④一部のブラウザではXSS攻撃の試みを完遂できないことがある。
・S社のクラウド型WAFサービス(以下、Sサービスという)を導入することを推奨する。Sサービスでは、Webシステムに脆弱性が発見された際、短時間で適切なシグネチャがWAFに追加される。したがって、Sサービスを利用していれば、WAFを利用せずにWシステムを改修するケースと比較して、⑤Webアプリケーションサーバへのリスクの低減を期待できる。
A社では、N氏のこれらの提案と指摘を検討し、適切に対処することにした。
設問1:〔Wシステムの実装に関する脆弱性〕について、(1)〜(3)に答えよ。
問題文を見る(1)本文中のア、イに入れる、適切な行番号を答えよ。また、本文中の下線①について、必要な全てのコードを解答群の中から選び、適切な順序に並べ替えて解答欄の左から順に記号で答えよ。
解答群
ア:PreparedStatement pstmt = conn.prepareStatement(sql);
イ:pstmt.setString(1, cname);
ウ:ResultSet rs = pstmt.executeQuery();
エ:ResultSet rs = pstmt.executeQuery(sql);
オ:String sql = "SELECT * FROM companylist WHERE cname = '" + cname + "'";
カ:String sql = "SELECT * FROM companylist WHERE cname = ?";
模範解答
ア:9
イ:11
必要な全てのコード:カ、ア、イ、ウ
解説
解答の導き方
-
SQLインジェクション脆弱性の原因になっている行を特定する
図1の9行目では、利用者が入力したcnameを、文字列連結でSQL文に埋め込んでいます。9: String sql = "SELECT * FROM companylist WHERE cname = '" + cname + "'";cnameは図2のフォームの入力欄(name="cname")から送られてくる値なので、例えば“' OR '1'='1”のような文字列を入力されると、SQL文の条件そのものが書き換わってしまいます。これがSQLインジェクション脆弱性の原因です。 -
置き換える範囲を決める(アは9、イは11)
本文には、SQLインジェクション脆弱性への対処として図1の一部を「適切なコードに置き換える」必要があるとあります。文字列連結をやめ、プリペアドステートメントで値をバインドする方式に改めるには、次の3行を書き換える必要があります。- 9行目:SQL文を、値を入れる位置をプレースホルダ(?)にした形に変える
- 10行目:Statementの代わりにPreparedStatementを生成する
- 11行目:SQL文を渡して実行するstmt.executeQuery(sql)を、PreparedStatementの実行に変える
8行目のtry {と、その直後のconnを初期化する処理は、置き換え後も必要です。また、12行目以降は結果のrsを使うだけなので、置き換え後もrsという変数に結果が入っていれば変更は要りません。したがって、置き換える範囲は9行目から11行目までで、アは9、イは11です。 -
置き換えに必要なコードを選ぶ
解答群のうち、プリペアドステートメントを使うのに必要なのは次の四つです。- カ:プレースホルダ(?)を使ったSQL文を定義する
- ア:conn.prepareStatement(sql)で、PreparedStatementを生成する
- イ:pstmt.setString(1, cname)で、1番目のプレースホルダにcnameの値をバインドする
- ウ:pstmt.executeQuery()で実行し、結果をrsに受け取る
オは文字列連結のSQL文のままなので、脆弱性が残ります。エのexecuteQuery(sql)はSQL文の文字列を実行時に改めて渡す書き方で、PreparedStatementでは使いません(JDBCでは、PreparedStatementに対してこの形で呼び出すと例外になります)。 -
並べる順序を決める(カ、ア、イ、ウ)
順序は、各行が前の行で作ったものを使う関係から決まります。アのprepareStatement(sql)はsqlを使うので、sqlを定義するカが先です。イのsetStringはアで生成したpstmtを使うので、アの後です。値をバインドしてから実行するので、ウが最後です。以上から順序はカ、ア、イ、ウとなり、置き換え後の9行目から11行目は次のようになります。String sql = "SELECT * FROM companylist WHERE cname = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setString(1, cname); ResultSet rs = pstmt.executeQuery();
誤りやすいポイント
- 置き換える範囲を9行目だけ、または9行目と10行目だけにしてしまう。11行目もstmtを使ってSQL文を実行しているので、PreparedStatementに合わせて書き換える必要があります。
- 8行目のtry {やconnの初期化まで範囲に含めてしまう。これらは置き換え後も必要な処理です。
- 解答群のエを選んでしまう。PreparedStatementでは、executeQueryにSQL文を渡さず、引数なしで呼び出します。
- イのsetStringをアより前に置いてしまう。pstmtはアで生成されるので、生成前には値をバインドできません。
FAQ
Q: setString(1, cname)の1は何を表しますか?
A: SQL文の中のプレースホルダ(?)の位置で、先頭を1として数えます。本問のSQL文には?が一つだけなので1です。
A: SQL文の中のプレースホルダ(?)の位置で、先頭を1として数えます。本問のSQL文には?が一つだけなので1です。
Q: プリペアドステートメントを使うと、なぜSQLインジェクションを防げるのですか?
A: SQL文の構造を先に確定させ、入力値は後から値としてだけ渡すからです。入力に'などの記号が含まれていても、SQL文の一部として解釈されることはありません。
A: SQL文の構造を先に確定させ、入力値は後から値としてだけ渡すからです。入力に'などの記号が含まれていても、SQL文の一部として解釈されることはありません。
Q: 入力値の記号をエスケープする方法ではいけませんか?
A: エスケープでも対策はできますが、処理の漏れや、データベースごとの特殊文字の違いによる見落としが起きやすい方法です。プリペアドステートメントのバインド機構を使う方が確実なので、根本的な対策として推奨されています。
A: エスケープでも対策はできますが、処理の漏れや、データベースごとの特殊文字の違いによる見落としが起きやすい方法です。プリペアドステートメントのバインド機構を使う方が確実なので、根本的な対策として推奨されています。
関連キーワード: SQLインジェクション、プリペアドステートメント、プレースホルダ、バインド機構、JDBC
設問1:〔Wシステムの実装に関する脆弱性〕について、(1)〜(3)に答えよ。
問題文を見る(2)図1には、XSS脆弱性を招く可能性を否定できないコードがある。N氏の指摘に従い、改修すべき行番号を全て答えよ。
模範解答
21、22、23
解説
解答の導き方
-
XSS脆弱性が生じる箇所の条件を確認する
XSSは、利用者やデータベースなど外部から来た値を、エスケープせずにそのままHTMLとして出力したときに生じます。本文でN氏は、XSS脆弱性を招く可能性の否定できない箇所について「HTML形式での出力時に処理するよう改修することとする」と指摘しています。そこで、図1のうちHTMLを出力している行の中から、外部から来た値をそのまま出力している行を探します。 -
HTMLを出力している行を分類する
図1でHTMLを出力しているのは、out.printlnを呼び出している13〜19行目、21〜24行目、26〜28行目です。このうち13〜19行目、24行目、26〜28行目は、プログラムに直接書かれた決まった文字列だけを出力しているので、XSSの原因にはなりません。20行目のwhileと25行目の}は、何も出力しません。 -
データベースの値をそのまま出力している行を特定する
残る21〜23行目は、検索結果のrsから取り出した値を、文字列連結でそのままHTMLに埋め込んでいます。21: out.println("<tr><td>" + rs.getString(1)); 22: out.println("</td><td>" + rs.getString(2)); 23: out.println("</td><td>" + rs.getString(3));データベースの値に、スクリプトを含む文字列が入っていないとは言い切れません。さらに、9行目にはSQLインジェクション脆弱性があるので、攻撃者はUNIONを使うなどして検索条件を細工し、任意の文字列を検索結果として返させることもできます。そうした文字列が21〜23行目でエスケープされずに出力されると、ブラウザ上でスクリプトとして実行されてしまいます。 -
以上から、XSS脆弱性を招く可能性を否定できず、出力時に処理するよう改修すべきなのは21行目、22行目、23行目です。
誤りやすいポイント
- 19行目の見出し行や20行目のwhileを含めてしまう。見出し行は決まった文字列だけを出力しており、whileは何も出力しないので、改修の対象ではありません。
- 利用者の入力を受け取る5行目を答えてしまう。N氏の指摘は出力時に処理するというものです。また、図1では、利用者が入力したcnameはHTMLに出力されていません。
- 9行目を答えてしまう。9行目はSQLインジェクション脆弱性の原因で、設問1(1)で扱う箇所です。
- アクセスや売上げは数値だろうと考えて、21行目だけにしてしまう。図1からは各列に入っている値の種類が分からず、getStringで文字列として出力しているので、22行目と23行目も可能性を否定できません。
FAQ
Q: 入力値をチェックすれば、出力時の処理は要らないのではありませんか?
A: 入力時のチェックも有効ですが、データベースの値はほかの機能や経路から登録されることもあり、全てを入力時に防げるとは限りません。出力する直前に、HTMLで特別な意味をもつ文字(<、>、&、"、')をエスケープすれば、どこから来た値でも安全に表示できます。これが設問1(3)で問われている対策です。
A: 入力時のチェックも有効ですが、データベースの値はほかの機能や経路から登録されることもあり、全てを入力時に防げるとは限りません。出力する直前に、HTMLで特別な意味をもつ文字(<、>、&、"、')をエスケープすれば、どこから来た値でも安全に表示できます。これが設問1(3)で問われている対策です。
Q: 見出し行も文字列を出力しているのに、なぜ対象外なのですか?
A: 見出し行が出力するのは、プログラムに直接書かれた変わらない文字列です。攻撃者が内容を変えられないので、XSSの原因にはなりません。
A: 見出し行が出力するのは、プログラムに直接書かれた変わらない文字列です。攻撃者が内容を変えられないので、XSSの原因にはなりません。
Q: データベースに保存された値が原因になるXSSは、何と呼ばれますか?
A: 攻撃用の文字列が一度保存され、表示されるたびに実行されるものは、格納型(持続型)XSSと呼ばれます。一方、リクエストに含まれた値がそのまま応答に出力されるものは、反射型XSSと呼ばれます。
A: 攻撃用の文字列が一度保存され、表示されるたびに実行されるものは、格納型(持続型)XSSと呼ばれます。一方、リクエストに含まれた値がそのまま応答に出力されるものは、反射型XSSと呼ばれます。
関連キーワード: クロスサイトスクリプティング、エスケープ処理、格納型XSS、SQLインジェクション、出力時対策
設問1:〔Wシステムの実装に関する脆弱性〕について、(1)〜(3)に答えよ。
問題文を見る(3)XSS脆弱性に対する修正を、N氏の指摘に従い、解答群の中から選び、記号で答えよ。
解答群
ア:CSRF対策トークンを使う。
イ:Refererヘッダの値のURLのドメイン名がWシステムのものであることを確認する。
ウ:出力時に<, >, &, ”, 'の各文字をエスケープする。
エ:同一生成元ポリシを適用する。
オ:バインド機能を使う。
模範解答
ウ
解説
解答の論理構成
- 【問題文】には
・「XSS脆弱性への対処としては、…HTML形式での出力時に処理するよう改修することとする。」
と記載されています。 - XSSはブラウザにスクリプトを注入させる攻撃なので、サーバ側で生成するHTMLに危険文字がそのまま混入しないよう「出力時」にエスケープ処理を行うことが王道対策です。
- 解答群を確認すると、文字実体参照(<、>、&、"、' など)に置き換える対策を示しているのは
「ウ:出力時に<、>、&、”、'の各文字をエスケープする。」
だけです。 - 以上より、N氏の指摘と合致するのは「ウ」であると論理的に導けます。
誤りやすいポイント
- 「オ:バインド機能を使う。」はSQLインジェクション対策の手法であり、XSSとは目的が異なります。
- 「ア:CSRF対策トークンを使う。」は利用者の意図しないリクエスト送信を防ぐ技術で、スクリプト埋め込みは防げません。
- HTML出力時のエスケープは、必ず“サーバ側で生成するすべての箇所”に適用する必要があります。テーブルの <td> だけでなく、<title> やJavaScript文字列リテラルなども見落としがちです。
- same-origin policy(解答群エ)やRefererチェック(解答群イ)は補助的な安全策に過ぎず、根本的にタグ混入を防ぐ仕組みではありません。
FAQ
Q: HTMLエスケープとURLエンコードは同じですか
A: いいえ。HTMLエスケープはタグや属性中に混入する制御文字を無害化し、URLエンコードはHTTPパラメータとして安全に送るための変換です。用途が異なります。
A: いいえ。HTMLエスケープはタグや属性中に混入する制御文字を無害化し、URLエンコードはHTTPパラメータとして安全に送るための変換です。用途が異なります。
Q: 文字をエスケープすれば <script> タグが完全に防げますか
A: 基本的な反射型XSSは防げますが、属性値やイベントハンドラ中に混入するケースなど文脈ごとのサニタイズも必要です。現代フレームワークのテンプレートエンジンを利用すると漏れを減らせます。
A: 基本的な反射型XSSは防げますが、属性値やイベントハンドラ中に混入するケースなど文脈ごとのサニタイズも必要です。現代フレームワークのテンプレートエンジンを利用すると漏れを減らせます。
Q: JavaScriptで出力を組み立てる際の注意点は
A: DOM操作にinnerHTMLを使うと再びXSSの入口になります。安全に扱うにはtextContentを用いるか、テンプレートリテラルに直接ユーザ入力を埋め込まない設計が推奨されます。
A: DOM操作にinnerHTMLを使うと再びXSSの入口になります。安全に扱うにはtextContentを用いるか、テンプレートリテラルに直接ユーザ入力を埋め込まない設計が推奨されます。
関連キーワード: XSS, エスケープ、サニタイズ、HTMLエンコード
設問2:〔Wシステムの設計に関する脆弱性〕について(1)、(2)に答えよ。
問題文を見る(1)本文中のa、bに入れる適切な字句を解答群の中から選び、記号で答えよ。
解答群
ア:Expires
イ:HttpOnly
ウ:Max-Age
エ:Secure
オ:Secured
模範解答
a:エ
b:イ
解説
解答の論理構成
- 問題文の確認
- 「指摘2:WシステムからのCookie発行の際、TLS通信時だけCookieをブラウザから送信するa属性を設定する必要がある。」
- 「指摘3:JavaScriptからCookieを操作できないようにするb属性を設定する方がよい。」
- TLS通信時だけ送信させる属性
- Cookieに付与することで “HTTPSでの通信時のみブラウザが送信する” 挙動を実現するのはSecure属性です。
- 解答群で該当するのは「エ:Secure」であり、これが a に入ります。
- JavaScriptからのアクセスを禁止する属性
- CookieがXSSなどで読み取られるのを防ぎ、クライアント側スクリプトから参照できなくするのはHttpOnly属性です。
- 解答群で該当するのは「イ:HttpOnly」であり、これが b に入ります。
- 以上より
- a = 「エ」
- b = 「イ」
誤りやすいポイント
- 「TLS通信時だけ」のキーワードでSecureを想起しにくく、似た表記の「オ:Secured」を選択してしまう。
- HttpOnlyは “HTTPだけで有効になる” と誤解し、サーバ接続プロトコル限定の属性だと思い込む。
- ExpiresやMax-AgeはCookieの有効期限を制御する属性であり、通信経路やJavaScriptからの参照可否とは無関係である点を取り違える。
FAQ
Q: Secure属性を付けてもHTTPでアクセスしたときはCookieが全く送られないのですか?
A: はい。Secureが付いたCookieはHTTPSでのリクエストにのみ同封され、平文HTTPではブラウザが送信しません。
A: はい。Secureが付いたCookieはHTTPSでのリクエストにのみ同封され、平文HTTPではブラウザが送信しません。
Q: HttpOnlyを設定してもXSSが完全に防げるわけではないのでは?
A: そのとおりです。HttpOnlyはCookie盗用を難しくしますが、HTML埋め込み型XSSで画面改ざんやCSRFトークン窃取などは依然として可能です。総合的な入力値検証とエスケープが必要です。
A: そのとおりです。HttpOnlyはCookie盗用を難しくしますが、HTML埋め込み型XSSで画面改ざんやCSRFトークン窃取などは依然として可能です。総合的な入力値検証とエスケープが必要です。
Q: SecureとHttpOnlyは同時に付けられますか?
A: 付けられます。Set-Cookieヘッダで両方を指定すれば、HTTPSでのみ送信され、かつJavaScriptからは参照できない安全性の高いCookieになります。
A: 付けられます。Set-Cookieヘッダで両方を指定すれば、HTTPSでのみ送信され、かつJavaScriptからは参照できない安全性の高いCookieになります。
関連キーワード: Cookie属性、Secure, HttpOnly, TLS, XSS
設問2:〔Wシステムの設計に関する脆弱性〕について(1)、(2)に答えよ。
問題文を見る(2)本文中の下線②について、Wシステムで採用するホワイトリスト方式の適切な仕様を、40字以内で具体的に述べよ。
模範解答
認証後のリダイレクト先のURLを、WシステムのFQDNのものに限定する。
解説
解答の論理構成
- 【問題文】には「指摘1:Wシステムの認証後のリダイレクタ機能は、オープンリダイレクタの問題を招く。修正する必要がある。」とあり、任意サイトへ転送されるリスクが指摘されています。
- 同じく【問題文】には「K氏は、指摘1に対しては、②ホワイトリスト方式によるリダイレクタ機能を採用することにした。」とあり、転送先を事前に許可したものに限定する方針が明示されています。
- オープンリダイレクトは、攻撃者が自ドメイン外のURLを設定できることが原因です。したがってホワイトリストには自システムが正規に用いるURLだけを登録するのが筋となります。
- Wシステムの正規URLは【問題文】に「WシステムのURLであるhttps://w-system.a-sha.jp/」とはっきり書かれており、このFQDN以外を転送先として許可する必要はありません。
- 以上より、「認証後のリダイレクト先のURLを、WシステムのFQDNのものに限定する」という仕様が、ホワイトリスト方式の具体策として適切であると結論付けられます。
誤りやすいポイント
- 複数サブパスを列挙するブラックリスト方式と混同し、危険URLを除外する方向で考えてしまう。
- httpとhttpsの区別を忘れ、同じFQDNでも暗号化されていない転送を許可してしまう。
- CDNsや外部APIなど別ドメイン利用時の転送と混同して、余計なFQDNまでホワイトリストに入れてしまう。
FAQ
Q: サブドメイン(例:api.w-system.a-sha.jp)へのリダイレクトは許可してよいですか?
A: サブドメインを利用する必要がある場合は、w-system.a-sha.jpのワイルドカード指定をホワイトリストに追加し、正式に管理下にあることを確認してから許可します。
A: サブドメインを利用する必要がある場合は、w-system.a-sha.jpのワイルドカード指定をホワイトリストに追加し、正式に管理下にあることを確認してから許可します。
Q: 動的に生成したクエリパラメータは検証不要ですか?
A: パス部分がホワイトリストのFQDNであっても、クエリパラメータで別サイトへメタリダイレクトするケースがあります。パラメータも入力バリデーション・エンコードを行うべきです。
A: パス部分がホワイトリストのFQDNであっても、クエリパラメータで別サイトへメタリダイレクトするケースがあります。パラメータも入力バリデーション・エンコードを行うべきです。
Q: リファラチェックだけでオープンリダイレクト対策になりますか?
A: リファラはユーザが改変できるため完全な対策にはなりません。サーバ側でリダイレクト先URLのFQDNをホワイトリスト照合する方が確実です。
A: リファラはユーザが改変できるため完全な対策にはなりません。サーバ側でリダイレクト先URLのFQDNをホワイトリスト照合する方が確実です。
関連キーワード: オープンリダイレクタ、ホワイトリスト、FQDN, URL検証、入力バリデーション
設問3:〔脆弱性対策の強化〕について、(1)〜(3)に答えよ。
問題文を見る(1)本文中の下線③について、どのように改善すべきか。改善された検査手順を30字以内で述べよ。
模範解答
セキュリティ検査を本番システムに対し行うこと
解説
解答の論理構成
- 【問題文】では、修正版は開発用PCにはあったものの「K氏からファイルを受け取ったF氏が、本番システムに修正版をデプロイし忘れたので、本番システムに脆弱性が残存したままとなっていた」と記載されています。
- つまり従来の検査対象は開発環境に限定されており、本番環境へ反映漏れがあっても気付けませんでした。
- その結果、N氏が「脆弱性検査手順を改善すべきである」と提案しています。
- 改善すべき点は、リリース後の“実際に顧客が利用する環境”を直接確認し、デプロイ漏れや設定ミスを即時検知できるようにすることです。
- よって、検査手順の改善は「セキュリティ検査を本番システムに対し行うこと」となります。
誤りやすいポイント
- 開発環境での検査強化と誤解し、検査ツールの追加導入や手動項目の充実と答えてしまう。
- 「ステージング環境での検査」と答え、実際の本番環境検査を外してしまう。
- 変更管理プロセス改善(別提案)と混同し、レビュー体制や承認フローの記述に寄せてしまう。
FAQ
Q: なぜステージング環境では不十分なのですか?
A: 本番へのデプロイ漏れや設定差異が原因で脆弱性が残存したため、本番環境そのものを対象にしないと同種の事故を防げないからです。
A: 本番へのデプロイ漏れや設定差異が原因で脆弱性が残存したため、本番環境そのものを対象にしないと同種の事故を防げないからです。
Q: 本番検査はサービス停止を招きませんか?
A: ツールの非破壊モードや負荷分散で時間帯を選ぶことで、可用性を保ちながら実施可能です。
A: ツールの非破壊モードや負荷分散で時間帯を選ぶことで、可用性を保ちながら実施可能です。
Q: 検査を外部委託すれば本番検査は不要ですか?
A: 委託の有無に関係なく、本番環境を検査対象に含める運用を組織の手順として固定化することが重要です。
A: 委託の有無に関係なく、本番環境を検査対象に含める運用を組織の手順として固定化することが重要です。
関連キーワード: 本番環境、デプロイ、脆弱性検査、変更管理
設問3:〔脆弱性対策の強化〕について、(1)〜(3)に答えよ。
問題文を見る(2)本文中の下線④について、XSS攻撃の試みを完遂できないことがある理由を30字以内で述べよ。
模範解答
ブラウザによってはXSS攻撃を遮断する機能をもつから
解説
解答の論理構成
- 【問題文】では、K氏が「ブラウザを用いた手動のセキュリティ検査」を実施したとあります。
- その検査で見落とした理由について、N氏は「④一部のブラウザではXSS攻撃の試みを完遂できないことがある」と指摘しています。
- 近年、多くの主要ブラウザにはXSS FilterやXSS Auditorなどと呼ばれる機能が実装されており、疑わしいスクリプトを自動的に除去・無効化します。
- この機能が働くと、攻撃用に入力した <script> タグなどが実際には実行されず、表面上は“問題が起きない”ように見えてしまいます。
- したがって、「一部のブラウザではXSS攻撃自体をブラウザ側が遮断するため、攻撃を再現できず検証に失敗する」という説明が成り立ちます。
誤りやすいポイント
- 「検査用文字列が不適切だった」と勘違いし、ブラウザ固有機能の存在を見逃す。
- ブラウザの開発者ツールでエラーが見えない=安全、と早合点する。
- WAFやサーバ側フィルタと混同し、クライアント側の防御機構を忘れる。
FAQ
Q: すべてのブラウザがXSSを自動遮断しますか?
A: いいえ。実装の有無や挙動はブラウザの種類・バージョンで異なります。
A: いいえ。実装の有無や挙動はブラウザの種類・バージョンで異なります。
Q: ブラウザが遮断してくれるなら、サーバ側対策は不要ですか?
A: 不要ではありません。攻撃者は別のブラウザやツールを使うため、サーバ側で確実に無害化する必要があります。
A: 不要ではありません。攻撃者は別のブラウザやツールを使うため、サーバ側で確実に無害化する必要があります。
Q: 手動検査時にブラウザ依存の影響を減らすには?
A: 自動化ツールや複数ブラウザでの確認、もしくはヘッドレスブラウザ+スクリプト無効化モードなどを併用します。
A: 自動化ツールや複数ブラウザでの確認、もしくはヘッドレスブラウザ+スクリプト無効化モードなどを併用します。
関連キーワード: XSS, ブラウザ、フィルタリング、脆弱性検査
設問3:〔脆弱性対策の強化〕について、(1)〜(3)に答えよ。
問題文を見る(3)本文中の下線⑤について、低減できるリスクを50字以内で述べよ。
模範解答
Wシステムで当該脆弱性に対処する前に始まる攻撃によって、セキュリティ侵害されてしまうリスク
解説
解答の導き方
設問は「下線⑤」で述べられた効果が何のリスクを低減するかを問うています。本文の該当部分に「Sサービスでは、Webシステムに脆弱性が発見された際、短時間で適切なシグネチャがWAFに追加される。」とあり、これが第一の根拠です。また本文には「本番システムに脆弱性が残存したままとなっていた。」という事例があり、修正版のデプロイ漏れなどで脆弱性が本番に残る時間的窓が存在することが示されています。
これらをつなげると、Sサービス(クラウド型WAF)の迅速なシグネチャ追加により、脆弱性の存在する期間中に外部からの攻撃が届くのを防止できるため、攻撃によって「Webアプリケーションサーバ」が侵害される可能性を低減できると判断できます。したがって、低減できるリスクは「脆弱性修正前に攻撃され、Webアプリケーションサーバが侵害されるリスク」です。
これらをつなげると、Sサービス(クラウド型WAF)の迅速なシグネチャ追加により、脆弱性の存在する期間中に外部からの攻撃が届くのを防止できるため、攻撃によって「Webアプリケーションサーバ」が侵害される可能性を低減できると判断できます。したがって、低減できるリスクは「脆弱性修正前に攻撃され、Webアプリケーションサーバが侵害されるリスク」です。
誤りやすいポイント
- WAF導入で脆弱性が完全になくなると誤解する:WAFは緩和策であり、根本対策はコード修正と適用です。
- 「リスク」を抽象的に書きすぎる:設問は「Webアプリケーションサーバへのリスクの低減」と明示しているため、侵害(サーバのコンプロマイズ)を具体的に記述する必要があります。
- シグネチャ更新の即時性を過信する:共有シグネチャで迅速対応できるが、未知の手法(回避)には無力な場合がある点を見落としやすいです。
FAQ
Q: SサービスのWAFで完全に改修を省略してよいですか?
A: いいえ。WAFは攻撃を緩和する補完的な対策であり、脆弱性の根本修正(コード修正と本番適用)は必須です。
A: いいえ。WAFは攻撃を緩和する補完的な対策であり、脆弱性の根本修正(コード修正と本番適用)は必須です。
Q: どのタイミングのリスクを低減するのですか?
A: 脆弱性が発見されてから修正を本番へ反映するまでの「時間的窓」での攻撃によるサーバ侵害リスクを低減します。
A: 脆弱性が発見されてから修正を本番へ反映するまでの「時間的窓」での攻撃によるサーバ侵害リスクを低減します。
Q: どんな攻撃が想定されますか?
A: 本文の脆弱性例に沿えば、SQLインジェクションやXSSなど、既知の攻撃パターンによる侵害が想定されます。
A: 本文の脆弱性例に沿えば、SQLインジェクションやXSSなど、既知の攻撃パターンによる侵害が想定されます。
関連キーワード: WAF、シグネチャ、ゼロデイ脆弱性、SQLインジェクション、クロスサイトスクリプティング




