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 が提供しているアプリケーションセキュリティトレーニング教材。