ABV.UNKNOWN_SIZE

缓冲区溢出 — 超出边界、大小未知的数组索引

缓冲区溢出或溢出是一种异常现象,其中将数据写入缓冲区的程序会溢出缓冲区的边界并覆盖相邻的内存。通常,当一个程序将字符串复制到缓冲区时,便会发生这种问题。

C 和 C++ 不提供任何内置保护功能来阻止访问或覆盖内存任何部分中的数据,也不自动检查写入某一数组(此语言的内置缓冲区类型)的数据是否在该数组的边界内。

当数组的大小未知时,ABV.UNKNOWN_SIZE 检查器会查找数组边界违规情况。

漏洞与风险

旨在执行代码或改变程序操作方式的输入可触发缓冲区溢出。这可能导致程序行为不稳定,包括内存访问错误、错误的结果、故障或系统安全漏洞。

缓冲区溢出的后果包括有效数据被覆盖以及执行任意和潜在恶意代码。例如,缓冲区溢出可通过以下三种方式操纵程序:

  • 覆盖内存中缓冲区附近的局部变量,以更改程序的行为使之有利于攻击者
  • 覆盖堆栈帧中的返回地址,以便在攻击者指定的返回地址(通常为用户输入填充的缓冲区)处恢复执行
  • 覆盖随后将执行的函数指针或异常处理程序

漏洞代码示例

复制
  extern char buf[];

  void foo(const char* pbuf)
  {
    int n = -1;
    if (pbuf) {
       n = strlen(pbuf);
       // more code
    }
    buf[n] = '\0';
  }

当能够作出以下结论时,Klocwork 将报告此缺陷:发生缓冲区溢出,且未能准确知道缓冲区大小:大小未知的数组 buf 可以使用索引值 -1。

安全培训

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

扩展

此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。