EN JP CN

SV.STRBO.BOUND_SPRINTF

SV.STRBO.BOUND_SPRINTF

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

書式設定された出力をメモリのバッファに書き込むには、関数 snprintf を使用します。パラメーターの中には、出力パラメーターおよび出力バッファに書き込む最大バイト数 (null 終了バイトも含む) を指すポインターがあります。このサイズパラメーターは、出力バッファで割り当てられたバイト数以下でなければなりません。サイズパラメーターが出力バッファのサイズより大きい場合、バッファオーバーフローが発生することがあります。

SV.STRBO.BOUND_SPRINTF チェッカーは、出力バッファとして固定サイズの配列を使用する snprintf を呼び出し、かつサイズパラメーターがバッファの既知のサイズより大きいコードを探します。

脆弱性とリスク

snprintf 関数が、出力バッファのサイズより大きいサイズパラメーターで呼び出されると、バッファオーバーランエラーが発生することがあります。これは、アプリケーションの不安定性や、注意深く練られた攻撃ではコード挿入やその他の脆弱性につながることがあります。

脆弱コード例

1  void foo(const char *src)
2  {
3     char buf[20];
4     snprintf(buf, 40, "%s", src);
5  }

Klocwork は 4 行目で指摘レポートを生成します。 これは、snprintf に指定されたサイズパラメーターが、出力バッファ 'buf' のサイズ 20 より大きい 40 であることによります。snprintf 関数でのサイズパラメーターは、出力バッファで割り当てられたバイト数以下でなければなりません。 そのため、この場合に 'src' 内の文字列の長さが 20 以上であれば、バッファオーバーフローが発生します。

修正コード例

1  void foo(const char *src)
2  {
3     char buf[20];
4     snprintf(buf, sizeof(buf), "%s", src);
5  }

修正コード例では、出力バッファより大きいサイズを指定することを回避するため、sizeof(buf) パラメーターが使用されています。