描述
敏感的记忆清除根据源代码,但编译器优化离开内存没有不会再读,又名“死存储删除。”
扩展描述
这个编译器优化时发生错误:
- 1。机密数据被存储在内存中。
- 2。上擦除记忆的秘密数据覆盖其内容。
- 3所示。源代码编译使用一个优化编译器,识别和删除功能,覆盖的内容作为一个商店,因为记忆是不习惯后来死了。
的关系
模式的介绍
不同模式的引入提供了信息如何以及何时可以纳入这一弱点。生命周期的阶段识别点的介绍可能发生,而相关的报告提供了一个典型的场景介绍在给定的阶段。
常见的后果
这个表指定不同的个人相关后果的弱点。标识应用程序范围的安全领域侵犯,而影响了负面的技术影响,如果敌人成功利用这个弱点。可能提供的信息如何可能的具体结果预计将看到列表中相对于其它后果。例如,可能会有高可能性,缺点将被利用来实现一定的影响,但较低的可能性,它将被利用来实现不同的影响。
范围 |
影响 |
可能性 |
保密 访问控制
|
这个弱点将允许没有清除数据从内存中读取。如果这个密码数据包含敏感信息,攻击者可以读取密码,并利用这些信息来绕过保护机制。 |
|
示范例子
示例1
下面的代码从用户读取密码,使用密码连接到后端主机,然后试图从内存擦洗密码使用memset ()。
无效的GetData (char * MFAddr) {
char pwd [64]; 如果(GetPasswordFromUser (pwd, sizeof (pwd))) {
如果(ConnectToMainframe (MFAddr pwd)) { }
} memset (pwd 0 sizeof (pwd));
}
中的代码示例将正确的行为如果是逐字执行,但是如果使用一个优化的编译器编译的代码,如Microsoft Visual c++ . net或GCC 3。x,然后调用memset()将被删除死商店因为缓冲pwd后没有使用价值是覆盖[18]。因为缓冲pwd包含敏感值,应用程序可能容易受到攻击如果数据常驻内存。如果攻击者可以访问正确的内存区域,他们可能使用恢复密码系统的增益控制。
常见的做法是覆盖在内存中敏感数据操纵,如密码或密钥,为了防止攻击者学习系统的秘密。然而,随着优化编译器的出现,程序并不总是像他们的源代码本身。在这个例子中,编译器将调用memset()是死代码因为内存写入不是随后使用,尽管事实上,显然是一个安全操作发生的动机。这里的问题是,许多编译器,事实上许多编程语言,不考虑这个和其他安全问题在他们努力提高效率。
攻击者通常利用这种类型的漏洞利用核心转储或运行时的机制来访问一个特定的应用程序使用的内存和恢复秘密信息。一旦攻击者访问机密信息,它是相对简单的进一步利用系统和可能的妥协其他资源与应用程序进行交互。
潜在的缓解措施
实施阶段:
将敏感数据存储在内存位置如果可用“动荡”。 |
阶段:构建和编译
如果可能的话,配置您的编译器,以便它不删除死商店。 |
阶段:体系结构和设计
在可能的情况下,加密敏感数据使用的软件系统。 |
检测方法
黑盒
这个特定的弱点是不可能使用黑盒方法检测。尽管分析师可以检查内存来看到它没有擦洗,可执行的分析不会成功。这是因为编译器已经删除了相关代码。只有源代码显示了程序员是否打算清除内存,这别人的弱点是没有区别的。 |
白盒子
这个弱点只使用白盒方法可检测(见黑盒检测因素)。需要仔细分析来确定代码编译器可能会被删除的。 |
影响资源
会员资格
这MemberOf关系表显示额外CWE类别和视图引用这个弱点作为成员。这些信息通常是有用的在理解一个弱点符合外部信息源的上下文中。
脆弱性映射笔记
用法:允许
(CWE ID可以用来映射到现实世界的漏洞) |
原因:可接受的使用 |
理由是: 这个CWE条目是变体的抽象级别,这是一个首选的抽象级别映射到漏洞的根本原因。 |
评论: 仔细阅读这两个名称和描述,以确保此映射是一个适当的配合。不要试图“力”映射到底层基础/变体只是遵守这首选的抽象级别。 |
分类法映射
映射分类名称 |
节点ID |
适合 |
映射节点名 |
7有害的王国 |
|
|
不安全的编译器优化 |
千鸟 |
|
|
敏感的编译器未清偿的内存优化 |
OWASP十大2004 |
A8 |
CWE更具体 |
不安全的存储 |
CERT C安全编码 |
MSC06-C |
|
注意编译器优化在处理敏感数据 |
软件故障模式 |
SFP23 |
|
公开的数据 |
引用
更多的信息是可用的,请编辑自定义过滤器或选择一个不同的过滤器。
|