CodeQL 文档

对 strncat 的潜在不安全调用

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

点击查看 CodeQL 代码库中的查询

标准库函数 strncat 将源字符串追加到目标字符串。第三个参数定义要追加的最大字符数,并且应小于或等于目标缓冲区中的剩余空间。

形式为 strncat(dest, src, strlen(dest))strncat(dest, src, sizeof(dest)) 的调用将第三个参数设置为目标缓冲区的整个大小。执行这种类型的调用可能会导致缓冲区溢出,除非已知缓冲区为空。

类似地,形式为 strncat(dest, src, sizeof (dest) - strlen (dest)) 的调用允许在 dest 缓冲区之外写入一个字节。

缓冲区溢出可能导致从段错误到安全漏洞的任何问题。

建议

仔细检查突出显示的函数调用,以确保不会发生缓冲区溢出。为了获得更强大的解决方案,请考虑更新函数调用以包含目标缓冲区中的剩余空间。

示例

strncat(dest, src, strlen(dest)); //wrong: should use remaining size of dest

strncat(dest, src, sizeof(dest)); //wrong: should use remaining size of dest. 
                                  //Also fails if dest is a pointer and not an array.
 
strncat(dest, source, sizeof(dest) - strlen(dest)); // wrong: writes a zero byte past the `dest` buffer.

strncat(dest, source, sizeof(dest) - strlen(dest) - 1); // correct: reserves space for the zero byte.

参考文献

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