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