SV.FMT_STR.BAD_SCAN_FORMAT
缺少用于格式字符串的宽度字段
不适当的字符串长度检查可能导致缓冲区溢出,这一点可能被恶意用户利用。SV.FMT_STR.BAD_SCAN_FORMAT 检查器查找那些格式字符串中缺少宽度规范 (%s) 的实例。
漏洞与风险
某些字符串宽度检查问题可能导致可利用的漏洞。将宽字符串或多字节字符串错误地计算为单字节字符,或者将单一字符串的标准宽度函数和宽字符串函数弄混,是这类问题最为常见的实例。这两种情况都可能导致可利用的缓冲区溢出情况。
缓解与预防
要避免此类错误:
- 验证字符串单位字符的长度
- 确保目标缓冲区可以处理字符串的大小
- 动态计算字符串的宽度
漏洞代码示例
复制
void main() {
char s[16];
scanf("%s",s);
}
Klockwork 标记出第 3 行中存在错误,因为 %s 规范中缺少字符串宽度。只要字符串的宽度字段缺失就可能导致缓冲区溢出,这一点可能被恶意用户利用。