EN JP CN

SV.STRBO.UNBOUND_SPRINTF

SV.STRBO.UNBOUND_SPRINTF

バインドされていない sprintf からのバッファ オーバーフロー

書式設定された出力をメモリのバッファに書き込むには、関数 sprintf を使用します。この sprintf 関数には、コピー先として固定サイズ配列がありますが、出力データに制限値を課さないので、バッファオーバーフローが発生する可能性があります。

SV.STRBO.UNBOUND_SPRINTF チェッカーは、sprintf を呼び出すコードを探します。

脆弱性とリスク

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

脆弱コード例

1  int main()
2  {
3       char fixed_buf[10];
4       sprintf(fixed_buf,"Very long format string\n"); 
5       return 0;
6  }

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

修正コード例

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

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