EN JP CN

SV.FMT_STR.BAD_SCAN_FORMAT

SV.FMT_STR.BAD_SCAN_FORMAT

書式文字列の幅フィールドの欠落

文字列長のチェックを適切に行わないと、悪意のあるユーザーが悪用できるバッファオーバーフローの状況となります。SV.FMT_STR.BAD_SCAN_FORMAT チェッカーは、書式文字列で省略された幅指定 (%s) のインスタンスを検出します。

脆弱性とリスク

文字列幅のチェックに関する指摘は、悪用できる脆弱性をもたらす場合があります。最も一般的なのは、ワイド文字またはマルチバイト文字列が半角文字として正しく計算されていない場合や、単一の文字列の通常幅とワイド文字列の関数を混合した場合です。いずれの場合も、悪用できるバッファオーバーフローの状態となることがあります。

軽減と防止

このタイプのエラーを回避するには、次の操作を実行します。

  • 文字列の単位文字の長さを確認します
  • 出力先のバッファが文字列のサイズを処理できることを確認します
  • 文字列の幅を動的に計算します

脆弱コード例

1  void main() {
2      char s[16];
3      scanf("%s",s);
4 }

Klockwork は 3 行目で、文字列の幅がパーセント指定にないため、エラーにフラグを立てます。文字列の幅フィールドがないと、悪意のあるユーザーにより悪用される可能性があるバッファオーバーフローの状態となります。

修正コード例

1  void main() {
2      char s[16];
3      scanf("%15s",s);
4 }

修正されたコードでは、出力先バッファがオーバーフローしないことを確認して、正しい文字列の幅を提供します。