« 「switch&case」の最適化は? | トップページ | 『脆弱性』を利用したルート権限の乗っ取りって? »

2006年2月24日 (金)

脆弱性…て?

良く耳にする『脆弱性』…。

「○○に深刻な脆弱性」
など良く目にする。

この脆弱性をプログラムで書くと…
こんな感じ…。

※便利なので使っていたらバグりました…。

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);
}

実際に最初の処理で例外が発生することは、
無かったのだが…

エラー時のエラー表示内で例外が発生して
『およおよ…。どこがおかしいんだ?』
とちょぃっと悩まされた…。

エラー処理に脆弱性が有ったらまずいよね…。
でも、以外にバグがあるものなのだ…。

|

« 「switch&case」の最適化は? | トップページ | 『脆弱性』を利用したルート権限の乗っ取りって? »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/8810063

この記事へのトラックバック一覧です: 脆弱性…て?:

« 「switch&case」の最適化は? | トップページ | 『脆弱性』を利用したルート権限の乗っ取りって? »