通用缓解措施和多维度攻击简介

  DEP(Data Execution Prevention,数据执行保护)这东西很多人都知道,但ASLR(Address space layout randomization,地址空间随机化)估计知道的人少一点,它们都属于现代操作系统中两个主要的缓解(Mitigation)措施,现在基本已经成为标配,从Windows Vista到Apple iOS等,都包含了这种技术来阻止或缓解基于内存攻击漏洞的利用,就是人们常说的缓冲区溢出漏洞的利用。

  这些技术的实现极大的增加了内存攻击漏洞的利用难度,硬件DEP启用后使得在溢出成功后在堆栈中直接执行代码的效果成为历史,从而使得针对此类漏洞的利用不得不采取ROP(Return-oriented programming,返回导向编程)技术来构造先关闭进程DEP,或开辟一块可读写加执行权限的内存空间再执行Shellcode代码的ROP链,这是整个漏洞利用代码的Payload中最繁琐的部分,虽然ROP这种技术在绕DEP保护的利用上还算可以成功,但要针对各种系统语言版本和SP版本的情况构造不同的ROP链,通用性就极差了,更重要的是这只解决了DEP的问题,如果是Windows Vista以上的系统,还有ASLR呢?ASLR启用的情形下,ROP技术依赖的函数基址是动态变化的,微软他们想啊,我阻止不了你ROP,我用这种方式缓解行么!让你利用的难度增大!增加你的漏洞利用成本,让你坚持不下去,玩不下去就放弃了,这样想有点天真了。

  在有ASLR的情形下,最直接的方式是找到一个noASLR的模块,虽然系统原生的模块基本都支持ASLR了(Windows 7下出个漏网之鱼),但noASLR模块的函数基址还是固定的,还可以利用,因为ASLR本身并不是一种通用标准,只是一种技术,不遵从它的软件厂商还很多,最直接的表现就是开发团队守旧的不用支持ASLR的编译器来编译代码,固执的还用VC6就是一个灾难。但即使全部都是ASLR的模块,是不是就真的没可能利用成功了,答案是否定的,利用代码需要的基址还是可以通过触发漏洞,比如堆溢出,或是其他任何能实现内存越界读写的溢出漏洞把基址先给泄露出来,保存指针然后通过数学运算,例如加减法来定位到需要调用函数的地址从而又走回ROP的路,最终又可以成功利用了,不过利用代码量比ROP又多了很多,都是汇编代码,干这种活是最苦闷的,一般不太适合性格比较开朗的活泼少年。

  总之,现代操作系统和编译器的更新对内存攻击的利用进行了多重封杀,客户端的程序,比如IE还有沙箱技术,通常针对内存攻击主要利用点EIP的控制和函数基址,软件厂商,安全公司对此煞费苦心,比如360就在XP系统上实现了原本并没有的ASLR技术,使得在XP靶场挑战赛上没有被攻破,能通过逆向分析来寻找突破,漏洞利用中要实现精确的堆布局是一个难点,考验研究员的功力,特别是在原生64位下堆喷射的命中率已变得很低的情况下,最近的几界Pwn2Own大赛的成功攻破,基本都是堆上精确布局利用的实现。

  那么,EIP的控制争夺是不是真的走到了尽头,在二进制中我们确实要考虑这个,因此不得不思考不同的维度。很多人不禁要问为什么一定是EIP,系统原生有没有其他的路?比如COM,解释语言JScript,VBScript它们跟CPU指令有什么不一样,解释语言也能实现各种功能,如何利用它们?解释语言有虚拟机,数组在内存中的形态是什么,能利用么?答案是肯定的。yuange的DVE(数据虚拟执行)技术,TK的脚本维度就是其中之一,避免直接二进制对抗二进制,在解释语言层布局代码,通过数学运算实现堆的分配和布局,从而走不同的维度,跟针对EIP的检测不在一个空间,不直接对抗DEP和ASLR,活在另一个世界,一个没有DEP和ASLR的世界,攻防技术中最精妙的世界。

  总体来说,在内存攻击方向,现在寻求利用方法的通用性还是相当困难的,主流的方向还是构造针对基于特定漏洞的利用方法,针对比如:Stack Buffer Overflow(栈缓冲区溢出)、Heap Buffer Overflow(堆缓冲区溢出)、Format String(格式化字符串)、Out-of-Bounds Read(内存越界读)、Off-by-One(内存越界写)、Use After Free(释放后重用)、Double Free(二次释放)、Memory Corruption(内存腐败)、Integer Overflow(整型溢出)等漏洞类型在特定目标环境下的利用,主要依赖特定目标的环境因素来构造攻击代码的思路。不论是ROP还是其他多维度,能用最简单直接的方法打下目标亦是最重要的,也是作为一个安全攻防技术研究员应该思考的问题,随着近年来泄漏的用于APT行动的0day来看,由于防御一方缓解措施的作用,针对某些环境或目标组织的攻击,攻击者甚至需要多个0day组合来提高成功率。而对于系统原生外的保护,比如反APT设备的引入,攻击代码要考虑的因素更多,因此必须得考虑更多维度的事情。

