SV.STRBO.UNBOUND_SPRINTF

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

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

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

脆弱性とリスク

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

脆弱コード例

コピー
  int main()
  {
       char fixed_buf[10];
       sprintf(fixed_buf,"Very long format string\n"); 
       return 0;
  }

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

修正コード例

コピー
  int main()
  {
       char fixed_buf[23];
       char *pointer_buf;
       strcpy(fixed_buf, "Something rather large");
       strcpy(pointer_buf, "Something very large as well");
  
       return 0;
  }

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

セキュリティトレーニング

Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。