バッファーオーバーフロー
読み:バッファーオーバーフロー
外語:BOF: buffer overflow

 バッファー溢れること、またそれにより生ずる不具合。セキュリティホールの一つ。バッファーオーバーランとも。
目次

概要
 バッファーの大きさは一定であるが、それを超えた大きさのデータを書き込んでしまうと、該当のバッファーではない別の領域に書き込むことになり、無関係の領域のデータを破壊することになる。これがバッファーオーバーフローである。
 例えば、Cにおける入力関数のgets()ではバッファーの大きさを指定できず、そのためバッファーより大きなデータを受け取ってしまったり、strcpy関数で複写元の文字列が予想外に長くなり複写先のバッファーサイズが不足してしまったり等が主たる原因である。

特徴

主犯
 よくバッファーオーバーフローを起こす関数は、以下のとおりである。この他にも、類似の関数はバッファーオーバーフローを起こすと考えて良い。
 これら以外にも、Cの標準関数には数多の脆弱性があり、使い方を誤ると問題を生じる関数は枚挙に遑がない。

一向に減らない
 人間がプログラムを書く以上、これはどうしても避けられない問題でもある。
 strcpy、strcat、sprintf、この3関数の使用を禁止するだけでもバッファーオーバーフロー防止に絶大な効果があると期待されるが、それを強く主張すると、なぜかdjb教と呼ばれる。
 BSDでは、特にセキュリティ命のOpenBSDから代替としてstrlcpy、strlcat、snprintfという関数が用意された。snprintfはC99から標準規格となったが、それ以外はC標準にもPOSIX標準にもなっていないため、GCC開発側はこれを拒絶している。このためstrlcpy、strlcatはglibcには今もって追加されていない。

改善方法
 djb教の教祖様djbは、このバッファーオーバーフローだけは死んでも発生させないことを旨としており、危険な関数を使っていない。
 そうでなくても、何があってもバッファーオーバーフローだけは絶対に阻止するコーディングを心がけるためには、次のような関数を使うことが推奨される。
 いずれもBSDで利用可能。セキュリティ重視のBSDである「OpenBSD」などの影響から生まれたものである。同様に宗教であるLinuxでは一般に使えない。

対策
 Microsoft Windowsはじめ、オペレーティングシステム(OS)が複雑になるにつれOS自体がバッファーオーバーフローを数多く抱えることになり、ここからバッファーオーバーフローがあることを前提としたセキュリティ議論が本格化することとなった。
 このような状況下でどのようにしてセキュリティがらみのバッファーオーバフローを防止するかについて、AMD、次いでIntelは、NXビットというマイクロプロセッサー側からのアプローチによる解決法を提供した。

再検索