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