問題 8★★☆

C言語で書かれた部品を含むWebアプリケーションを改修する。IPA「安全な ウェブサイトの作り方」で、バッファオーバーフローの根本的解決として 挙げられている対策はどれか。

正解:イ

各選択肢の解説

  1. アサーバの前段にファイアウォールを置き、不要なポートへの通信を遮断する。

    誤り。ファイアウォールは通す通信の種類を絞る外側の防御です。Webアプリ ケーションは公開しているポートで動くので、そこに届く入力は止まらず、 プログラムの欠陥も残ります。原因をなくす対策ではありません。

  2. イメモリを直接操作できる言語で書く部分を、できるだけ少なくする。

    正解。バッファオーバーフローは、メモリを直接扱える言語で、確保した領域を 越えて書き込めることが原因です。その部分を減らすのは、 IPAが根本的解決に挙げる対策の1つです。

  3. ウプログラムを動かすアカウントの権限を、業務に必要な最小限に絞る。

    誤り。乗っ取られたときに攻撃者ができることを狭める、被害を小さくする 手当てです。領域をあふれさせられる欠陥そのものは残ります。原因を なくすのか、被害の範囲を絞るのかで区別します。

  4. エ使っているライブラリは動作実績を優先し、新しい版へ更新せずに使い続ける。

    誤り。IPAは逆に、脆弱性が修正された版のライブラリを使うよう求めています。 古い版には、自分で書いていない部分の脆弱性が残っていることがあります。 動作の安定と、既知の脆弱性の放置は分けて考えます。

理解を深めるために

器の大きさを確かめずに注ぐ書き方を減らす

バッファオーバーフローは、プログラムが用意したデータの置き場(バッファ)より 長いデータを書き込まれ、隣の領域まで上書きされてしまう脆弱性です。コップに 入る量を確かめずに注げばあふれる、というのと同じです。あふれた先に 攻撃者が用意した命令が書き込まれると、プログラムを乗っ取られることがあります。

なぜ言語とライブラリの選び方が根本的解決なのか

この欠陥が起きるのは、C言語やC++、アセンブラのように、プログラムがメモリを 直接扱える言語です。IPAの「安全なウェブサイトの作り方」は、根本的解決として 次の3つを挙げています。

  • 直接メモリにアクセスできない言語で記述する
  • 直接メモリにアクセスできる言語で記述する部分を最小限にする
  • 脆弱性が修正されたバージョンのライブラリを使用する

どれも「あふれさせられる箇所をそもそも作らない・残さない」ための対策です。 設問のようにC言語の部品を含む場合は、その部分をできるだけ小さくします。

混同しやすいものとの違い

対策 何に効くか
メモリを直接扱う部分の最小化 あふれさせられる箇所を減らす(根本的解決)
修正版ライブラリの使用 既知の脆弱性を残さない(根本的解決)
ファイアウォール 不要な通信を絞る。公開ポートへの入力は届く
実行アカウントの最小権限 乗っ取られたときの被害を狭める

試験では「ネットワークで防ぐ」「被害を小さくする」対策が、もっともらしい誤答として 並びます。プログラムの欠陥そのものに手を入れているかどうかで見分けます。

前の問題へ次の問題へ