CodeQL 文档

字符串复制中可能错误的缓冲区大小

ID: cpp/bad-strncpy-size
Kind: problem
Security severity: 9.3
Severity: warning
Precision: medium
Tags:
   - reliability
   - correctness
   - security
   - external/cwe/cwe-676
   - external/cwe/cwe-119
   - external/cwe/cwe-251
Query suites:
   - cpp-security-extended.qls
   - cpp-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

标准库函数 strncpy 将源字符串复制到目标缓冲区。第三个参数定义要复制的最大字符数,并且应该小于或等于目标缓冲区的大小。形式为 strncpy(dest, src, strlen(src))strncpy(dest, src, sizeof(src)) 的调用错误地将第三个参数设置为源缓冲区的大小。执行此类型的调用可能会导致缓冲区溢出。缓冲区溢出可能导致从段错误到安全漏洞的各种问题。

建议

仔细检查突出显示的函数调用,并确保大小参数是从目标缓冲区的大小而不是源缓冲区的大小得出的。

示例

在以下示例中,源缓冲区的大小被错误地用作 strncpy 的参数

char src[256];
char dest1[128];

...

strncpy(dest1, src, sizeof(src)); // wrong: size of dest should be used

char *dest2 = (char *)malloc(sz1 + sz2 + sz3);
strncpy(dest2, src, strlen(src)); // wrong: size of dest should be used

更正后的版本使用目标缓冲区的大小或包含目标缓冲区大小的变量作为 strncpy 的大小参数

char src[256];
char dest1[128];

...

strncpy(dest1, src, sizeof(dest1)); // correct

size_t destSize = sz1 + sz2 + sz3;
char *dest2 = (char *)malloc(destSize);
strncpy(dest2, src, destSize); // correct

参考资料

  • cplusplus.com: strncpy.

  • I. Gerg. 缓冲区溢出攻击概述和示例. IANewsletter 第 7 卷第 4 期. 2005 年.

  • M. Donaldson. 缓冲区溢出攻击内部:机制、方法和防御. SANS 研究所信息安全阅读室. 2002 年.

  • 常见漏洞枚举:CWE-676.

  • 常见漏洞枚举:CWE-119.

  • 常见漏洞枚举:CWE-251.

  • ©GitHub, Inc.
  • 条款
  • 隐私