バッファオーバーフロー

バッファオーバーフローは、ソフトウェアへの入力を格納する領域(バッファ)をあふれさせる(オーバーフロー)ことで、システムに意図しない挙動をさせる攻撃です。これにより、アプリケーションやコンピューターをダウンさせたり、コンピューター上で任意のプログラムを実行可能にしたりします。任意のブログラムが実行可になること(つまり乗っ取られている状態)は非常に危険です。

バッファオーバーフローの仕組み

実行中のプログラムに入力されたデータは、コンピューターのメモリ上に確保されたバッファ(あらかじめ決められたサイズで確保)に書き込まれます。本来、入力データはその確保されたサイズに収まっていなければなりません。ところがサイズチェックがされていないと、サイズより大きい分のデータは隣接する領域に上書きされることになります。バッファの隣接領域には、コンピューターのプログラムの実行を制御するための番地(アドレス)が書かれていることが多いのですが、典型的なバッファオーバーフロー攻撃では、これを書き換え、攻撃者が実行したいプログラム(乗っ取るためのプログラムコードで「シェルコード」と呼ばれ、攻撃者は多くの場合、入力するデータの中に含めます)にプログラムの実行を遷移させます。

バッファオーバーフローを許す脆弱性と対策

バッファオーバーフローが起きる原因には、入力においてサイズチェックをしていないことや、攻撃の対象となるデータ領域でプログラム実行を許していることなどがあります。これらの脆弱性に対する対策としては、入力データのサイズをチェックする、攻撃者が狙うアドレスの位置をランダムにする、データ領域でのプログラム実行を禁止する、などがあります。最近の OS ではこれらの対策がなされていますが、100%守れる訳ではないので、注意が必要です。

SQLインジェクション

SQLインジェクションは、Web アプリケーションへの入力を悪用し、アプリケーションの背後で動作しているデータベースに不正にアクセスする攻撃です。SQLインジェクションが成功すると、攻撃者はほぼ自由にテータベースを操作きるようになるため、不正アクセスや、情報の窃取や改ざん、破壊などが可能になります。重要なデータをデータベースに格納していた場合は大きな被害になります。

SQLインジェクションの仕組み

Web アプリケーションの背後には、アプリケーションが参照や更新をするためのデータを提供するデータベースが用意されている場合が多いです。アプリケーションはユーザーの問い合わせや操作に応じてデータの参照や、更新処理を行うために、テータベースにSQL という言語で問い合わせを行います。問い合わせは、SQLのうたのユーザーが入力する部分が穴になったひな型に、入力値を埋めこむ方式で行われるため、ユーザーのデータベース操作には制限がかけられています。しかし、アプリケーションに入力する値を不正に操作することで、SQLの周い合わせの内容を自由に変えられてしまう場合があります。本来は参照しか許していないのに更新できてしまうと、意図しない情報の改ざんや破壊が起きてしまうのです。

SQLインジェクションを許す脆弱性と対策

SQLインジェクションが起きてしまう原因は、ユーザーの入力によって、データベースへの問い合わせの内容が単なる穴うめの範囲を超えて、自由に変えられてしまう脆弱性にあります。 変えられないようにする対策としては、入力値を使ってSQL文を組み立てる際にパラメーターバインドという機構を使うことなどがあります。