情報セキュリティスペシャリスト試験情報 > テクニカルエンジニア(情報セキュリティ)平成19年度試験メニュー >問題と解説
テクニカルエンジニア(情報セキュリティ)平成19年度試験問題(午後1問1)
問1 プログラム開発におけるセキュリティ対策に関する次の記述を読んで,設問1〜3に答えよ。
A社は,従業員数1,000名の中堅広告代理店である。A社では,契約書,顧客向けの企画書や広告原稿などの文書を,部署ごとに作成,管理している。これらの様々な文書を一括管理するために文書管理システムを開発することになり,開発チームによるプロジェクトを立ち上げた。
文書管理システムは,機密性の維持と原本性の確保が必要な文書を取り扱うので,特にセキュリティに配慮することが重要な開発要件となっている。
〔プログラム作成時の脆(ぜい)弱性対策〕
A社では,文書管理システムを開発するに当たり,開発の生産性や品質の向上のために,開発標準ルールを作成することにした。次は,開発標準ルールの作成を担当することになったS主任とT君の会話である。
S主任 :開発標準ルールでは,開発チームが脆弱性のないプログラムを作成するためのコーディングルールを示すとともに,なぜそうすべきかを理解させるようにしたいね。 T君 :はい,同感です。プログラマに対して,コーディングの悪い例を示す際に,脆弱性が悪用される仕組みについても解説しましょう。システムが攻撃される仕組みを理解できれば,プログラマも納得すると思います。 S主任 :そうだね。さらに,一般的に言われているプログラム作成上の基本的な注意事項を守ることも,セキュリティ対策になることを強調したいね。開発に使用するプログラム言語やプログラムの稼働環境によって対策が異なってくるので,まずは,文書管理システムで使用されるC++言語から取り組んでみよう。 T君 :C言語やC++言語のように,配列の範囲チェックを自動で行わないプログラム言語を使用する場合は,バッファオーバフローを防ぐ必要があります。 S主任 :そのために,まず,どのような手段でバッファオーバフローを悪用した攻撃が行われるのか検討してみよう。 T君 :この脆弱性による影響には幾つかのタイプがあるようです。その一つを含む,図1のプログラムを作成してみました。このプログラムの本来の意図は,実行時に最初のコマンドライン引数として文字列を受け取り,その文字列を表示した後,特定のファイル(ファイル名“somefile”)の内容を表示することです。
S主任 :具体的に確認してみよう。 T君 :はい。このプログラムでは,バッファオーバフローの結果,[ a ]領域に確保された変数の値が,意図に反して書き換えられる可能性があります。私がこのプログラムを実行して確認したところ,変数val1がメモリ上に展開されたときの先頭アドレスは0Xbffffa60で,同様に変数val2では0Xbffff9e0,変数val3では0Xbffff5e0でした。このとき,コマンドライン引数として一定バイト数以上の長さの文字列が与えられると,変数[ b ]がバッファオーバフローを起こして,変数[ c ]の値が書き換えられてしまいます。 S主任 :そうだね。しかし,もっと重大なセキュリティ問題に結び付くことを示したいね。 T君 :分かりました。前提条件として,このプログラムの実行環境はUNIXとします。ファイル“somefile”の所有者はOSのシステム管理者で,所有者にだけread/write属性が付けられているものとします。また,実行ファイルの所有者はシステム管理者ですが,一般利用者でもファイル“somefile”の内容を見ることができるように,setuid属性が付けられているものとします。攻撃者はシステム管理者ではない一般利用者の権限をもっているものとします。さらに,攻撃対象のファイル“afile”の所有者はシステム管理者で,所有者にだけread/write属性が付けられているものとします。これらの前提条件の下で,〔1〕攻撃者が,図2のコマンドライン引数を与えて,図1のプログラムを実行すると,ファイル“afile”の内容が表示されてしまいます。
S主任 :これは重大な問題だな。setid属性が付けられている実行ファイルは,ファイル所有者の権限で実行される。これは,システム管理者の権限の乗っ取りにつながる[ d ]の脅威も抱えているから,取扱いに注意しなければいけないな。加えて,[ a ]領域には,[ e ]のパラメタや戻りアドレスなどが格納されるので,その[ e ]の戻りアドレスが書き換えられてしまうことがある。そうなると,悪意のあるプログラムに制御を移すことができるから,特に注意が必要だ。 T君 :はい,そうですね。脆弱性を最小限に抑えるために,プロセスの権限については,プログラムの設計段階で考慮すべきだと思います。 S主任 :図1のプログラムにはないようだが,malloc関数などによって[ f ]領域に確保された変数についてのバッファオーバフローの脆弱性も,よく知られているね。 T君 :そうですね。ただ,[ a ]領域と[ f ]領域に確保された変数については,どちらもプログラム作成上の対策は同じと考えてよいと思います。 S主任 :そのとおりだが,バッファオーバフローを防ぐ根本的な対策は,ループ文の中で配列への書込みを行う場合や.組込み関数を使う場合などで方法が異なるから,それぞれについて示すことにしよう。また,プログラムコードのレビューや検証作業を行うことで,コーディングルールに違反したプログラムを検出し,修正することの重要性も強調すべきだな。 T君 :これまで検討してきたコーディングルール以外にも,[ e ]の戻りアドレスが変更されて,悪意のあるプログラムが実行されることを防ぐ方法があります。例えば,〔2〕戻りアドレスの改ざんを検知する方法,戻りアドレスが[ a ]領域上の場合に実行を禁止する方法,バッファオーバフローの脆弱性をもつ組込み関数に対して,バッファオーバフローの検知と防御の仕組みが加えられた実行時ライブラリに置き換える方法などがあります。 S主任 :だが,それらの方法ではバッファオーバフローの問題をすべて解決することはできないので,補完的な対策であることを強調して,開発標準ルールに記載しておこう。また,バッファオーバフローの脆弱性以外にも,競合条件による脆弱性や一時ファイルの消去忘れによる情報漏えいなどの対策を考慮した,プログラム作成上の注意事項についても述べることにしよう。
S主任とT君は,開発標準ルールをまとめ,開発チームに提供した。A社では,このルールを基に,安全性の高い文書管理システムが開発され,無事,本番稼働を迎えることができた。
設問1 本文中の[ a ]〜[ f ]に入れる適切な字句を,[ e ]は6字以内,その他は4字以内で答えよ。
設問1の解答例と解説へ
設問2 図1のプログラムに関するバッファオーバフローの脆弱性について,(1)〜(3)に答えよ。
(1) 図2中の[ ア ]に入れる適切な数値を答えよ。 (2) 本文中の下線〔1〕について,ファイル“afile”の内容が表示されてしまうことによって,セキュリティ上どのような問題が生じるといえるか。40字以内で述べよ。 (3) この脆弱性を排除するために,図1のプログラムの12行目だけを変更したい。どのように変更すればよいか。50字以内で述べよ。
なお,解答は,変更の内容を文章で説明する方法と,変更後のプログラムコードを示す方法のどちらでもよい。
設問2の解答例と解説へ
設問3 本文中の下線〔2〕について,戻りアドレスが改ざんされていないことを確認する方法を,70字以内で具体的に述べよ。
設問3の解答例と解説へ
メニューへ戻る