CWE-14:编译器删除代码以清除缓冲区
Posted 追到风筝的人
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CWE-14:编译器删除代码以清除缓冲区相关的知识,希望对你有一定的参考价值。
ID:14
摘要:基础(Base)
结构:简单(simple)
描述(Description)
根据源代码清除敏感内存,但编译器优化会在内存未被再次读取时保持不动,也就是“死存储删除”。
补充描述(Extended Description)
这种编译器优化错误发生在:
1.秘密数据存储在内存中。
2.秘密数据通过覆盖其内容而从内存中清除。
3.源代码使用优化编译器进行编译,该编译器识别并删除将内容覆盖为死存储的功能,因为内存不会在随后使用。
相关弱项(Relationships)
CWE-733编译器优化删除或修改安全关键代码
CWE-733编译器优化删除或修改安全关键代码
引入模式(Modes Of Introduction)
不同的引入模式提供了有关如何和何时可能引入这种弱项的信息。 该阶段标识软件生命周期中可能发生引入的一个点,而注释提供了在给定阶段引入的典型场景。
实现
编译
程序平台(Applicable Platforms)
以下列表显示了可能出现的弱项。 这些可能是针对具体命名的语言、操作系统、体系结构、范式、技术或这类平台的一类。 该平台列出了该例给出的弱项的频率。
C、C++
后果(Common Consequences)
技术影响:读取内存; 旁路保护机制
这个弱项将允许读取未从内存中清除的数据。 如果此数据包含敏感的密码信息,则攻击者可以读取该密码并使用该信息绕过保护机制。
示例(Demonstrative Examples)
示例1:以下代码从用户读取密码,使用密码连接到后端主机,然后尝试使用memset()从内存中擦除密码。
void GetData(char *MFAddr)
{
char pwd[64];
if (GetPasswordFromUser(pwd, sizeof(pwd)))
{
if (ConnectToMainframe(MFAddr, pwd))
{
// Interaction with mainframe
}
}
memset(pwd, 0, sizeof(pwd));
}
如果逐个语句执行,该示例中的代码将正确运行;但如果使用优化编译器(例如Microsoft Visual C ++ .NET或GCC 3.x)编译代码,则对memset()的调用将可能出现“死存储删除”,因为缓冲区pwd在其值被清除后未被使用。由于缓冲区pwd包含敏感值,因此如果数据留在内存中,应用程序可能容易受到攻击。如果攻击者能够访问正确的内存区域,他们可以使用恢复的密码来控制系统。
通常的做法是重写内存中操作的敏感数据,如密码或加密密钥,以防止攻击者学习系统机密。但是,随着优化编译器的出现,程序并不总是像其源代码一样表现出来。在该示例中,编译器将对memset()的调用解释为死代码,因为写入的内存pwd不会被随后使用,尽管显然从安全的角度该操作有可能发生。这里的问题在于许多编译器,实际上很多编程语言,在努力提高效率时并未考虑到这一点以及其他安全问题。
攻击者通常通过使用核心转储或运行时机制来访问特定应用程序使用的内存并恢复秘密信息,从而利用这种类型的漏洞。一旦攻击者能够访问秘密信息,进一步利用该系统并且可能危及应用程序与之交互的其他资源相对简单。
可能的缓解措施
实现阶段:
如果可用,将敏感数据存储在“易失性”(volatile)存储位置中。
构建和编译阶段:
如果可能,请配置您的编译器,使其不会删除死存储。
架构和设计阶段:
在可能的情况下,加密软件系统使用的敏感数据。
成员信息
此成员关系表显示了将此弱项作为成员引用的其他CWE类别和视图。 这些信息通常有助于理解弱项在外部信息源环境中的位置。
7PK - Environment
OWASP Top Ten 2004 Category A8 - Insecure Storage
CERT C Secure Coding (2008 Version) Section 49 - Miscellaneous (MSC)
CERT C++ Secure Coding Section 49 - Miscellaneous (MSC)
CWE Cross-section
SFP Secondary Cluster: Exposed Data
以上是关于CWE-14:编译器删除代码以清除缓冲区的主要内容,如果未能解决你的问题,请参考以下文章