Webアプリケーション開発のセキュリティ対策【情報処理安全確保支援士試験 平成29年度 秋期 午後1 問2 設問1】

平成29年度 秋期 情報処理安全確保支援士試験 午後1 問2

問2 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コードである。

f:id:aolaniengineer:20200308211047p:plain

f:id:aolaniengineer:20200308211116p:plain

f:id:aolaniengineer:20200308211141p:plain

 続いてN氏が本番システムのソースコードを確認し、次の指摘をした。

・SQLインジェクション脆弱性への対処としては、図1の(ア:9)行目から(イ:11)行目までを①適切なコードに書き換える必要がある。

ア:9イ:11

SQLインジェクションとは、Webアプリケーションに対する攻撃手法の一つで、外部から指定するパラメータの一部にSQL文の断片などを混入させてデータベースに不正な操作を行うものです。

SQLインジェクションでは、パラメータをSQL文に含んだ形で、そのパラメータを実際の値に展開するとき、文法的に正しく文を生成しないことが脆弱性となります。

具体的にはパラメータに与えられた値がリテラル(SQL文中で指定する文字列や数値などの定数)の外にはみ出した状態になり、リテラルの後ろに続く文として解釈されてしまいます。

SQL呼出を安全に実現するには、パラメータを正しくリテラルとして展開することが必要であり、一般的な方法としては、プレースホルダを使用します。

プレースホルダとは、パラメータ部分を「?」などの記号で示しておき、後から実際の値を機械的な処理で割り当てる方法です。

図1においては、9行目でSQL文を生成し、それを11行目で実行していますので、この部分が該当する箇所になります。

 9: String sql = “SELECT * FROM companylist WHERE cname = ‘ ” + cname + ” ‘ “;

10: Statement stmt = conn.createStatement();

11: ResultSet rs = stmt.executeQuery(sql); 

①について、必要な全てのコード(選択):カ、ア、イ、ウ

f:id:aolaniengineer:20200308211824p:plain

プレースホルダによるSQL文の組み立てとしては、プレースホルダ(パラメータ部分を「?」などの記号で示した状態)のままのSQL文をデータベースエンジン側にあらかじめ送信して、実行前に、SQL文の構文解析などの準備をしておきます。(以下の1、2行目)

そして、SQL実行の段階で、実際のパラメータの値をデータベースエンジン側に送信し(3行目)、データベースエンジン側がバインド(実際の値を割り当てる)処理します。(4行目)

1: String sql = “SELECT * FROM companylist WHERE cname = ?”;

2: PreparedStatement pstmt = conn.prepareStatement(SQL);

3: pstmt.setString(1, cname);

4: ResultSet rs = pstmt.executeQuery();

・XSS脆弱性への対処しては、XSS脆弱性を招く可能性の否定できない箇所について、HTML形式での出力時に処置するよう改修することとする。

図1には、XSS脆弱性を招く可能性を否定できないコードがある。N氏の指摘に従い、改修すべき行番号は?:21、22、23

クロスサイトスクリプティングでは、Webアプリケーションにスクリプトを埋め込むことが可能な脆弱性がある場合において、これを悪用した攻撃により、利用者のブラウザ上で不正なスクリプトが実行されてしまう可能性があります。

N氏の指摘にあるHTML形式での出力に関する部分は、「out.println()」メソッドになります。そのうち、SQL文を実行した結果を処理している21〜23行目の部分が、XSS脆弱性を招く可能性があります。

21: out.println(“<tr><td>” + rs.getString(1));

22: out.println(“</tr><td>” + rs.getString(2));

23: out.println(“</tr><td>” + rs.getString(3));

XSS脆弱性に対する修正を、N氏の指摘に従い、解答群の中から選べ。:

f:id:aolaniengineer:20200308212322p:plain

XSSへの対策としては、「Webページに出力する全ての要素に対して、エスケープ処理を施す」ことが根本的な対策になります。

特に必須となるのが、外部からWebアプリケーションに渡される入力値の文字列や、データベースやファイルから読み込んだ文字列です。

 今回指摘された脆弱性は、検査すべき項目の中に含まれており、K氏によるブラウザを用いた手動のセキュリティ検査によって発見され、開発用PC上のコードでは先月に修正されていた。しかし、K氏からファイルを受け取ったF氏が、本番システムに修正版をデプロイし忘れたので、本番システムに脆弱性が残存したままとなっていた。

【出典:情報処理安全確保支援士試験 平成29年度秋期午後1問2(一部、加工あり)】