正解:ウ
各選択肢の解説
ア入力された文字列を、データベースへの命令文の一部としてそのまま組み立てていた。
誤り。これはSQLインジェクションを許す不備です。入力の確認不足という 根は同じですが、悪用されるのはデータベースへの命令文で、 記憶領域があふれるわけではありません。
イ入力された文字列を、無害化しないまま他の利用者が見る画面に表示していた。
誤り。これはクロスサイトスクリプティングを許す不備です。不正な スクリプトが動くのは閲覧した利用者のブラウザで、サーバのプログラムが 異常終了することはありません。
ウ入力されたデータの長さを確かめず、用意した記憶領域からあふれさせていた。
正解。バッファはデータを一時的に置く記憶領域です。入りきらない長さの データを書き込むと隣の領域まで上書きされ、プログラムが止まったり、 上書きされた命令が実行されたりします。
エ接続要求の数に上限を設けず、短時間の大量の要求で処理能力を使い果たしていた。
誤り。これはDoS攻撃を許す状態です。「オーバーフロー」を処理の パンクと捉えると混同しますが、あふれるのは要求の件数ではなく、 1つのデータの長さです。DoS攻撃では攻撃者の命令は実行されません。
理解を深めるために
コップに、入りきらない量の水を注ぐ
バッファとは、プログラムがデータを一時的に置いておくための記憶領域です。 大きさはあらかじめ決まっています。コップに入りきらない量の水を注げば 周りにこぼれるように、バッファより長いデータを書き込むと、 隣の領域まであふれ出します。これがバッファオーバーフローです。
なぜ攻撃者の命令が実行されるのか
バッファの隣には、プログラムが次に何を実行するかといった、 動作に関わる大事な情報が置かれていることがあります。
- あふれたデータが隣の情報を壊すと、プログラムは異常終了する
- 攻撃者があふれる部分を計算して作り込むと、次に実行する場所を 書き換えられ、攻撃者の用意した命令が動く
どちらも原因は同じで、受け取ったデータの長さを確かめていないことです。 対策は、入力の長さを確認してから書き込むようにプログラムを作ること、 利用者の側では修正プログラムを速やかに適用することです。
混同しやすいものとの違い
| 攻撃 | 突かれる不備 | 何が起きるか |
|---|---|---|
| バッファオーバーフロー | 入力の長さを確かめていない | 記憶領域があふれ、異常終了や命令の実行 |
| SQLインジェクション | 入力を命令文にそのまま組み込む | データベースの不正な読み書き |
| クロスサイトスクリプティング | 入力を無害化せず画面に表示する | 閲覧者のブラウザでスクリプトが動く |
| DoS攻撃 | 大量の要求をさばききれない | サービスが使えなくなる |
上の3つは、どれも「外から来た入力を信用しすぎた」ことが原因です。 試験では、入力の何を確かめなかったのかで見分けます。長さならバッファ オーバーフロー、命令文として働く文字ならSQLインジェクション、 画面で動くスクリプトならクロスサイトスクリプティングです。