バッファオーバーラン関連についての豆知識。
バッファオーバーランは、別名バッファオーバーフローと言われます。
よくこれを悪用して、悪意のあるコードが実行されます。
Windowsのことですが・・・まず、バッファオーバーランの仕組みについて説明します。
プログラムは固定長または非固定長のデータ領域をメモリ上に確保します。
データ領域(変数)には、数値、文字、メモリアドレスなどが格納され、順番にCPUが読み込んで処理していきます。
確保されるデータ領域は、予め指定された(固定長)又は、扱うデータサイズ分(非固定長)確保されます。
この
メモリ上に確保されたデータ領域よりも大きなデータが格納されると、バッファオーバーランになるのです。
無駄にデカイ図だとこんな感じになります。
OSや別プログラムが使用している領域までもが書き換えられるかもしれません。
この場合、最悪OSがハングアップしますし、他のデータが破損します。
もちろん、殆どの場合バッファオーバーランを起こしたプログラムもエラーになります。
これがバッファオーバーランの仕組みです。
いかに危険なことか理解できたでしょうか。
次に何故悪意のあるコードが実行できてしまうのか説明しましょう。
*プログラミングをやっている方なら理解しやすいのですが、難しい説明になります。
なので読みたい方は続きを読んでください。
まず、メモリ上にあるデータについてもう少し詳しく説明します。
メモリ上には前述の通り、数値、文字、メモリアドレスなどが格納されています。
他には、CPUが次に処理する命令のアドレスや、制御を呼び出し元へ戻すための呼び出し元のアドレスが格納されます。
C言語だと、関数へのポインタとreturn文ですね。
さて、
もし次に処理する命令のアドレスを変更できたならばどうなるでしょうか?変更されなければ、当然プログラムされたと通りの動作を実行しますね。
しかし、変更されてしまえば、第三者による意図しないコードの実行を許してしまうのです。
これは、バッファオーバーランによって引き起こされるのです。
メモリ上に確保されたデータ領域の隣に、CPUが
次に処理する予定の命令のアドレスが格納されている場合があります。(図のオレンジ色が命令のアドレスと考える)
このデータ領域以上のデータを格納した場合、次に処理する予定の命令のアドレスが
他のデータに書き換えられます。
このときうまい具合にバッファオーバーランを起こすと、
悪意のあるコードをCPUに実行させることが出来てしまうのです。
つまり、
他のデータが悪意のあるコードのアドレスになるのです。
これらの脆弱性、欠陥はセキュリティーホールと呼ばれています。
プログラマーは、バッファオーバーランに気を付けないといけません。
慣れれば、無意識のうちにそのように書くのでしょうが・・・というか、それが当たり前かな。
しかし、Windows XP SP2以降にはデータ実行防止(Data Execute Prevention)が搭載されいますので、上記の方法でのコード実行は殆どできないでしょう。
だからといって簡単にあきらめる様だとプログラマとしては落第点
バッファアンダーラン、別名バッファアンダーフローというものも存在します。
これは必要なデータ容量よりも下回ってしまい起こるもので、バッファオーバーランとは真逆のもの。
主に、CDやDVDの書き込みのときに発生。
現在では、書き込みドライブには、バッファアンダーランエラー防止機能搭載が当たり前ですので、心配ないですがね。
CD等への書き込み時にデータは、ドライブのキャッシュに溜め込まれてから書き込まれます。
データの流れ:HDD→メインメモリ→ドライブキャッシュ→CD/DVDに書き込み
ドライブ内のキャッシュへのデータ転送が遅いと、キャッシュが空になり、わけわからんデータのディスクになってしまいます。
バッファアンダーランエラー防止機能は、キャッシュが空になったら書き込みを一時停止し、キャッシュにデータが届いたら停止位置から再度書き込みを始める機能です。
しかし、最近のPCなら性能が向上しており、あまり起こらないと思われます。
ちなみに最近のCD/DVDドライブのキャッシュ容量は2048KB(2MB)、BDドライブは8MBほども搭載しています。
昔のCDドライブだと16MB搭載もあった。
tema:プログラミング
- Genre:コンピュータ
-
2010/04/19(月) 13:08:52|
-
豆知識
-
| Track back:0
-
| Comment:3