EN JP CN

SV.STRBO.UNBOUND_COPY

SV.STRBO.UNBOUND_COPY

バインドされていない文字列コピーからのバッファ オーバーフロー

ソース文字列をメモリのバッファにコピーするには、関数 strcpy を使用します。この strcpy 関数には、コピー先として固定サイズ配列がありますが、コピーされるデータに制限値を課さないので、バッファオーバーフローが発生する可能性があります。

SV.STRBO.UNBOUND_COPY チェッカーは、strcpy を呼び出すコードのインスタンスにフラグを立てます。

脆弱性とリスク

関数 strcpy は、コピー中の文字列の長さをチェックしないので、バッファオーバーランが容易に発生しかねません。できるなら、strncpy 関数を使用してアプリケーションでのバッファの使用状況をレビューするのが望ましいと言えます。

脆弱コード例

1  int main()
2  {
3       char FIXEDbuf[12];
4       strcpy(FIXEDbuf, "Something rather large");
5  
6       return 0;
7  }

Klocwork は 4 行目で指摘レポートを生成し、関数 strcpy がバッファ境界をチェックしないため、固定サイズ 12 のバッファ 'FIXEDbuf' でオーバーランすることがあることを示します。

修正コード例

1  int main()
2  {
3       char FIXEDbuf[23];
4       char *POINTERbuf;
5       strcpy(FIXEDbuf, "Something rather large");
6       strcpy(POINTERbuf, "Something very large as well");
7  
8       return 0;
9  }

修正コード例では、FIXEDbuf のサイズが 23 に増やされているため、strcpy 操作に十分な余地が確保されます。コードを修正する別のオプションとしては、strncpy を使用してバッファサイズをチェックする手法があります。