このエラーから , サーバの製品名や最初のテープル名は user table だということ が推測できる ( テープル名からこのテープルがログイン名とパスワードを含んでいる と推測できる ) 。さらにこの情報をもとに次の SQL 文を混人すると , 図 2 のような工 ラーメッセージが表示される。 「 10 UN 工 ON SELECT TOP 1 COLUMN NAME FROM 工 NFORMAT 工 ON SCHEMA . COLUMNS WHERE TABLE NAME='user table'—」 Microsoft OLE DB Provider for ODBC Drivers error '80040e07 ー [Microsoft] [ODBC SQL Server Driver] [SQL Server] Syntax error converting the varchar value 'user id' tO a column of data type int . /profile . asp, line 図 2 ODBC 工ラーメッセージ ( カラムの推測 ) このエラーからは u s er table のフィールド名またはカラム名が user_id である ことが分かる。 SQL インジェクションを行う攻撃者はこのようなプラウザに表示さ れるデータベースのエラーメッセージから , データベースの種類やバージョン , テー プルの構造やテープルの関連性を読み取り , 攻撃の材料としていく。そして , 同じよ うな攻撃を繰り返すことによって , テープル名とカラム名が分かった後はデータベー スのデータを一つずっ取得することができる。つまりエラー画面を使ってデータベー スの全データを抜き出すことができてしまう。したがって , SQL 文が直接含まれるよ うなエラーメッセージは開発時にはデバッグ用の情報として必要となるが , サービス 開始後は一般の利用者に対しては見せないようにしなければならない。開発が終了し たらデバッグ用のメッセージは必ずオフにし , 攻撃者に対して有利な情報を与えない ようにしていく必要がある。したがって , 「データベースの種類 , 工ラー原因 , テープ ル構造など攻撃に有用な情報を与えないため」のように解答するとよい。 [ 設間 4 ] プレースホルダを利用したコードが安全な理由について答える問題である。プレー スホルダとは , SQL 文の組立て時にまだ割り当てられていない記号文字 ( プレース ホルダ , 通常は ? を使用 ) を使用してあらかじめ SQL 文の雛形を用意し , 後に実際 の値 ( バインド変数 ) を割り当てて SQL 文を完成させる方法である。 $sth—>execute ($user id, $password) ー id=? AND ′ "SELECT user id FROM users WHERE $sth = $dbh->prepare ( 図 3 バインド変数プレースホルダ プレースホルダの利用例 446
オプションである。 ェ : 所有者のアクセス権限に依存する。 問 3 ー 9 ウ 765171 K バッフアオーパフロー攻撃は , バッフアへの書込みがオーパフローしてバッフ ア領域に隣接するメモリ領域が上書きされるものである。対策としては , バッフ ア領域を超える入力データをそのままバッフアへ書き込まないことが基本とな る。書込み先のバッフアサイズを指定できる関数では , 書込みサイズをバッファ サイズに合わせることで , オーパフローを防止できる。したがって , ( ウ ) が適切 である。 ア : 人力データサイズに合わせるのではなく , バッフアサイズに合わせるのが正 しい。 イ : バッフアサイズを任意に設定するのではなく , 書込みできる上限のバイト数 に合わせる。 工 : ループの終了条件には , バッフアサイズを指定する。 問 3 ー 10 工 765172K SQL インジェクション攻撃の例として , 入力値をそのまま文字列として代人して SQL : 文を糸はみ : 立てる , SELECT ☆ FROM table a WHERE code=' input_code' のようにテープル table a から code が人力値 input_code に一致する属性情 報を検索する SQL 文を考える。このとき , テープル名 table a が推定できてい る前提で , 人力イ直に「 A';DELETE ☆ FROM table a WHERE 'A'='A 」を人力 すると , 組み立てられる SQL 文は , SELECT ☆ FROM table a WHERE code='A' ;DELETE ☆ FROM table a WHERE 'A'='A' となり , table a の 全レコードが削除される。クライアント側の入力値を文字列として代入して SQL 文を組み立てるのではなく , 文字定数として組み込む仕組みはバインドメカニズ ムで , SQL インジェクション攻撃にも有効である。バインドメカニズムでは , プ レースホルダを用いて入力値を文字定数として組み込むため , 新」のような特殊 文字が特殊文字として機能せず , 意図しない SQL 文の動作を防止できる。した がって , ( 工 ) が適切である。 ア : 工スケープ処理は , メタキャラクタなど特殊な文字をエンコードなどによっ て意味のない文字列に置換する処理である。 イ : 形式規則のチェックは人力チェックの一つの方法で , 例えば郵便番号を xxx-xxxx 」の形式で扱う場合に , 数字 3 けた , ハイフン , 数字 4 けたの形式 に合致しているか , その形式をチェックすることである。 ウ : パイプ機能は連続したコマンド処理において , あるコマンドの標準出力値を 次のコマンドの標準入力値にする機能である。 400
, 。当・午後 I 第 1 部情報セキュリティシステムの企画・設計・構築解答・解説 C3 ; したがって , 空欄アには "prepare" が人り , 空欄イには "execute" が入る。 ( 2 ) xss のぜい弱性監査に alert メソッドを使用すると視覚的に検査が可能な理由に ついて間う問題である。 JavaScript における alert メソッドは , 警告のポップアッ プを起動する際に使用される。プラウザ側で JavaScript を有効にした状態で , 出 カ結果にタグ文字などがエスケープされないまま , alert メソッドが実行されたとす ると , プラウザ側の画面上にポップアップが起動して , 視覚的にぜい弱性が存在す ることを検査することが可能になる。したがって , 解答としては「ぜい弱性がある とプラウザに警告ウインドウが表示されるため」のように解答するとよい。 ( 3 ) SQL インジェクションを行う攻撃者は , Web サイトに表示されるデータベース のエラーメッセージから , データベースの種類やバージョン , テープルの構造や , フィールド名 , テープルの関連性を読み取ろうとする。これは具体的には以下のよ うにして行われる。 例えば , 次の SQL 文によって会員番号とパスワードの照合によって , ログイン 処理を行うアプリケーションの場合 , 「 SELECT ☆ FROM users WHERE member 土 d = 会員 : 番・号・ AND password= ′ $password' 会員番号入力フィールドに数値以外の不正な文字列が挿入できてしまうアプリ ケーションになっている場合 , 次の不正な文字列が挿人されたとすると , 「 10 UN 工 ON SELECT TOP 1 TABLE NAME FROM 工 NFORMATION SCHEMA . TABLES—」 組み立てられる SQL 文は次のようになり , 整数である 10 と文字列であるテープ ル名の結合に失敗することになる。 「 SELECT ☆ FROM users WHERE member id=10 UN 工 ON SELECT TOP 1 TABLE NAME FROM 工 NFORMAT 工 ON SCHEMA . TABLES—」 Microsoft 社の SQL server を採用していた場合には , 図 1 のようなエラーメッ セージが表示される。 Microsoft OLE DB provider for ODBC Drivers error '80040e07 ー [Microsoft] [ODBC SQL Server Driver] [SQL Server] Syntax error converting the varchar value 'user table' tO a column Of data type int . /profile . asp, line 図 1 ODBC のエラーメッセージ ( サーバ名 , テープル名の推測 ) 445
用する場合 , サーバに侵人することなく , 不正な SQL で DB を制御することが可 能になる。例えば , 会員がプラウザから入力した電子メールアドレスを , 文字列と してプログラムが生成する SQL のパラメータに用いる。この場合 , 電子メールと して入力される文字列を細工することで , 不正な SQL が生成される」という記述 がある。これは , SQL インジェクションという攻撃手法を示している。 SQL イン ジェクションを行うには , SQL で定義されている特殊文字 ( & , + , など ) が使用されることが多い。しかし , 電話番号の入力では , 市外局番 , 市内局 番 , 加人者番号をすべて独立な欄に人力するので , " などの記号を人力する必 要もない。このため , 人力された文字が数字であることをチェックするだけでよく , D 氏も「換言すると , 数字以外の文字は受け付ける必要がありません」と発言して いる。そこで , 解答としても「入力された文字が数字かどうかをチェックすればよ い」旨を答えるとよい。 [ 設問 4 ] ( 1 ) インターネット側から送信されてくるメールは , 原則 A 社あてのものに限られる。 しかし , 不正メールの中継に使用されるときには , A 社以外のドメイン名を持った 電子メールが送信されてくる。そして , そのメールを SI が , そのままインターネ ット側に中継してしまうことによって発生する。このため , SI が電子メールの不正 中継を回避するためには , メールサーバの設定として「 A 社以外のドメイン名を持 った電子メールが送信されてきたとき , そのメールをインターネット側に中継しな いように設定する」ことが必要になる。したがって , 解答としてもその旨を答える とよい。 ( 2 ) この設間は , 社外から SI に対するアクセスに関して対処するルータのフィルタ として設定すべき内容を答えるものである。 SI の利用方法を確認すると , 〔システ ム要件〕の項で「電子メールは , A 社に対する各種の問合せに対応できるよう , 不 特定多数からの受信を想定する」 , 〔システム構成の検討〕の項で「 SI は電子メール サーバであり , SMTP と POP を使用している。社員は , L3 スイッチを経由して電 子メールを使用する」という記述がある。そこで , まず , インターネット側からの SMTP を許可する必要がある。一方 , 社員がインターネット側に電子メールを送信 するには , 内部から外部に向けて SMTP を通過させるほか , ドメイン名に対する名 前解決を行うため DNS も通過させる必要がある。しかし , フィルタの設定に関し ては , 外部から内部 , 内部から外部という通信方向ごとに設定できる。この設問で は , 社外から SI に対するアクセスに関して対処するルータのフィルタ条件が間わ れているので , SI に対する SMTP のコネクション確立要求だけを通過させ , その 他はすべて拒否すればよいことが分かる。したがって , 解答としては「 SMTP のコ ネクション確立要求だけを通過させ , その他はすべて拒否の設定を行う」旨を答え るとよい。なお , フィルタリング動作は通常 , 動的に行われるので , SI からの応答 バケットを通過させる条件を改めて設定する必要はない。 502
: ・午前第 6 部情報システムへの脅威と社会環境 ウ : TearDr 叩攻撃と呼ばれる DoS アタックである。 る。 解答・解説 ェ : SYN フラッドと呼ばれて , TCP のセッション管理用のメモリを食いつぶす 攻撃である。 問 6 ~ 1 7 ウ 765178K SQL インジェクション攻撃の一例である。 SQL インジェクションは不正なパ ラメタを渡して , サーバ側が意図しない SQL 文を組み立てさせて , 通常ではア クセスできないデータベース情報を検索したり , 不正なデータベース操作を行う ものである。 ( ウ ) のパラメタを SQL に代人すると , SELECT ☆ FROM user WHERE userid= '$userid' AND password= 凵 0 が dummy' = という SQL 文が組み立てられる。 WHERE 句の選択条件は or で区切られた二つ で , 。 r の後ろはすべての行に対して真になるので , 結果として user 表のすべて の行のすべての属性が出力される。したがって , ( ウ ) が正解である。 問 6 ー 1 8 ア 765179K Session Fixation 攻撃 ( セッション固定攻撃 ) は , 攻撃者が web サーバにアク セスして取得したセッション ID を他の利用者に使用させて , そのセッションを ハイジャックする手法である。ぜい弱性のある web アプリケーションではユーザ 認証前にセッション ID を発行し , ユーザ認証後もそのセッション ID を送信する とセッションを保持するという動作をする。攻撃者は単独では他の利用者の認証 セッションに割り込むことができないが , 他の利用者が一度認証を経た後はセッ ション ID だけでセッションをハイジャックできる場合がある。したがって , ( ア ) が適切である。 イ : セッション ID の推測による攻撃の記述である。 ウ : 中間攻撃に関する記述である。 工 : セッション ID の推測による攻撃の記述である。 問 6 ー 1 9 ウ 76518 ( ) K ユーザが入力したメールアドレスあてに返信メールを自動送信するシステム は , ユーザからのパラメタ ( この場合はメールアドレス ) をもとにメールを送信 するので , このメールアドレスを操作することで任意のメールアドレスにメール を送信できる。したがって踏み台になる可能性があり , ( ウ ) が適切である。 ア : システム側の情報に基づきメールを送信するので , 踏み台になるぜい弱性と は直接には関連しない。 イ : メールの送信とは直接には関連しない。 41 7
から会員のパスワードを取得する命令が GW に送られても , GW はこれを DB-2 に中継しない。そのため , DB-2 には会員 DB 以外に , 会員のパスワード処理機 能をもたせる。また , 会員情報を要求された場合でも , 細心の注意を施したアク セス制御を行う。 各サーバ間の通信は , L3 スイッチが有する静的ルーティング機能を利用して , 通信可能なサーバが限定されている。表 2 に L3 スイッチの仕様を示す。 ポート構成 スイッチング容量 スイッチング方式 フィルタリング機能 ルーティング機能 ネットワーク管理 その他 表 2 L3 スイッチの仕様 ( 抜粋 ) IOOBASE-TX : 10 ポート 9G ビット / 秒 ストア & フォワード方式 次の条件を組み合わせて , IP バケットを通過又は破棄 ( 1 ) あて先及び送信元 IP アドレス ( 2 ) TCP ヘッダのあて先及び送信元ポート番号 ( 3 ) TCP ヘッダの SYN, ACK, FIN の各ビット 静的及び動的ルーティング SNMP ロギング機能を有する SQL で制御される DB を利用する場合 , サーバに侵入することなく , 不正な SQL で DB を制御することが可能になる。例えば , 会員がプラウザから入力した 電子メールアドレスを , 文字列としてプログラムが生成する SQL のパラメータ に用いる。この場合 , 電子メールとして人力される文字列を細工することで , 不 正な SQL が生成される。 289 ではなく , 市外局番 , 市内局番及び加人者番号をすべて独立な欄に入力す C 君 : 電話番号を入力するところは , ーっの欄にすべての電話番号を人力するの 話番号を入力するところに着目してください。 合がありますので , 利用者にも協力を求める必要があります。例えば , 電 D 氏 : 安全なシステムを構築するためには , システム側だけの対処では困難な場 の重要な情報を格納する会員 DB は心配です。 C 君 : DB を使用しないシステム構成など考えられません。特に , 個人情報など
問 1 5 イ 713376K RPC (Remote Procedure call ; 遠隔手続き呼出し ) は , クライアントのアプ リケーションプログラムがサーパ内の手続きを呼び出して , サーバに各種の処理 を実行してもらうものである。したがって , ( イ ) が正解である。間違えやすいも のに ( ア ) の「クライアントがサーパ内の SQL 手続きを呼び出す機能」というもの があるが , これはストアドプロシージャと呼ばれる。ストアドプロシージャは頻 繁に使われる SQL 文による手続きをサーバ上に置いておき , クライアントのア プリケーションプログラムからはその実行だけを指示する。このようにすること によって , クライアントから処理の都度 SQL 文をサーバに送る必要がなくなり , 通信負荷が軽減される。ストアドプロシージャは SQL 文によるデータベースア クセスの手続きを依頼するが , RPC はデータベースアクセスに限らず , 各種の処 理手続きを依頼する点が異なる。 問 1 6 ウ (H15 秋 -NW 間 6K ) べンチマークテストとは , 標準的なプログラムの実行時間を測定することによ ってコンピュータの性能を比較 , 評価することである。したがって , 複数種類の べンチマークテストを実行することは , その結果を用いてシステムの特徴を理解 することができるので , 導入機種の選定に有効であると記述した ( ウ ) が正しい。 その他の記述には , 次のような誤りがある。 ア : TPC べンチマークの結果は , 性能値と価格対性能比で表され , コストの尺度 がある。 イ : 例えば , Dhrysto Ⅱ e はコンピュータの整数演算性能を計測するものであり , コンピュータシステム全体の性能評価を行うべンチマークテストではない。 工 : べンチマークテストは , 特定の目的のものを評価するものであり , 汎用的な 評価モデルというわけではない。 問 17 ウ ( H15 #-SW 間 37K ) 図のシステム構成は , ディスク装置 , CPU, サイトの端末が , それぞれ直列に 接続されている。そして , ディスク装置は 2 台とも正常であることが必要である ため , その稼働率は D2 となる。また , 各サイトの端末は , 少なくとも 1 台が正 常であることが必要であるため , その稼働率は ( 1 ー ( 1 ー T ) 2 ) となる。さらに , サイ ト a とサイト b の 2 か所あることを考慮し , システム全体の稼働率 A を求めると , A = D2c ( 1 ー ( 1 ー T ) 2 ) 2 326 となる。
#!/usr/local/bin/perl use DB 工ー my $dbh=DB 工—>connect ('dbi: pg:dbname=users db ′ RaiseError=>1 ′ AutoCommit=>0, elese{ # 認証失敗の処理 if(not defined $sth ー > fetchrow arrayref) { my $rv=$sth-> 亠 ($user id'$password) WHERE user id=? AND password=?' ) ー my $sth $dbh—> ー ('SELECT user id FROM users my # 認証成功の処理 $dbh—>disconnect ( ) or die; 図 1 ぜい弱性のない営業支援システムログイン処理 CGI ( 抜粋 ) B 氏 : この CGI にプラウザから仮に ID に「 sales 」 , パスワードに「 passwd 」 という値が渡されたとすると , 組み立てられる SQL 文は次のようになり , 一致するユーザ ID が取得できると認証処理が成功します。 SELECT user id FR 〇 M users WHERE user 土 d = ′ sales' and password='passwd ′制 B 氏 : もし仮にこのログインチェックが SQL インジェクションのぜい弱性を含 む図 2 のコードで作成されていたとしても , ID が「 s ale s 」 , パスワード が「 passwd 」のデータでは正しく認証処理が成功します。 しかし , 表 1 の監査データから , 工ラーが発生するデータ「 , 」をパス ワードとして人力した場合 , 以下のような SQL 文が組み立てられるので , 構文工ラーが発生することになります。 「 SELECT user id FROM users WHERE user id= password= 1 94 and
を望を国・午後 I 第 1 部情報セキュリティシステムの企画・設計・構築 CREATE TABLE USERS ( って管理された従業員情報を使用しているとします。 ムを例にご説明しましよう。ログインチェックが以下のテープル定義によ B 氏 : 分かりました。亠について , 実際のログインチックのプログラ A 君 : もう少し , 分かりやすく教えてもらえませんか。 て , その振舞いの違いを見ることによって監査を実施します。 むが , 最終的な処理として不正な処理を行わせるデータ」の二つを使用し 図的に「エラーが発生するデータ」と「エラーが発生する文字データを含 ータベースに不正な SQL 文を送り込む SQL インジェクションの場合 , 意 ケーションの挙動からぜい弱性を見つける亠です。例えば , デ もうーっは攻撃者と同じ条件で色々な攻撃パターンを送信して , アプリ 解が必要になります。 する効果的な監査手法になりますが , 実施には時間と言語に対する深い理 重点的にチェックを行っていきます。このため , ぜい弱性を非常に少なく する可能性があるため , 出力先がプラウザやデータベースの場合には特に USER 工 D PASSWORD CHAR(20) PRIMARY KEY ′ CHAR ( 2 0 ) NOT NULL また , こで利用する監査文字列のサンプルを表 1 に示します。 表 1 SQL インジェクションの監査文字列 工ラーが発生するデータ不正処理を行うデータ 0 r ′ a ′ 0 r a B 氏 : そして , DBI (Database lnterface) を使用してこの営業部員データベー スにアクセスして , ID とパスワードを比較した結果 , 一致すればログイン 成功の処理を行う簡単なプログラムを考えてみましよう。プレースホルダ を利用したぜい弱性のないコードは図 1 のようになります。 ] 93
このサンプルプログラムを z 君が実際の開発環境で実行しようとしたところ , 次のエラーメッセージがプラウザに出力された。 lnsecure dependency in piped open while running with —T switch at ・ 図 5 出力されたエラーメッセージ ①調査の結果 , 環境変数の PATH を削除する必要があることが分かり , 以下の コードをプログラムに加えて , 正常に動作することを確認した。 〔サイト開設の準備〕 図 6 挿入した環境変数用のコード delete $ENV{PATH}= 、 /bin:/usr/bin' ・ Y 主任はサイト開設の前に必要なセキュリティ強度を確保していることを確 機を用意してサイト上でサービス停止の告知を実施した。 得て , アプリケーションサーバを停止してネットワークから切り離し , 次に代替 するため上司である Y 主任に相談した。 Y 主任は情報システム部の部長の了解を べースに , 不正なアクセス履歴があることが分かったため , サイトの閉鎖を検討 べースへのアクセスログの調査を行ったところ , 会員情報を格納しているデータ 遮断する措置を取った。また , 直近 2 週間分のアプリケーションサーバやデータ ェクションを疑い , ②ログから送信元を特定し , すぐに送信元からのアクセスを データの中に SQL 文が混人されているのを見つけた。運用担当者は SQL インジ ログを調べていた情報システム部の運用担当者が , Web サイトに送信されてきた サイトの開設から 3 か月経ったところで , アプリケーションサーバのアクセス 〔 SQL インジェクションによる攻撃〕 リティが確保されていると判断し , 社内に報告した。 D 。 S 攻撃など数千項目の自動ツールによる調査の結果 , 社外公開に十分なセキュ 要なサービスが起動したりしていないことを診断ツールによって確認した。また , の診断にあたっては , サーバやミドルウェアに既知のぜい弱性が存在したり , 不 認するため , サーバのセキュリティ診断を実施することになった。セキュリティ