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("%s",str) 替换 printf(str) 调用以指定字符串。
复制
int main()
{
printf("%s",some_unknown_function("This is better")); /* SV.FMTSTR.GENERIC not reported */
return 0;
}