CodeQL 文档

使用危险函数

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

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

此规则查找对 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,并且不会发生溢出,因为写入的数据量受长度参数的限制。

参考

  • ©GitHub 公司
  • 条款
  • 隐私