ABV.UNICODE.FAILED_MAP

缓冲区溢出 — 失败的映射函数中超出边界的数组索引

ABV.UNICODE.FAILED_MAP 可检查失败的 MultiByteToWideChar 和 WideCharToMultiByte 映射函数中引起的缓冲区溢出状况。通常,当源指针和目标指针相同,或指向接收转换字符串的缓冲区的指针为 NULL,但下一参数(缓冲区大小,以字符数表示)未设置为 0 时,该检查器便会检测到相应状况。

有关 MultiByteToWideChar 和 WideCharToMultiByte 映射函数的详细信息,请参阅 MSDN 网站。

漏洞与风险

如果未正确使用这些映射函数,将导致缓冲区溢出,从而威胁应用程序的安全。为避免在将来发生这种状况,请务必为缓冲区接收的数据类型指定适合的缓冲区大小。

漏洞代码示例 1

复制
  int
  foo1 (void *src, int size) {
    int res;
    res = WideCharToMultiByte(CP_ACP, 0, src, -1, 0, 3, 0, 0);
    if (res) return res;
    res = WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, size, 0, 0);
    if (res) return res;
    return WideCharToMultiByte(CP_ACP, 0, src, -1, 0, 0, 0, 0);

Klocwork 报告了一个无效参数,因为指向接收转换字符串的缓冲区的指针为 NULL,但是在第 4 行中,以字节数表示的大小设置为 3 而不是 0。在本例中,缓冲区大小参数与字符串转换缓冲区指针不对应。

安全培训

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

扩展

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