关于“分子实验室”

  分子实验室是安恒信息安全服务团队成立的内部研究实验室,目前主要涉及有网络自动化渗透测试技术研究(AdvancedPenetration Testing)、Web漏洞挖掘和利用技术研究(Web Security Vulnerabilities)、源代码安全漏洞分析技术研究(Source Code Security Analysis)、二进制代码漏洞挖掘技术研究(Binary Code Analysis & Fuzzing)、安全开发生命周期实践研究(Security Development Lifecycle (SDL))等方向的安全技术研究,务实不务虚,研究的东西都是实用的,SDL去年已经向客户推广并取得良好的认同。

  同时,《反0day策略》是面向高端客户推出的技术性解决方案,安全开发生命周期是其中的重要支撑,是帮助客户真正修炼内功的《易筋经》,不论是研究攻击和防御技术的,深入了解敌人才更有可能超越它,欢迎和我们讨论以及共同研究攻防技术,共同进步。

原文发布于微信公众号 - 安恒信息(DBAPP2013)

原文发表时间:2015-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构

迎战金九银十:阿里、京东、美团内推题送给还在迷茫的朋友

跳槽,对IT人来说绝对不是个陌生的词汇,几乎所有人都身体力行过。首先我要强调一点,跳槽并没有坏处,但是频繁的跳槽就不好了。在工作的前4年,必须跳槽,而且鼓励跳槽...

1023
来自专栏杨建荣的学习笔记

运维平台元数据稽核小结

数据库运维中的元数据建设都是重中之重,如果元数据不具有参考的价值,那么后续的操作都会受到影响,但是元数据的建设也应该是分成几个步子来走,首先得能够收集到元数...

1364
来自专栏小狼的世界

HTTP2.0之战

2009年,Google提议HTTP协议的举动引起了工业界的大讨论。当时的概念叫做 SPDY,时至今日,虽然人们对于Google的动机始终不是很清楚,但是毫无疑...

1042
来自专栏大数据文摘

去IOE的另外一条路径:全内存数据库弯道超车

1828
来自专栏Golang语言社区

一个调度系统的开发与性能优化

背景:随着Go的不断发展,流行度越来越高,业界对Go的认可度也越来越高,所以很多团队或者公司在遇到性能问题时都会尝试使用Go来重构系统,尤其是云计算领域,大家期...

1561
来自专栏ImportSource

听说Redis5.0发布了,那个Streams好叼

在这个商业世界中,如果你占领了概念高地就意味着有种先天的优势。就好比你给自己起了一个名字叫Java。

5073
来自专栏企鹅号快讯

什么样的密码才是安全的?

什么样的密码才是安全的?相信这样的老生常谈你已经听腻了:密码设置得长一些,混合数字字母符号,避免任何可能容易联系到你本身的密码。但现实是在街头调查中大多数人并没...

1916
来自专栏Play & Scala 技术分享

Play For Scala 开发指南 - 第1章 Scala 语言简介

3016
来自专栏.NET技术

整理自己的.net工具库

  今天我会把自己平日整理的工具库给开放出来,提供给有需要的朋友,如果有朋友平常也在积累欢迎提意见,我会乐意采纳并补充完整。按照惯例在文章结尾给出地址^_^。

762
来自专栏码神联盟

高效编程所需要做的那点事

聊聊如果才能高效编程 计划(Plan) 所谓Plan,其实就是对应于编程中的设计阶段,当然,这里的Plan并不像设计那样重量级。它要求我们程序员在正式...

2779

扫码关注云+社区