CodeQL 文档

memset 调用可能被删除

ID: cpp/memset-may-be-deleted
Kind: problem
Security severity: 7.8
Severity: warning
Precision: high
Tags:
   - security
   - external/cwe/cwe-14
Query suites:
   - cpp-code-scanning.qls
   - cpp-security-extended.qls
   - cpp-security-and-quality.qls

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

如果缓冲区随后没有使用,调用 memset 或 bzero 来清除缓冲区内容可能会被编译器优化掉。如果缓冲区包含敏感数据,攻击者可能以某种方式获取这些数据,这种行为是不可取的。

建议

使用不会被优化的替代平台提供的函数。此类函数的示例包括 memset_s、SecureZeroMemory 和 bzero_explicit。或者,将 -fno-builtin-memset 选项传递给 GCC/Clang 编译器通常也可以防止优化。最后,您可以使用公共领域的 secure_memzero 函数(请参阅下面的参考资料)。但是,此函数不能保证在所有平台和编译器上都能正常工作。

示例

以下程序片段使用 memset 在敏感信息不再需要后擦除它。

char password[MAX_PASSWORD_LENGTH];
// read and verify password
memset(password, 0, MAX_PASSWORD_LENGTH);

由于死存储消除,memset 调用可能会被编译器移除(因为缓冲区随后没有使用),从而导致敏感数据可能仍然保留在内存中。

解决此问题的最佳方法是使用 memset_s 函数而不是 memset

char password[MAX_PASSWORD_LENGTH];
// read and verify password
memset_s(password, MAX_PASSWORD_LENGTH, 0, MAX_PASSWORD_LENGTH);

参考资料

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