情報セキュリティスペシャリスト試験情報 > テクニカルエンジニア(情報セキュリティ)平成20年度試験メニュー >問題と解説
テクニカルエンジニア(情報セキュリティ)平成20年度試験問題(午後2問1)
問1 Webアプリケーションシステムの脆(ぜい)弱性対策に関する次の記述を読んで,設問1〜3に答えよ。
A社は従業員数500名の卸売会社で,メーカから事務用品を仕入れ,小売店向けに販売している。A社の情報システム部は,企画開発課と運用課で構成されている。企画開発課は受発注にかかる時間と経費を削減するために,商品の受発注処理を電子化したXシステムを3年前に自社開発し,運用課がXシステムの運用を担当している。
〔Xシステムの概要〕
図1にXシステムの構成を示す。Xシステムの利用者は,メーカの受注担当者,小売店の発注担当者及びA社の受発注担当者で,インターネットからアクセスし,事務用品の受発注を行う。ログインの際は,利用者IDとパスワードを入力する。入力されたパスワードからはそのハッシュ値(以下,パスワードハッシュという)が算出される。利用者の認証は,利用者IDとパスワードハッシュを,それぞれ表1の利用者テーブル(以下,利用者TBLという)のUSR_ID,PASSWORDと照合して行われる。利用者に実行が許可されている機能は,利用者IDごとに定義されており,[ a ]制御されている。
なお,Xシステムの各サーバのOSはUNIX,通信プロトコルはHTTP over SSLである。
表1 利用者TBLの仕様 テーブル名:M_USER 列名 データ型(バイト数) 内容 備考 USR_ID CHAR(12) 利用者ID 主キー PASSWORD CHAR(32) パスワードハッシュ USR_NM VARCHAR(40) 利用者氏名 USR_ADDR VARCHAR(60) メールアドレス COM_ID CHAR(8) 会社ID 業種区分+連番で構成 : : : :
〔インシデント発覚〕
休日明けの2007年10月15日(月),Xシステムの多数の利用者から,これまで利用できていたパスワードでログインできなくなったという苦情が利用者問合せ窓口に殺到した。運用課の窓口担当者であるD君は重大なトラブルの可能性を考慮し,運用課のC課長に状況を報告した。その後,C課長は企画開発課のF課長に原因の調査と対策の検討を依頼した。F課長は,部下のE君に調査を命じた。E君はまず,認証情報が格納されている利用者TBLに異常がないかどうかを調査した。
次は,E君がF課長に調査結果を報告した際の会話である。
E君 :それでは今回の調査結果を報告します。結論から申しますと,利用者TBLのすべての行のPASSWORDが,同じ値に変更されていました。これは推測ですが,インターネットからの不正アクセスか,運用担当者によるSQLコマンドの発行ミスが原因だと思われます。念のため,C課長に問い合わせたところ,ここ数日間は利用者TBLを変更するような処理を実施していないとのことでした。一方,管理者の認証情報は,利用者TBLではなく別のテーブルに格納されていたので,管理者機能は現在でも利用できます。 F課長 :君の推測はログから確認できるのかな。 E君 :いいえ。DBサーバのアクセスログ(以下,DBログという)が収集されていないので確認はできません。さらに,運用担当者であればC課長の許可なく利用者TBLを含むすべてのDBにアクセスできる状況であることと,DBにログインするためのDBMSの利用者ID(以下,DBアカウントという)を運用課の4名の担当者で共用していることも分かりました。これらの運用状況は改善する必要がありますね。 F課長 :そのとおりだ。しかし,DBログを収集していなくても,DBのトランザクションログ(以下,TRNログという)を調べれば,更新時刻やどのDBアカウントによる更新なのかが分かるはずだ。 E君 :当社にはTRNログを本格的に解析できる者がいません。 F課長 :そうか。では,TRNログの解析や,不正アクセスの可能性についての調査を,セキュリティ専門会社に依頼することにしよう。
F課長は,セキュリティ専門会社のB社に調査を依頼した。B社ではG氏をリーダとして調査することにした。
〔調査前のB社によるXシステムの概要確認〕
本格的な調査を開始する前に,F課長とG氏によって,図1〜3,表1,2などの資料を使って,Xシステムの概要確認が行われた。次は,そのときの会話である。
F課長 :まず,Xシステムの入出力画面について説明します。トップ画面は,メーカ用,小売店用,A社用の業種区分別に3種類あり,それぞれ別々のURLで閲覧するようにしてあります。しかし,それらのトップ画面から呼び出されるCGIプログラムlogin.cgi,info.cgiは共通です。 G氏 :お知らせ表示の機能(以下,お知らせ機能という)は,ログインしていなくても利用できるようにしているのですね。 F課長 :はい。年に数回実施するDBのメンテナンスやそのほかの作業で,Xシステムにログインできないときに,利用者に通知する必要があるからです。 G氏 :なるほど。それから,お知らせ表示画面では,タイトルとお知らせ内容はお知らせTBLから取得し,フッタ部は業種区分別ファイルの内容を表示しているのですね。
表2 お知らせTBLの仕様 テーブル名:M_NEWS 列名 データ型(バイト数) 内容 備考 NWS_ID CHAR(4) お知らせID 主キー NWS_NM VARCHAR(100) タイトル NWS_BODY VARCHAR(4,000) お知らせ内容 : : : :
(中略)
F課長 :はい。そのために,それぞれのトップ画面のお知らせエリアのhiddenフィールド“kind”(以下,kindという)には,業種区分を表す文字列がセットされており,お知らせ機能は,ログインしていなくても利用者の業種区分を識別できます。
G氏 :利用しているDBMSに対して特殊な設定をしていませんか。 F課長 :標準のDBMS初期設定値のままで,特殊な設定はしていません。
図3 Xシステムで利用しているDBMSの仕様(抜粋)
DBMS仕様 ・DB管理テーブル(以下,DB管理TBLという)の仕様
0) 共通事項
・ DB管理TBLは,DBMSによって管理され,管理対象の属性が変更された場合は自動的に更新される。 ・ DB管理TBLに対するアクセス権限は,DBアカウント別に付与,削除が可能である。 1) DBアカウント情報管理テーブル(テーブル名はADMIN_ALL_USERS)
・ DBMS内のすべてのDBアカウントのアカウント名(USER_NAME),パスワード文字列のハッシュ値(USER_PASSWORD)などのDBアカウント情報が管理されている。 2) テーブル情報管理テーブル(テーブル名はADMIN_ALL_TABLES)
・ DBMS内のすべてのテーブルのテーブル名(TABLE_NAME),スキーマ(SCHEMA)などのテーブル情報が管理されている。
G氏 :DBサーバにアクセスできるのは,Webサーバと運用課の専用PCだけですか。 F課長 :はい。DBサーバ側でアクセス元のIPアドレスを制限しています。 G氏 :運用課のC課長は,利用者TBLを変更するような処理はしていないと言っているのですね。社内の者がPASSWORDを改ざんしてもメリットはないので,まずはインターネットからの不正アクセスの可能性について調査します。10月13日(土)のWebサーバのアクセスログ(以下,Webログという)を見せていただけますか。 F課長 :はい,すぐに用意します。
〔原因の判明とインシデント対応〕
G氏は,F課長が用意したWebログを調査した。次は,そのときのG氏とF課長の 会話である。
G氏 :思ったとおり,SQLインジェクションによる攻撃を受けていました。図4をご覧ください。左から順に,空白で区切って,リクエスト日,リクエスト時刻,クライアントのIPアドレス,HTTPのアクセスメソッド,パス名,クエリストリング,ステータスコードの各項目が並んでいます。どうやらPASSWORDの改ざんだけでなく,USR_NMとUSR_ADDRからも大量にデータが盗まれた可能性があります。
このような不正アクセス時の対応手順は策定されていますか。
注 Fields:に続く各項目は,ログの項目名を示す。
図4 2007年10月13日(土)のWebログ(抜粋) #Fields: date time client-ip method pathname query-string status
(省略)
2007-10-13 02:24 aa.cc.kk.hh GET /mlogin.html - 200
2007-10-13 02:25 aa.cc.kk.hh GET /scripts/info.cgi "?nid=0701&kind=m" 200
2007-10-13 02:29 aa.cc.kk.hh GET /scripts/info.cgi "?nid=0701&kind=../etc/passwd" 200
(省略)
2007-10-13 03:00 aa.cc.kk.hh GET /scripts/info.cgi" ?nid=0701&kind=ls |" 200
2007-10-13 03:13 ff.aa.rr.pp GET /slogin.html - 200
2007-10-13 03:14 dd.ee.ss.tt GET /slogin.html - 200
2007-10-13 03:15 dd.ee.ss.tt GET /scripts/info.cgi "?nid=0701&kind=m" 200
2007-10-13 03:16 dd.ee.ss.tt GET /scripts/info.cgi "?nid=gf34' union select USER_NAME,USER_PASSWORD from ADMIN_ALL_USERS where (省略) &kind=m" 200
(省略)
2007-10-13 03:17 dd.ee.ss.ll GET /scripts/info.cgi "?nid=as23' union select TABLE_NAME,SCHEMA from ADMIN_ALL_TABLES where (省略) &kind=m" 200
2007-10-13 03:18 dd.ee.ii.jj GET /scripts/info.cgi "?nid=0701';update M_NEWS set PASSWORD='fas7wgw4&kind=m" 200
2007-10-13 04:01 aa.cc.kk.hh GET /scripts/info.cgi "?nid=0701&kind=../ls |" 200
2007-10-13 04:17 dd.ee.ii.jj GET /scripts/info.cgi "?nid=0703' union(省略) &kind=m" 200
2007-10-13 04:28 dd.ee.ii.jj GET /scripts/info.cgi "?nid=0701';update M_USER set PASSWORD='fas7wgw4&kind=m" 200
timeの秒の部分は省略されている。
(省略)は,ログ出力内容の省略を意味する。
query-stringは,二重引用符で囲まれ,URLデコード済の値である。
F課長 :対応手順は策定していませんが,PASSWORDが改ざんされ,利用者がログインできない状態でしたので,CIOと相談し,指示に従ってXシステムを停止しておきました。 G氏 :良い判断でしたね。そのまま運用を継続していたら被害が拡大したかもしれません。 F課長 :被害拡大は防げましたが,今後はどうすればよいでしょうか。 G氏 :被害者への連絡,捜査機関への被害届出,場合によっては情報公開や監督官庁への報告をしていただく必要がありますので,証拠保全と正確な情報の把握から始めます。Webログ,TRNログに加えて,ソースコードの解析,図4で見られた攻撃の再現検証,及び疑似侵入テストを実施し,重要な箇所については詳細な調査を行いたいのですが,よろしいですか。 F課長 :部下のE君をサポートに付けますので,調査をお願いします。 G氏 :承知しました。明日の夕方に報告いたします。可能であれば,CIOも同席してくださるようお願いします。
〔調査結果の報告〕
次は,翌日夕方の調査結果の報告におけるG氏とF課長の会話である。
G氏 :それでは今回の調査結果を報告します。表3をご覧ください。Webログから確認できる範囲の最初の攻撃は2007年8月24日(金)2時24分で,それ以降も41回の攻撃を受け,累計で約4件,325人分の情報が盗まれていました。お知らせ機能だけが攻撃を受けており,そのほかの機能は無事でした。この機能はログインしなくても利用でき,かつ,脆弱性があったからではないかと推測されます。
注 網掛けの部分は,設問の関係上,表示していない。
表3 攻撃一覧(抜粋) 攻撃の時間帯 攻撃元IPアドレス 被害の概要 2007/08/24 02:24〜
2007/08/24 04:41aa.bb.xx.yy 91件の利用者氏名,メールアドレスの流出 : : : 2007/10/13 02:24〜
2007/10/13 06:01aa.cc.kk.hh OSコマンド実行結果の不正閲覧
想定外ファイルの不正参照: : : 2007/10/13 03:14〜
2007/10/13 05:17dd.ee.ss.tt 〔1〕DB管理TBLの不正参照 dd.ee.ii.jj 〔2〕パスワードハッシュの改ざん
329件の利用者氏名,メールアドレスの流出2007/10/14 01:18〜
2007/10/14 01:19aa.bb.xx.zz 24件の利用者氏名,メールアドレスの流出
F課長 :USR_NMとUSR_ADDRが流出した可能性があるのですね。 G氏 :はい。図4で見られた攻撃を再現させたところ,union句を利用して利用者TBLのデータを参照できることを確認しました。
G氏は,調査結果の報告を終え,今後の対策について説明を進めた。
〔SQLインジェクション対策〕
次は,お知らせ機能におけるSQLインジェクション対策に関する会話である。
F課長 :図2のお知らせエリアには入力フィールドがないので,SQLインジェクション対策は必要ないと思っていました。 G氏 :画面上の入力フィールドの有無とセキュアプログラミングの要否は関係ありません。SQLインジェクション対策について言えば,SQL文の要素になる文字列に対しては,すべて,エスケープ処理やDBのバインド機構の利用が必要です。実際に攻撃を受けていたお知らせ機能のCGIプログラム(図5)を基にもう少し詳しく説明します。このプログラムはPerlを用いて作成されています。
G氏は,SQLインジェクション対策について説明した。
〔そのほかの脆弱性とその対策〕
G氏は,テスト環境でXシステムに対して疑似侵入テストを実施した際に,SQLインジェクション以外にも幾つかの脆弱性を発見した。次は,それらの脆弱性についての会話である。
G氏 :まず,表3中の下線〔1〕について再現できるか検証したところ,各プログラムからDBへのアクセスに利用されているDBアカウントで,“ADMIN_ALL_USERS”や“ADMIN_ALL_TABLES”のデータを参照できました。DB管理TBLに対する参照権限は本当に必要でしょうか。 F課長 :いいえ,必要ではありません。それが何か問題なのでしょうか。 G氏 :プログラムの修正漏れなどによって,万一脆弱性が残ってしまった場合に備えて,被害を最小にするためにDB側で,[ b ]するのが定石です。
次に,そのほかの脆弱性とその対策に移ります。Xシステムでは利用者ごとに許可されている機能が定義され,[ a ]制御されているはずですが,一部の機能では,実行用のURLを直接入力することによって,テスト用アカウントには許可されていないはずの機能を実行できました。F課長 :ログイン後のメニュー画面には,利用者に許可されている機能のボタンだけを表示していたのですが,実行用のURLを直接入力することで実行できてしまったということですね。 G氏 :はい。ログインした利用者が各機能を実行してよいか否かをサーバ側で確認する[ a ]制御を,すべての機能に対して必ず実装してください。 F課長 :分かりました。全機能を確認し,修正します。 G氏 :また,ログアウト後にブラウザの“戻る”ボタンを押すことで,再びログインしなくても,それまで利用していたページを表示させ,Xシステムの機能を実行することができました。これを防ぐために,ログアウト処理で[ c ]をしてください。 F課長 :分かりました。ログアウト処理の部分を修正します。
引き続き,G氏はそのほかの脆弱性についても報告した。
〔インシデント対応策の検討〕
検出されたすべての脆弱性についての報告が終了した。次は,インシデント対応策についての会話である。
F課長 :お蔭様でインシデント対応策のめどがつきました。あとは当社でプログラムの修正を実施すれば再開できますね。 G氏 :いいえ。全プログラムを対象に調査を実施したわけではないので,まだすべての脆弱性を発見できたわけではありません。費用や期間の問題もありますが,できれば全プログラムを対象にセキュリティ検査を実施した方がよいので,ご検討ください。 F課長 :分かりました。ただ,Xシステムの場合,ほとんどの機能はログインしてから利用できるようになっており,利用者は取引先の受注,発注担当者と当社の受発注担当者だけですので,今回脆弱性を指摘された部分を中心に再検査をすればよいと思っています。それにしても今回は,Webログをきちんと取っておいたことは不幸中の幸いでした。 G氏 :そうですね。しかし,攻撃者がGETではなくPOSTで攻撃してきたら,図4の項目の[ d ]に有益な情報が残らないので,漏えいした情報を確認することはできなかったでしょう。Webアプリケーションの場合,ログの種類としては,主にWebログ,TRNログ,DBログがありますが,〔3〕各ログ単独では,いつ,だれが,何を,どうしたかの情報が不足しています。
G氏は,その理由について説明した。続いて,運用課におけるシステム運用の問題点と対策についても説明した。
G氏 :最後に,長期的な観点から,Xシステムにおける同様の不正アクセスに対する防止策の検討と,万一発生した場合の対応策を用意しておく必要があります。防止策については,先ほど申し上げたような対策を実施する必要があります。発生時に備える対応策としては,不正アクセスをできる限り早く検知するための対策や,〔4〕検知後の対応が迅速かつ正確に行えるようにする対策を実施しておく必要があります。 F課長 :今回はたまたま初動対応がうまくいきましたが,だれが対応しても同じようにできなくてはいけませんからね。 G氏 :そのとおりです。
G氏は,インシデント対応策について更に具体的に説明した。
その後,捜査機関によって攻撃者が逮捕された。幸いにも,盗まれた情報が二次利用されたとの報告はなかった。また,流出した個人情報にかかわる利用者に対する事情説明や情報公開なども適切に行われた。
脆弱性が発見されたプログラムは修正され,B社によるセキュリティ検査を実施した上でリリースされた。そして,各利用者に新たなパスワードを発行して,Xシステムは,安全にサービスを再開することができた。
設問1 脆弱性対策について,(1)〜(3)に答えよ。
(1) 本文中の[ a ],[ c ]に入れる適切な字句を解答群の中から選び,記号で答えよ。
解答群
ア エラーログの採取 イ サニタイジング ウ 識別 エ セッション情報の破棄 オ 認可 カ 認証 (2) 図5のプログラムに対して,コマンドifconfigの実行結果を表示させる攻撃があった。攻撃時にkindに指定された文字列を,20字以内で答えよ。ここで,コマンドifconfigの絶対パスは,/bin/ifconfigであるものとする。 (3) 図5のプログラムにおいて,25行目のopen関数をsysopen関数に変更した場合,A社が受けていたどの攻撃が防げるか。20字以内で答えよ。また,open関数に起因する問題点のうち,sysopen関数に変更しただけでは解決できない問題点を,30字以内で述べよ。
設問1の正解と解説へ
設問2 SQLインジェクション対策について,(1)〜(4)に答えよ。
(1) 表3中の下線〔2〕が実行された日付及び時刻を答えよ。 (2) 本文中の[ d ]に入れる適切な字句を,12字以内で答えよ。 (3) 図5のプログラムにおいて,DBMSの特殊文字をエスケープ処理するSQLインジェクション対策用サブルーチンを利用するとした場合,このサブルーチンを適用すべき最も適切な変数はどれか。該当するものを解答群の中から選び,記号で答えよ。
解答群
ア $cgi イ $nws_id ウ $qry エ $ary[0]
(4) 本文中の[ b ]に入れる対策内容を,50字以内で述べよ。
設問2の正解と解説へ
設問3 DBサーバに対する運用上の問題とインシデント対応策について,(1)〜(3)に答えよ。
(1) DBサーバに対する運用課における運用上の問題点を二つ挙げ,それぞれ30字以内で述べよ。 (2) 本文中の下線〔3〕でG氏が言及している,TRNログ単独及びDBログ単独では不足している情報は何か。各ログについて該当するものを解答群の中からすべて選び,記号で答えよ。また,DBログに不足している情報を補うためにはXシステムをどのように改修すべきか。50字以内で述べよ。
解答群
ア いつ(実行日時) イ だれが(利用者ID) ウ 何を(どのテーブル) エ どうした(参照,更新,削除) (3) 本文中の下線〔4〕でG氏が言及している,実施すべき対策を二つ挙げ,それぞれ25字以内で述べよ。
設問3の正解と解説へ
メニューへ戻る