标签:
零日攻击mpeg-2趋势科技视频挂马it |
分类: 安全信息 |
MS08-067带来的Worm_downad的硝烟还没有完全散去,最近又惊爆一个新的0 Day漏洞,喜欢上网看图片和视频的网民们要小心了,说不你正看得眼冒金星的时候,病毒已经在悄悄地侵入你的电脑。
这个漏洞发生在windows系统的BDATuningModelMPEG2TuneR
说起来有意思的是,这个漏洞归根到底是由于微软工程师犯了一个“程序员的错误”。本来是应该传递一块buffer的指针过去,但是结果却传递了这个指针的指针,也就是MOV变成了LEA。这个大部分程序员都曾犯过的错误就这样成了本次0Day的罪魁祸首。
0 day漏洞的模块调用顺序如下:
msvidctl.dll的ATL::AtlIPersistStreamInit_Load调用 ATL::CComVariant::ReadFromStream,后者再调用mshtml!FatStream::Read。
ATL::CComVariant::ReadFromStream申请内存后,在调用mshtml!FatStream::Read时,将保存buffer指针的堆栈地址(也就是说,这个堆栈地址上存放的是buffer的指针的地址)当成了buffer的指针,即Read(buff)变成了Read(&buff),使得读入的数据覆盖掉了ATL::AtlIPersistStreamInit_Load的局部变量还有函数内的SHE。如果黑客精心构造了这部分数据,就有可能执行ShellCode。
让我们看下挂马的脚本:

代码分两部分,第一部分为Heap Spray,第二部分是造成溢出的代码。
先看看第二部分代码,很简单,只有5行:
var myObject=document.createElement('object');
DivID.appendChild(myObject);
myObject.width='1';
myObject.height='1';
myObject.data='./logo.gif';
这部分代码创建一个MPEG-2对象,并载入logo.gif。
Logo.gif的数据如下:
00000000
00000010
00000020
00000030
第14个字节开始的这部分数据被读入栈中后,造成缓冲区溢出覆盖掉SEH,使shellcode获得执行机会。
再来看看第一部分代码:
由于js的内存申请从低地址0x00000000向高地址分配,所以代码里申请了300块一样的内存,这样做的目的是来用来保证地址0x0C0C0C0C在我们申请的内存范围内。这300块一样的内存中,前一部分是NOP,后面是ShellCode代码。所以,只要程序能跳转到0x0c0c0c0c地址,执行完大量的NOP指令后,最终将执行ShellCode。
这时对比看下,我们就知道logo.gif中14字节后的0xFFFFFFFF与0x0C0C0C0C的作用了。精心构造的logo.gif中的 0xFFFFFFFF与0x0C0C0C0C刚好覆盖掉ATL::AtlIPersistStreamInit_Load的SEH,结果ATL::AtlIPersistStreamInit_Load在后续操作中触发了异常,就跳到 0x0c0c0c0c,也就是ShellCode所在的区域中执行了。
通常ShellCode都会去恶意URL下载新的病毒下来,这是你的机器就保不住啦。
预防方法:
细心的朋友肯定猜到了,由于溢出的数据是由MPEG-2这个Object调用的,所以我们能不能不让浏览器创建这个对象?可以,只要我们在注册表中删掉0955AC62-BF2E-4CBA-A2B9-A63F772D46CF这个class id就可以啦。
所以在微软的补丁还没发布前,你可以通过这个方法来避免中招。
当然如果你安装了趋势的产品,并且保持更新,也可以阻挡恶意链接的侵犯。