コンピュータが扱うことができる数位範囲の限界を超えてしまったケース。それがオーバーフローです。
レジスタの限界や記憶装置上の格納域に記録する範囲を超えた状態を、オーバーフローと呼ぶことが多く、オーバーフローを「溢れ」と呼ぶケースもあります。
今回の記事では、オーバーフローの基本的な説明、そしてオーバーフローが起こった場合の正しい対処法などを説明します。
※本ページにはPRが含まれます。
目次
一般的なオーバーフロー
オーバーフローは、IT以外の分野でも使われる言葉です。他の分野でも、処理能力を超えた負荷という意味で使われることが多いです。
限界値を超えた変数がオーバーフロー
コンピュータには、プログラムで「処理可能な変数」が指定されます。例えば、2桁までの変数を処理できる指定で、3桁以上の変数を割り当てられると処理能力を超えた命令となってしまいます。
逆に処理能力を大きく下回る変数の指定が行われた時、「アンダフロー」という状態になります。
どちらも、「処理能力を超える」という点で同じだと言えますよね。
CSSにおけるオーバーフロー
WEBデザインの分野、CSSでもオーバーフローという用語が使われることがあります。
CSSにおけるオーバーフローとは、指定した要素のボックスからはみ出した部分。そのはみ出た部分をどう処理するかを意味します。
visibleという値ではみ出たままの状態にするか、hiddenで隠れた状態にするか、何パターンかオーバーフローの値を指定することができます。
バッファオーバーフロー
オーバーフローと言えば、プログラム上で処理能力を超えた処理を行うことで、はみ出てしまった容量。この上限を超えた領域を超えてしまうとバッファオーバーフローとなってしまい、セキュリティホールというシステム面の「弱点」となってしまいます。
代表的なセキュリティホール
バッファオーバーフローは、セキュリティホールと呼ばれるコンピュータ面の弱点における代表的な例です。データが溢れ出ても処理されて格納されてしまうという性質を悪用して、プログラムの戻り先を書き換えてしまうのです。
スタック領域に指定されている「プログラムの戻り先」。この戻り先を書き換えて悪意あるソフトウェアなどに変えておくことで、プログラムの終了と同時に悪意あるソフトウェアが起動されてしまうことになります。
バッファオーバーフローによって受けるサイバー攻撃
バッファオーバーフローによって受けるサイバー攻撃には、いくつか種類があります。
まず一つ目は、侵入したパソコンにおいてマルウェアを呼び出す「DoS攻撃」です。DoS攻撃を受けると情報流出などに繋がり、被害者本人がダメージを負うのはもちろんのこと、DoS攻撃を受けた企業の信用も失墜します。
そしてもう一つが、サーバーに侵入し、悪意あるプログラムを呼び出します。それによりサーバーの管理者権限を奪い、管理者しかアクセスできない情報を盗む。またはその重要情報を破壊するというサイバー攻撃です。
それぞれのサイバー攻撃被害は、何件が公表されています。例えば2000年に起きた中央省庁のWebサイト改ざんは、サーバーに侵入して管理者権限を奪われたことにより起こったと言われています。
プログラム上にバッファオーバーフロー検知機能を載せておく
OSやプログラムに、バッファオーバーフローを検知する機能を載せておけば、バッファオーバーフローが発生しても対処しやすくなります。
コンパイラを変更して、バッファオーバーフローを検知する機能を追加、バッファオーバーフローが発生したらプログラムが停止するようにしておけばバッファオーバーフロー被害を抑えることが可能です。
オーバーフローの対処法
オーバーフローの処理方法を見ていきましょう。
オーバーフローが起こる前に防ぐ
未然にオーバーフローを防ぐのが、一番理想的な対処法です。
許容範囲を超える数値を登録しようとしたことによるオーバーフロー。これも、あらかじめ許容範囲を広く設定しておくことで、オーバーフローが起きる前に対策することができます。
データベースにおけるオーバーフローを防ぐには、bigint型に変更して処理可能な変数の幅を広げることで、オーバーフローが起こりにくくなります。
または、numeric型に変更して、処理可能変数を1桁ごとに調整することも可能です。
まとめ
オーバーフローとは、コンピュータやデータベース、その他プログラムなどにおいて「処理可能な値を超えた状態」のことです。
オーバーフローの中には「バッファオーバーフロー」と呼ばれる、セキュリティホールとなってしまうものもあります。オーバーフローが起きたあとに対処するのではなく、できれば事前にオーバーフローが起きにくくなる設計を組んでおきましょう。