首页 >  科研成果
BinGin二进制静态分析平台
BinGin简介 
BinGin 是一个分析x86等二进制文件的静态分析平台。该平台上实现了静态的整数溢出漏洞检测等。该平台采用了符号执行、定理证明、控制流分析、数据流分析以及其他我们自己提出的代码分析技术、漏洞检测技术, 可以支持检测多种安全漏洞。与广泛使用的动态模糊测试相比,BinGin 可以检测更加复杂的漏洞。目前该平台已经发现了Windows重要漏洞、广泛使用的libpng重要软件的漏洞等。
 
BinGin 漏洞挖掘结果(截止2014.5)
文件
漏洞类型
确认情况
发现日期
漏洞详情
Microsoft Windows: comctrl32.dll
整数溢出导致缓冲区溢出
已确认,
CVE号:CVE-2013-3195
2013年3月
 [1]
Libpng 1.5.13
整数溢出导致缓冲区溢出
已确认,
CVE号: CVE-2013-7353
2013年1月
 [2]
Java: mlib_image.dll
整数溢出导致缓冲区溢出
待确认
2014年4月
 [3]
  
研究组主要成员
张阳 程亮 孙晓山 邓艺
 
漏洞详情:
[1]地址0x5D17B1F4上的imul指令可能整数溢出。
相乘的结果作为参数传入 COMCTL32_72,该函数使用该值作为申请内存的大小。发生溢出时,相乘结果小于期望的大小,可能导致后续的写入超过边界,触发任意代码执行。汇编代码详情见下图:
 
 
 
[3] mlib_image.dll 中存在一个可能的整数溢出问题,如果发生整数溢出,则将导致后面的内存申请的尺寸小于应当申请的大小,从而导致后续的写入发生缓冲区溢出。
存在该问题的dll文件是:C:\Program Files\Java\jre7\bin\mlib_image.dll。
该dll文件的版本是7.0.450.18(Java JRE的版本是Java7 update 45),有可能存在漏洞函数是 mlib_ImageLookUp,该函数在源代码中的位置是:
./jdk/src/share/native/sun/awt/medialib/mlib_c_ImageLookUp.c:
mlib_status mlib_ImageLookUp(mlib_image       *dst,
                             const mlib_image *src,
                             const void       **table)
.............
 stype = mlib_ImageGetType(src);
 dtype = mlib_ImageGetType(dst);
 ichan = mlib_ImageGetChannels(src);
 nchan = mlib_ImageGetChannels(dst);
 xsize = mlib_ImageGetWidth(src);
 ysize = mlib_ImageGetHeight(src);
 slb   = mlib_ImageGetStride(src);
 dlb   = mlib_ImageGetStride(dst);
 sa    = mlib_ImageGetData(src);
 da    = mlib_ImageGetData(dst);
 
.............
        } else if (nchan == 3) {
 
        return mlib_ImageLookUp_Bit_U8_3(sa, slb,
                                da, dlb,
                                xsize, ysize, 3, bitoff_src,
                                (const mlib_u8 **) table);
 
        } else /* (nchan == 4) */ {
 
该函数调用了一个在源代码中名称为 mlib_ImageLookUp_Bit_U8_3 的子函数,该子函数的相关代
 
码如下:
 
./jdk/src/share/native/sun/awt/medialib/mlib_ImageLookUp_Bit.c:
mlib_status mlib_ImageLookUp_Bit_U8_3(const mlib_u8 *src,
                                      mlib_s32      slb,
                                      mlib_u8       *dst,
                                      mlib_s32      dlb,
                                      mlib_s32      xsize,
                                      mlib_s32      ysize,
                                      mlib_s32      nchan,
                                      mlib_s32      bitoff,
                                      const mlib_u8 **table)
{
 mlib_s32 i, j;
 mlib_s32 s0, size;
 mlib_u32 emask, dd;
 TYPE_64BIT d_array01[16], d_array12[16];
 TYPE_64BIT buff_lcl[(MAX_WIDTH + MAX_WIDTH/8)/8];
 mlib_u8 *buff = (mlib_u8*)buff_lcl, *buffs;
 mlib_u32 l0, h0, v0, l1, h1, v1, l2, h2, v2;
 size = 3 * xsize;// <--这里的整数相乘有可能产生溢出
 if (size > MAX_WIDTH) {
    buff = mlib_malloc(size + (size + 7)/8);
 
    if (buff == NULL) return MLIB_FAILURE;
 }
汇编层的细节:mlib_ImageLookUp_Bit_U8_3 在Dll中不是直接导出。对于7.0.450.18版本的mlib_image.dll,当 Imagebase 为 : 6E410000 时,其函数的起始地址为:.text:6E46D320 sub_6E46D320    proc near
(2014-07-14)