我的漏洞被别人先报了,所以就把这个漏洞的细节公布一下吧。写的不是很详细,有poc大家可以自己调一调。
这个漏洞主要是因为GDI32种在处理metafile META_DIBSTRETCHBLT record 时候内存拷贝,越界读,导致的信息泄露漏洞。
图一
在GDI32中,bMetaGetDIBInfo调用SignedCJSCANto函数,并计算buffer的大小。这个buffer的大小由图一中标有下划线的值来确定。分别是:0x100019 0x200 0x8.
在SignedCJSCAN函数中, SignedCJSCAN调用CJSCAN函数,
在图二中,a1初始值是0x10001c,a3是0x8(即上面所说的位置的值)
在CJSCAN函数中,经过遍历a1(初始值是0x100019)经过UlongLongTolong ,ULongAdd函数来进行数值转换。到最后
变量a4 的值是0x10001c,如下图所示
图二
经过图二中的函数计算,得到buffer的大小,0x10001c*0x200=0x20003800,入图3所示。(0x200即poc中蓝色下滑线的值)
图三
然后就是申请内存,内存大小就是上面的步骤计算出来的值,0x2000c000,如图4
图四
然后MRBDIB::vInit 函数拷贝 wmf record数据,从poc 0x11d2偏移位置开始拷贝,如图5,由于拷贝的大小没有经过严格交验,导致拷贝的内存大小可以任意被控制,最后导致读越界,从而造成了,堆数据泄露,等其他敏感信息泄露漏洞。
图五
这个漏洞可以在wordpad outlook直接触发,如果想在edge,ie中触发需要修改一下poc中的某些数据
测试环境:win7 32bit 漏洞影响系统:win7 到win10 32 bit ,64bit 重现方式:将poc文件,拖拽到wordpad中即可触发漏洞。 poc 地址:https://pastebin.com/G5BE5v5Q
把十六进制数据贴到010editor,然后保存成wmf文件格式即可。