情報処理安全確保支援士試験 過去問 2022年(令和4年) 春期 午後Ⅰ 問1

Webアプリケーションプログラム開発のセキュリティ対策

H社は、Webアプリケーションプログラム(以下,Webアプリという)を開発する従業員200名の会社である。H社では、開発部がWebアプリを開発し,情報セキュリティ部が、表1に示す方法に従って、脆弱性検査を実施する。

表1 脆弱性検査の方法(抜粋)
項番 脆弱性 検査の方法 脆弱性が検出された場合の対策方法
1 HTTPヘッダインジェクション 利用者の入力を基にHTTPレスポンスヘッダを生成する処理において、①改行コードを意味する文字列を入力したときに、HTTPヘッダフィールドが追加されないことを確認する。 (省略)
2 SQLインジェクション (省略) SQL文の組立てにおいて、SQL文のひな形の中に②変数の場所を示す?記号を置く技法を利用する。
3 メールヘッダインジェクション (省略) 次のいずれかの対策を実施する。
(1) メールヘッダを固定値にする。
(2) 外部からの入力を適切に処理するメール送信用APIを使用する。
(3) 外部からの入力の全てについて、aを削除する。

開発部では、自部で開発したSシステムというWebシステムを利用して、コーディングルールなどの社内ルールを含む各種の情報を共有している。Sシステムの利用者は、ログイン後に情報の投稿と表示を行うことができる。投稿された情報はデータベースに格納される。

ログインから情報表示までのSシステムの画面遷移を表2に示す。

表2 ログインから情報表示までのSシステムの画面遷移
ログインから情報表示までのSシステムの画面遷移

【Sシステムの改修におけるアクセス制御要件の追加】

開発部で新しいプロジェクトを立ち上げることになり、開発部の各プロジェクト内の情報共有を強化することにした。開発部は、次のようにSシステムを改修する方針とした。

  • 社内ルールだけでなく、各プロジェクトの計画書や各種の設計情報を各プロジェクト内で共有できるようにする。
  • 各プロジェクトの計画書や各種の設計情報については、情報が表示できる利用者を、情報の作成者と同じプロジェクトに参加する利用者に限定できるようにする。

なお、開発部員は、一時期には一つのプロジェクトだけに参加する。同時に複数のプロジェクトには参加しない。

開発部のDさんが、Sシステム改修の担当者に任命され、利用者のアクセス制御を次のように設計した。

  • プロジェクトを識別するプロジェクトIDを連番で採番する。
  • 利用者IDそれぞれに対して、その利用者が参加するプロジェクトのプロジェクトIDを登録しておく。
  • Sシステムに格納される各情報に、作成者の参加するプロジェクトを示すプロジェクトIDをあらかじめ付与しておく。
  • プロジェクトIDを次に示す方法で取得し、そのプロジェクトIDを用いてアクセス制御する。

方法1:ログイン時にその利用者IDに対して登録されているプロジェクトIDを取得し、GETリクエストのクエリ文字列に、"id=プロジェクトID"の形式で指定する。情報選択機能は、クエリ文字列からプロジェクトIDを取得する。

【情報選択機能の脆弱性】

Sシステム改修後の脆弱性検査で、情報セキュリティ部は、プロジェクトの情報番号と情報名を、そのプロジェクトには参加していない利用者が、③そのプロジェクトに参加しているかのように偽ってリスト可能であるという脆弱性を指摘した。これは、情報選択機能においてクエリ文字列で受け取ったプロジェクトIDをチェックせずに利用していることに起因していた。この指摘を受けて、Dさんは、プロジェクトIDの取得方法として、次に示す別の方法を提示した。

方法2:情報選択機能の利用時に、セッション情報から利用者情報を取得する。情報選択機能は、当該利用者情報からプロジェクトIDを取得する。

情報セキュリティ部は、④方法1の脆弱性が方法2で解決されることを確認した。

Dさんは、プロジェクトIDの取得方法を方法2に修正した。

情報選択機能及び情報表示機能が参照するデータベースのE-R図を図1に、修正後の情報選択機能のソースコードを図2に示す。

参照するデータベースのE-R図
図1 参照するデータベースのE-R図
(省略)// package宣言,import宣言など
1: public class SelectServlet extends HttpServlet {
    (省略)// 変数の宣言やメソッドの定義など
2:    protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
3:        java.sql.Connection con = null;
4:        try {
            (省略)// 初期化処理など
5:            con = java.sql.DriverManager.getConnection((省略));    // データベースに接続する処理
6:            int projectId = (省略);    // 利用者の参加プロジェクトのプロジェクトIDを利用者テーブルから取得し,代入する処理
7:            String sql = "SELECT 情報番号, 情報名 FROM 情報管理テーブル WHERE プロジェクトID = ?";
8:            java.sql.b stmt = con.prepareStatement(sql);
9:            c.setInt(1, projectId);
10:           java.sql.ResultSet rs = stmt.executeQuery();
            (省略)// 例外処理やその他の処理
図2 修正後の情報選択機能のソースコード

【情報表示機能の脆弱性】

情報セキュリティ部は、情報表示機能にも情報選択機能と同様の脆弱性があることを指摘した。Dさんは、情報表示機能にも同様の修正を行った。修正後の情報表示機能のソースコードを図3に示す。

(省略)// package宣言,import宣言など
1: public class ShowServlet extends HttpServlet {
    (省略)// 変数の宣言やメソッドの定義など
2:    protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
3:        int documentNo = Integer.parseInt(request.getParameter("no"));
4:        java.sql.Connection con = null;
5:        try {
            (省略)// 初期化処理など
6:            con = java.sql.DriverManager.getConnection((省略));    // データベースに接続する処理
7:            int projectId = (省略);    // 利用者の参加プロジェクトのプロジェクトIDを利用者テーブルから取得し,代入する処理
8:            String sql = "SELECT 情報番号, 情報名, 情報内容 FROM 情報管理テーブル WHERE d";
9:            java.sql.b stmt = con.prepareStatement(sql);
            (省略)// SQL文のひな型に変数を代入する処理
10:           java.sql.ResultSet rs = stmt.executeQuery();
            (省略)// 例外処理やその他の処理

注記:10行目より後の(省略)に,projectId, documentNoを用いた処理はない。

図3 修正後の情報表示機能のソースコード

情報セキュリティ部による脆弱性検査に合格後、Sシステムの改修版がリリースされ、各プロジェクト内の情報共有が強化された。

出典:令和4年度 春期 情報処理安全確保支援士試験 午後Ⅰ 問1