SV.BANNED.RECOMMENDED.SPRINTF

禁止された sprintf 関数呼び出し

安全とは考えられない多数の C/C++ 関数があり、それを理由に '禁止された' として知られています。これらの関数を以下に示します。

  • alloca などのメモリ割り当て関数
  • strcat や strncat などの文字列連結関数
  • strcpy や strncpy などの文字列コピー関数
  • gets や _getts などの取得関数
  • IsBadWritePtr などの isbad 関数
  • _iota や _itow のような数値変換関数
  • CharToOem のような OEM 変換関数
  • _splitpath や makepath のようなパス関数
  • scanf のようなスキャン関数
  • sprintf や snprintf のような文字列表示関数
  • strtok のような文字列トークン作成関数

チェッカーの SV.BANNED ファミリーは、禁止された関数の使用をコード内に検出します。

SV.BANNED.RECOMMENDED.SPRINTF チェッカーは、安全でない sprintf 型関数の使用にフラグを立て、書式設定されたデータをサイズが指定されたバッファ (固定サイズ) に作成込む 'unsafe' 文字列関数に関する欠陥を報告します。

脆弱性とリスク

これらの多くの禁止された関数は、バッファオーバーランにつながる可能性があるために禁止されました。

strcpy や strcat のような関数と同様に、禁止された関数のリストには、strncpy や strncat のような対応する 'n' 関数が多く含まれています。一致している非 'n' 関数の置換として 'n' 関数がしばしば推奨されますが、現在ではオーバーフローしたバッファの非 null 終了やオーバーフローで返るエラーが欠落しているという指摘があると考えられています。

軽減と防止

禁止されたこれらの API の使用を妨げることは、多数のコード脆弱性を排除するのに良い方法です。禁止された関数は、より安全なバージョンと置換される必要があります。そうでなければ、禁止された関数を完全に回避するため、コードを再設計する必要があります。

セキュリティに関する問題を回避するには、お使いのコンパイラについて同等で安全なものがあれば、関数の各カテゴリで同等で安全な関数を使用することをお勧めします。Microsoft は、時折、関数を更新および廃止しますので、必ず最新のドキュメンテーションを http://msdn.microsoft.com/ でチェックしてください。 場合によっては、置換関数はありません。このため、コードのアーキテクチャの再構築が推奨されます。

Microsoft コンパイラユーザーの場合は、sprintf 関数について StrSafe ライブラリの関数の使用を検討してください。これらの関数は、StringCchPrintf、StringCchVPrintf、StringCchPrintfEx、StringCchVPrintfEx、StringCbPrintf、StringVCbPrintf、StringCbPrintEx、または StringCbVPrintEx で、文字カウントやバイトカウントによっては異なります。

gcc ユーザーの場合は、__snprintf_chk.c や __sprintf_chk.c など、libssp ライブラリの関数の使用を検討してください。

他のオプションとしては、sprintf_s、_snprintf_s、_snwprintf_s、_vstprintf_s、_vsntprintf_s など、Safe CRT 関数があります。

安全な置換関数の使用に加えて、出力先バッファが適切なサイズであるかチェックすることが重要です。オプションとして検討できることは、直接バッファを操作する代わりに、std::string テンプレートクラスを使用することです。

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

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