那么,什么是Windows Atom表?

安全领域一直在讨论一种名为“primefaces轰炸”的新的代码注入技术(参见注入攻击描述和信息安全栈交换问题 )。 简单地说,攻击者可以使用primefaces表来存储可执行代码。

值得关注的是全局primefaces表function在所有版本的Windows中都存在,并且是一个有意义的function,而不是一个错误。 目前尚不清楚如何通过改变Windows来缓解威胁。

什么是Windowsprimefaces表使用? 如果微软简单地说“就是这样,没有更多的primefaces表”,会有什么影响?

TL; DR:我个人认为微软不会对全局原子表做任何修改,因为它只是一个小小的安全问题。


原子表可以让您将一个字符串与一个16位数字相关联。 你给Windows你的字符串,它会给你一个数字。 然后您可以通过知道分配的号码再次检索字符串。

每个正常的进程都有自己的本地原子表,但通常是空的,不是安全问题。

有多个“全局”原子表由同一个窗口工作站中的所有进程共享。 其中1个被记录,被称为全局原子表。 MSDN也很好地告诉我们 , RegisterClipboardFormatRegisterClass在当前的实现中也使用它们自己的原子表。 像SetProp其他函数也使用原子,但我们只对exploit使用的原子表感兴趣,并且使用GlobalAddAtom函数将原子添加到该表中。

这个原子表的主要目的是作为一个简单的存储位置,以便不同的进程可以在称为DDE的协议中相互通信。 当一个进程想要在一个不同的进程中发送消息到一个窗口时,你不能发送超过8个字节(2个参数,每个4字节),这是没有足够的空间来传输文件系统路径或URL。

要解决此限制,应用程序通过调用GlobalAddAtom将字符串/路径/ URL存储在公共全局原子表中。 GlobalAddAtom返回一个应用程序可以发送给另一个进程的数字。 当其他进程接收到DDE消息时,它只是将该号码传递给GlobalGetAtomName函数来检索字符串。

这是怎么一个安全问题? 事实证明,这种过度使用(IMHO)利用全局原子表来完成表的设计工作; 将字符串从一个进程转移到另一个进程。

要将代码注入到另一个进程中,您通常会调用OpenProcess来获取所需进程的句柄, VirtalAllocEx在此进程中分配一些内存, WriteProcessMemory将您的代码填充到新分配的内存中,最后CreateRemoteThread开始执行此代码。

漏洞基本上以复杂的方式调用GlobalGetAtomName (NtQueueApcThread)来避免使用WriteProcessMemory 。 如何构建一个ROP链并用NtQueueApcThread执行它,但这与原子表没有什么关系,原子表只是一种不寻常/聪明的转移内存的方式。

该漏洞利用不允许恶意代码提升或获得源进程尚不具备的权限,因为NtQueueApcThread不能用于任何随机进程,您仍然需要适当的权限来访问所需的目标进程。 NtQueueApcThread可能在漏洞被利用的时候引起了一些反病毒公司的注意,但是作为一个单独的代码必须由某个人执行,它本身不会造成太大的损害,它必须与其他代码是可怕的。

微软可以删除原子表吗? 不,不是,其他桌子太重要了。

他们可以删除全局原子表吗? 不,不是,这是一个记录的API,已经有20多年了,微软不想破坏兼容性。

然而,他们可以将全球原子表中的一点点中性。 根据调用过程的完整性水平 ,可以将其划分为多个分区。 这不会改变有问题的漏洞,因为它首先不能访问具有更高完整性的进程。

如果我们假装微软改变了全局原子表,这样它就像一个进程表一样,会发生什么?

微软在Windows XP中开始从DDE移开,但在Vista / 7中更加严重。 在此Windows 8.1机器上,Internet Explorer仍将DDE用于“在同一窗口中打开”命令,但这不是.html文件的默认动词。 在注册表中搜索ddeexec以查找使用DDE处理其文件关联的所有应用程序。 光明的一面,只有当应用程序的一个实例已经打开时才使用文件关联DDE。 最坏的情况; 在双击新文件之前关闭应用程序。

DDE也可以用来做其他的事情,但很难说哪个应用程序和/或功能会被破坏,以及它们是如何被破坏的。

全局原子表可以用于除DDE以外的其他东西,但是很难说这样做有多普遍。

如果全局原子表被限制为仅将字符串共享给具有相同文件名的进程,那么很多这些问题就会消失,因为它经常用于与同一应用程序的其他实例进行通信。