SV.STRBO.UNBOUND_COPY
バインドされていない文字列コピーからのバッファ オーバーフロー
ソース文字列をメモリのバッファにコピーするには、関数 strcpy を使用します。この strcpy 関数には、コピー先として固定サイズ配列がありますが、コピーされるデータに制限値を課さないので、バッファオーバーフローが発生する可能性があります。
SV.STRBO.UNBOUND_COPY チェッカーは、strcpy を呼び出すコードのインスタンスにフラグを立てます。
脆弱性とリスク
関数 strcpy は、コピー中の文字列の長さをチェックしないので、バッファオーバーランが容易に発生しかねません。できるなら、strncpy 関数を使用してアプリケーションでのバッファの使用状況をレビューするのが望ましいと言えます。
脆弱コード例
コピー
int main()
{
char FIXEDbuf[12];
strcpy(FIXEDbuf, "Something rather large");
return 0;
}
Klocwork は 4 行目で指摘レポートを生成し、関数 strcpy がバッファ境界をチェックしないため、固定サイズ 12 のバッファ 'FIXEDbuf' でオーバーランすることがあることを示します。
修正コード例
コピー
int main()
{
char FIXEDbuf[23];
char *POINTERbuf;
strcpy(FIXEDbuf, "Something rather large");
strcpy(POINTERbuf, "Something very large as well");
return 0;
}
修正コード例では、FIXEDbuf のサイズが 23 に増やされているため、strcpy 操作に十分な余地が確保されます。コードを修正する別のオプションとしては、strncpy を使用してバッファサイズをチェックする手法があります。
関連チェッカー
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。