SV.FMTSTR.GENERIC
書式文字列の脆弱性
書式文字列が明示的でない場合、コードの外から挿入される場合があります。 つまり、攻撃者は、任意のコードを実行するための特別に作成された書式文字列を提供できるという意味です。このタイプの脆弱性は、通常は次のような場合にもたらされます。
- 定数の書式文字列が省略されたログメッセージを構成するコード
- 言語指定のリポジトリが脆弱なローカリゼーションの場合
SV.FMTSTR.GENERIC チェッカーは、ユーザーが影響を及ぼす書式文字列のインスタンスを検出します。
脆弱性とリスク
printf 関数にある外部で制御された書式文字列は、バッファオーバーフローやデータ表現に関する問題につながります。このタイプの脆弱性により、ローカルまたはリモートの攻撃者は、サービス拒否 (DoS) 攻撃、メッセージに挿入される書式指定子を介して任意コードの実行を行うことができます。
軽減と防止
書式文字列の指摘を回避するには
- 任意の書式文字列の挿入の可能性を排除します。すべての書式文字列関数は、ユーザーが制御できない静的文字列に渡されます。
- すべてのユーザー入力を承認し、挿入される可能性のある書式文字列をレビューします。
- 必要に応じて、書式文字列で %n 演算子をサポートしない関数を使用します。
脆弱コード例 1
コピー
int main()
{
printf(some_unknown_function("This is suspicious")); /* SV.FMTSTR.GENERIC reported here */
return 0;
}
修正コード例 1
Printf(gettext(str)) 呼び出しは、この例で示すように許容されます。
コピー
int main()
{
printf(gettext("This should be OK")); /* No defect reported here */
return 0;
}
脆弱コード例 2
コピー
int main()
{
printf(some_unknown_function("This is suspicious")); /* SV.FMTSTR.GENERIC reported here */
return 0;
}
修正コード例 2
可能であれば、printf(str) 呼び出しを printf("%s",str) で置換して文字列を指定します。
コピー
int main()
{
printf("%s",some_unknown_function("This is better")); /* SV.FMTSTR.GENERIC not reported */
return 0;
}