安全领域一直在讨论一种名为“原子轰炸”的新代码注入技术(参见Injection Attack Description和Information Security Stack Exchange Question)。简单地说,攻击者可以使用原子表来存储可执行代码。
值得关注的是,所有版本的Windows都存在全局原子表功能,这是一个有意识的功能,而不是一个错误。目前尚不清楚如何通过更改Windows来缓解威胁。
Windows原子表用于什么?如果微软简单地说“那就是它,不再有原子表”,会产生什么影响呢?
答案 0 :(得分:9)
TL; DR:我个人认为微软不打算对全局原子表进行任何更改,因为它只是一个小问题。
原子表允许您将字符串与16位数相关联。你给Windows你的字符串,它会给你一个数字。然后,您只需知道分配的号码即可再次检索字符串。
每个普通进程都有自己的本地原子表,但它通常是空的,不是安全问题。
有多个"全球"由同一window station中的所有进程共享的原子表。其中1个被记录在案,它被称为全局原子表。 MSDN也足够tell us,RegisterClipboardFormat
和RegisterClass
在其当前实现中也在内部使用自己的原子表。像SetProp
这样的其他函数也使用原子,但我们只对利用的原子表感兴趣,并使用GlobalAddAtom
函数将原子添加到该表中。
此原子表的主要用途是充当简单的存储位置,以便不同的进程可以在名为DDE的协议中相互通信。当进程想要向另一个进程中的窗口发送消息时,您不能发送超过8个字节(2个参数,每个4个字节),这不足以传输文件系统路径或URL。
要解决此限制,应用程序通过调用GlobalAddAtom
将字符串/路径/ URL存储在公共全局原子表中。 GlobalAddAtom
返回应用程序可以发送给其他进程的数字。当其他进程收到DDE消息时,它只是将数字传递给GlobalGetAtomName
函数以检索字符串。
这有什么安全问题?事实证明,这种过度使用(恕我直言)利用uses全局原子表来完成表格设计的目的;将字符串从一个进程传输到另一个进程。
要将代码注入另一个进程,通常会调用OpenProcess
来获取所需进程的句柄,VirtalAllocEx
在此进程中分配一些内存,WriteProcessMemory
来填充这个新分配的进程记忆与您的代码,最后CreateRemoteThread
开始执行此代码。
漏洞利用基本上以复杂的方式调用GlobalGetAtomName
(NtQueueApcThread)以避免使用WriteProcessMemory
。更令人印象深刻的是它如何构建一个ROP链并使用NtQueueApcThread
执行它,但这与原子表并不真正相关,原子表只是传递内存的一种不寻常/聪明的方式。
漏洞攻击不允许恶意代码提升或以其他方式获取源进程尚未拥有的权限,因为NtQueueApcThread
无法在任何随机进程上使用,您仍需要相应的权限才能访问所需的目标进程。当漏洞利用出来时,NtQueueApcThread
可能会让一些反病毒公司措手不及,但作为一个独立的代码片段,首先必须由某人执行,它本身不会造成太大的损害,它必须与其他代码结合起来是可怕的。
Microsoft可以删除原子表吗?不,不是真的,其他表格太重要了。
他们可以删除全局原子表吗?不,不是真的,它是一个文档化的API,已经有20多年了,微软不喜欢破坏兼容性。
然而,他们可以稍微中性化全局原子表。它们可以通过根据调用进程的integrity level将其划分为多个隔离区来降低全局性。这不会改变有问题的漏洞,因为它无法首先访问具有更高完整性级别的进程。如果我们假装Microsoft更改了全局原子表以使其充当每个进程表,会发生什么?
微软开始在Windows XP中脱离DDE,但在Vista / 7中对此更加认真。在这台Windows 8.1计算机上,Internet Explorer仍然使用DDE进行"在同一窗口中打开"命令,但这不是.html文件的默认动词。在注册表中搜索ddeexec
以查找使用DDE处理其文件关联的所有应用程序。好的一面是,文件关联DDE仅在应用程序的实例已打开时使用。最坏的情况;在双击新文件之前关闭应用程序。
DDE也可用于做其他事情,但很难说哪些应用程序和/或功能会破坏以及它们会有多破坏。
全局原子表可以用于除DDE以外的其他东西,但很难说它是多么常见。
如果全局原子表仅限于将其字符串共享给具有相同文件名的进程,那么很多这些问题都会消失,因为它通常用于与同一应用程序的其他实例进行通信。