米Microsoftが開発中の開発ツール「Visual Studio 2005」(開発コード名Whidbey)では,C言語のランタイム関数にバッファ・オーバーランへの対策が図られることが分かった。具体的には,strcat,strcpy,strlenなど,strで始まる一連の文字列操作関数や,lsearch,memmoveなどメモリー領域を操作する関数に,バッファ長をチェックする機能を追加した新しい関数を用意する。バッファ・オーバーランとは,プログラムが用意した入力バッファに,バッファ長を超える大きなデータを送りつけることで不正なプログラムを動かす攻撃方法。

 新しい関数では,もしもバッファ長を超えたアクセスがあると,例外が発生する。Microsoft製に限らず,既存の標準C言語ランタイムの文字列操作関数群はバッファ長をチェックしていない。そのため,潜在的にバッファ・オーバーランの危険性を含んでいる。

 バッファ・オーバーラン対策が図られた関数は,バッファ長を受け取るための引数が1つ増えている。新しい安全な関数名は,strcatに対してstrcat_sのように,それに対応する古い関数名に「_s」が付けられている。

 例えば,次のようなプログラムはstrcpy関数のところでバッファ・オーバーランを起こす。

int main( void )
{
 char strDst[5];
 const char* strSrc = "Hello World!";
 strcpy( strDst, strSrc );
 printf( strDst );

 return 0;
}

 上のコードを新しい関数で書き換えると次のようになる。

int main( void )
{
 char strDst[5];
 const char* strSrc = "Hello World!";
 strcpy_s( strDst, 5, strSrc );
 printf( strDst );

 return 0;
}

 なお,既存のVisual C++でも,/GSオプションを付けてコンパイルすれば,実行時にバッファ・オーバーランを検出すると強制終了する。WhidbeyのVisual C++では,/GSオプションが標準でオンになっている。ちなみに,今年6月にリリース予定のWindows XP Service Pack 2は,/GSオプション付きでコンパイルされている。

(山口 哲弘=日経Windowsプロ)