对 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
标准库函数 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.