脆弱性…て?
良く耳にする『脆弱性』…。
「○○に深刻な脆弱性」
など良く目にする。
この脆弱性をプログラムで書くと…
こんな感じ…。
※便利なので使っていたらバグりました…。
void debug_print(char*format,...)
{
va_list Args;
char buffer[64];/* <<実際には512とかにしてあった…。*/
va_start(Args,format);
vsprintf(buffer,format,Args);
OutputDebugString(buffer);
}
これの何処が脆弱かと言うと…
64バイト以上の入力があると、
ワークをオーバーして書き込んでしまう。
当然リターンアドレス等を破壊する…。
すると…
プログラムカウンタたんが
何処かに迷われてしまいます…。
(「たん」付けると萌える!…かも…)
そこで、入力オーバーに対処したのがこれ。
void debug_print(char*format,...)
{
va_list Args;
char buffer[64];
va_start(Args,format);
_vsnprintf(buffer,sizeof(buffer)-1,format,Args);
buffer[sizeof(buffer)-1]=0;
OutputDebugString(buffer);
}
でも、厳密には脆弱性を残している…。
オーバー時に2バイト文字をぶった切った場合
「0x8200」とかのコードになる…。
こんな時、2バイト文字の1文字と
判断する可能性がある。
すると、文字列のエンドコードを求めて
何処までも処理が突き進み…
最悪な何かが起こるかもしれない…。
※「OutputDebugString」は、終了してくれるが
自前の処理は、その限りじゃぁないからねぇ…。
で2バイト文字も考慮するとこうなる。
void debug_print(char*format,...)
{
va_list Args;
char buffer[64];
va_start(Args,format);
_vsnprintf(buffer,sizeof(buffer)-2,format,Args);
buffer[sizeof(buffer)-2]=0;
buffer[sizeof(buffer)-1]=0;
OutputDebugString(buffer);
}
実際に最初の処理で例外が発生することは、
無かったのだが…
エラー時のエラー表示内で例外が発生して
『およおよ…。どこがおかしいんだ?』
とちょぃっと悩まされた…。
エラー処理に脆弱性が有ったらまずいよね…。
でも、以外にバグがあるものなのだ…。
| 固定リンク
コメント