使用危险函数¶
ID: cpp/dangerous-function-overflow
Kind: problem
Security severity: 10.0
Severity: error
Precision: very-high
Tags:
- reliability
- security
- external/cwe/cwe-242
- external/cwe/cwe-676
Query suites:
- cpp-code-scanning.qls
- cpp-security-extended.qls
- cpp-security-and-quality.qls
此规则查找对 gets
函数的调用,该函数很危险,不应使用。有关标识其他危险函数的规则,请参阅下面的**相关规则**。
gets
函数是 1988 年互联网蠕虫病毒利用的漏洞之一,该蠕虫病毒是首批通过互联网传播的计算机蠕虫病毒之一。gets
函数无法限制读取和存储的数据量,因此在事先不知道输入的情况下,无法对任何大小的缓冲区安全地使用它。
建议¶
将对 gets
的调用替换为 fgets
,并指定要复制的最大长度。这将防止缓冲区溢出。
示例¶
以下示例以两种方式从标准输入获取字符串
#define BUFFERSIZE (1024)
// BAD: using gets
void echo_bad() {
char buffer[BUFFERSIZE];
gets(buffer);
printf("Input was: '%s'\n", buffer);
}
// GOOD: using fgets
void echo_good() {
char buffer[BUFFERSIZE];
fgets(buffer, BUFFERSIZE, stdin);
printf("Input was: '%s'\n", buffer);
}
第一个版本使用 gets
,如果输入的长度超过缓冲区,则会发生溢出。第二个版本的代码使用 fgets
,并且不会发生溢出,因为写入的数据量受长度参数的限制。