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
如果缓冲区随后没有使用,调用 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);
参考资料¶
CERT C 编码标准:MSC06-C. Beware of compiler optimizations.
USENIX:高级计算系统协会:Dead Store Elimination (Still) Considered Harmfuls
常见弱点枚举:CWE-14.