バッファーオーバーフロー
読み:バッファーオーバーフロー
外語:BOF: buffer overflow
バッファー
が
溢れる
こと、またそれにより生ずる不具合。
セキュリティホール
の一つ。バッファーオーバーランとも。
目次
概要
特徴
主犯
一向に減らない
改善方法
対策
概要
バッファーの大きさは一定であるが、それを超えた大きさのデータを書き込んでしまうと、該当のバッファーではない別の領域に書き込むことになり、無関係の領域のデータを破壊することになる。これがバッファーオーバーフローである。
例えば、
C
における入力関数のgets()ではバッファーの大きさを指定できず、そのためバッファーより大きなデータを受け取ってしまったり、
strcpy
関数で複写元の文字列が予想外に長くなり複写先のバッファーサイズが不足してしまったり等が主たる原因である。
特徴
主犯
よくバッファーオーバーフローを起こす関数は、以下のとおりである。この他にも、類似の関数はバッファーオーバーフローを起こすと考えて良い。
gets
→ fgets、gets_s (
C11
標準)、getline (GCC、POSIX)
sprintf
→
snprintf
(
C99
標準)
strcpy →
strlcpy
(BSD)
strcat → strlcat (BSD)
これら以外にも、Cの標準関数には数多の脆弱性があり、使い方を誤ると問題を生じる関数は枚挙に遑がない。
一向に減らない
人間がプログラムを書く以上、これはどうしても避けられない問題でもある。
strcpy、strcat、sprintf、この3関数の使用を禁止するだけでもバッファーオーバーフロー防止に絶大な効果があると期待されるが、それを強く主張すると、なぜか
djb教
と呼ばれる。
BSDでは、特にセキュリティ命の
OpenBSD
から代替として
strlcpy
、strlcat、
snprintf
という関数が用意された。snprintfは
C99
から標準規格となったが、それ以外はC標準にもPOSIX標準にもなっていないため、
GCC
開発側はこれを拒絶している。このためstrlcpy、strlcatは
glibc
には今もって追加されていない。
改善方法
djb教
の教祖様
djb
は、このバッファーオーバーフローだけは死んでも発生させないことを旨としており、危険な関数を使っていない。
そうでなくても、何があってもバッファーオーバーフローだけは絶対に阻止するコーディングを心がけるためには、次のような関数を使うことが推奨される。
strlcpy
(strcpyの代替)
strlcat (strcatの代替)
snprintf
(
sprintf
の代替)
いずれも
BSD
で利用可能。セキュリティ重視のBSDである「
OpenBSD
」などの影響から生まれたものである。同様に宗教である
Linux
では一般に使えない。
対策
Microsoft Windows
はじめ、
オペレーティングシステム
(OS)が複雑になるにつれOS自体がバッファーオーバーフローを数多く抱えることになり、ここからバッファーオーバーフローがあることを前提としたセキュリティ議論が本格化することとなった。
このような状況下でどのようにしてセキュリティがらみのバッファーオーバフローを防止するかについて、AMD、次いでIntelは、
NXビット
という
マイクロプロセッサー
側からのアプローチによる解決法を提供した。
再検索