バッファオーバーフローとは?実践的なウォークスルー
実際のC言語の例、スタック図、そして自分で動作を確認するツールを使って、バッファオーバーフローがどのように機能するかを学びます。
バッファオーバーフローは、プログラムが固定サイズのメモリ領域に、その領域が保持できる以上のデータを書き込むときに発生します。余ったバイトが隣接するメモリに流れ込み、そのバッファの隣に何があるかによって、変数を破損させたり、プログラムをクラッシュさせたり、実行フローを完全に乗っ取ったりすることができます。これはソフトウェアセキュリティにおける最古のバグクラスの1つであり、今日でもCTF、CVE、組み込みファームウェアに現れます。
脆弱なパターン
C言語の典型的な例です。
#include <string.h>
void greet(char *name) {
char buffer[64];
strcpy(buffer, name);
}
int main(int argc, char **argv) {
greet(argv[1]);
return 0;
}
strcpyは渡した文字列をbufferにコピーしますが、境界チェックはありません。argv[1]が64バイトより長い場合、コピーは配列の終端を超えて続きます。スタック上では、bufferは他のローカル変数、保存されたレジスタ、そして最終的にgreet()終了後にCPUがどこにジャンプするかを示すリターンアドレスの下に位置します。そのリターンアドレスを制御できるアドレスで上書きすれば、次に何が実行されるかを制御できます。
これがなぜコンパイルされて実行されるのか
CとC++は生の配列に対する自動境界チェックを行いません。strcpy、gets、sprintf、strcatのような関数は、宛先の実際のサイズについて考えず、ヌル終端子か送信元の長さについてのみ考えるため、バッファの終端を超えて書き込むことをいといません。これを、明示的なサイズ引数を取ってそこで停止するstrncpyやsnprintfと比較してください。脆弱性は実際には
この記事は AI の支援を受けて執筆し、Korra Studio の Michal Pilch(CISSP)が確認のうえ公開しました。
これは Korra Studio ナレッジベースの 1 つのノートです。プラットフォームはすべてのトピックと 1 対 1 メンタリングをペアで提供します。
無料で始めるarrow_forward