問題 45★★☆

あるサーバのプログラムが、外部から送られたデータを受け取った直後に 異常終了し、データに紛れ込んでいた攻撃者の命令が実行された。調査の結果、 バッファオーバーフローと判明した。このプログラムにあった不備はどれか。

正解:ウ

各選択肢の解説

  1. ア入力された文字列を、データベースへの命令文の一部としてそのまま組み立てていた。

    誤り。これはSQLインジェクションを許す不備です。入力の確認不足という 根は同じですが、悪用されるのはデータベースへの命令文で、 記憶領域があふれるわけではありません。

  2. イ入力された文字列を、無害化しないまま他の利用者が見る画面に表示していた。

    誤り。これはクロスサイトスクリプティングを許す不備です。不正な スクリプトが動くのは閲覧した利用者のブラウザで、サーバのプログラムが 異常終了することはありません。

  3. ウ入力されたデータの長さを確かめず、用意した記憶領域からあふれさせていた。

    正解。バッファはデータを一時的に置く記憶領域です。入りきらない長さの データを書き込むと隣の領域まで上書きされ、プログラムが止まったり、 上書きされた命令が実行されたりします。

  4. エ接続要求の数に上限を設けず、短時間の大量の要求で処理能力を使い果たしていた。

    誤り。これはDoS攻撃を許す状態です。「オーバーフロー」を処理の パンクと捉えると混同しますが、あふれるのは要求の件数ではなく、 1つのデータの長さです。DoS攻撃では攻撃者の命令は実行されません。

理解を深めるために

コップに、入りきらない量の水を注ぐ

バッファとは、プログラムがデータを一時的に置いておくための記憶領域です。 大きさはあらかじめ決まっています。コップに入りきらない量の水を注げば 周りにこぼれるように、バッファより長いデータを書き込むと、 隣の領域まであふれ出します。これがバッファオーバーフローです。

なぜ攻撃者の命令が実行されるのか

バッファの隣には、プログラムが次に何を実行するかといった、 動作に関わる大事な情報が置かれていることがあります。

  • あふれたデータが隣の情報を壊すと、プログラムは異常終了する
  • 攻撃者があふれる部分を計算して作り込むと、次に実行する場所を 書き換えられ、攻撃者の用意した命令が動く

どちらも原因は同じで、受け取ったデータの長さを確かめていないことです。 対策は、入力の長さを確認してから書き込むようにプログラムを作ること、 利用者の側では修正プログラムを速やかに適用することです。

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

攻撃 突かれる不備 何が起きるか
バッファオーバーフロー 入力の長さを確かめていない 記憶領域があふれ、異常終了や命令の実行
SQLインジェクション 入力を命令文にそのまま組み込む データベースの不正な読み書き
クロスサイトスクリプティング 入力を無害化せず画面に表示する 閲覧者のブラウザでスクリプトが動く
DoS攻撃 大量の要求をさばききれない サービスが使えなくなる

上の3つは、どれも「外から来た入力を信用しすぎた」ことが原因です。 試験では、入力の何を確かめなかったのかで見分けます。長さならバッファ オーバーフロー、命令文として働く文字ならSQLインジェクション、 画面で動くスクリプトならクロスサイトスクリプティングです。

前の問題へ情報セキュリティの脅威の一覧へ戻る