SV.FMT_STR.BAD_SCAN_FORMAT

缺少用于格式字符串的宽度字段

不适当的字符串长度检查可能导致缓冲区溢出,这一点可能被恶意用户利用。SV.FMT_STR.BAD_SCAN_FORMAT 检查器查找那些格式字符串中缺少宽度规范 (%s) 的实例。

漏洞与风险

某些字符串宽度检查问题可能导致可利用的漏洞。将宽字符串或多字节字符串错误地计算为单字节字符,或者将单一字符串的标准宽度函数和宽字符串函数弄混,是这类问题最为常见的实例。这两种情况都可能导致可利用的缓冲区溢出情况。

缓解与预防

要避免此类错误:

  • 验证字符串单位字符的长度
  • 确保目标缓冲区可以处理字符串的大小
  • 动态计算字符串的宽度

漏洞代码示例

复制
  void main() {
      char s[16];
      scanf("%s",s);
 }

Klockwork 标记出第 3 行中存在错误,因为 %s 规范中缺少字符串宽度。只要字符串的宽度字段缺失就可能导致缓冲区溢出,这一点可能被恶意用户利用。

修正代码示例

复制
  void main() {
      char s[16];
      scanf("%15s",s);
 }

在经修正的代码中,正确地提供了字符串的宽度,从而保证目标缓冲区不会溢出。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。