发明名称 基于二进制的内存篡改攻击的检测和漏洞定位方法
摘要 本发明公开了基于二进制的内存篡改攻击的检测和漏洞定位方法,包括代码转换单元用于将x86二进制代码转换成Valgrind中间代码形式VEX;基本块数据依赖关系记录单元;代码插入单元包括颜色传播代码插入部分、攻击检测代码插入部分和内存污染指令记录代码插入部分,用于动态染色分析功能,随着程序的执行能够有效地检测出内存数据的异常,并且记录污染内存的写指令;漏洞定位单元包括被篡改的内存地址定位部分和篡改该内存的指令定位部分,用于找到被外部输入篡改的内存地址,以及通过前面单元所记录的信息找到篡改该内存的写指令的地址,即完成最终的定位。本发明能够有效地检测到内存篡改攻击并能够准确地定位到漏洞的位置。
申请公布号 CN101615238B 申请公布日期 2011.06.01
申请号 CN200910181577.6 申请日期 2009.07.28
申请人 南京大学 发明人 茅兵;谢立;房陈
分类号 G06F21/22(2006.01)I 主分类号 G06F21/22(2006.01)I
代理机构 南京苏高专利商标事务所(普通合伙) 32204 代理人 柏尚春
主权项 一种基于二进制的内存篡改攻击的检测和漏洞定位方法,其特征在于,由代码转换单元(20)、基本块数据依赖关系记录单元(21)、代码插入单元(22)以及漏洞定位单元(23)执行;所述代码转换单元(20)用于将二进制级别的代码转换成Valgrind中间代码形式VEX;所述基本块数据依赖关系记录单元(21),用于记录基本块内数据之间的相互依赖关系,为漏洞定位单元(23)中被篡改的内存地址定位部分(231)提供数据依赖信息;所述代码插入单元(22)包括颜色传播代码插入部分(221)、攻击检测代码插入部分(222)和内存污染指令记录代码插入部分(223);其中,颜色代码插入部分(221)用于实现动态染色分析功能;攻击检测代码插入部分(222)用于检测内存数据的异常;内存污染指令记录代码插入部分(223)用于记录污染内存的写指令;所述漏洞定位单元(23)包括被篡改的内存地址定位部分(231)和篡改该内存的指令定位部分(232);其中,被篡改的内存地址定位部分(231)通过基本块内数据依赖关系记录单元(21)所记录的信息找到被外部输入篡改的内存地址;篡改该内存的指令定位部分(232)通过内存污染指令记录代码插入部分(223)所记录的信息找到篡改该内存的写指令的地址,即完成最终的定位;该方法包括以下步骤,由基本块数据依赖关系记录单元(21)执行:步骤S100,在Valgrind生成的中间代码VEX中判断语句类型,若语句为临时变量写语句,则跳到步骤S200;若语句为寄存器写语句,则跳到步骤S300;否则,跳到步骤S1100;步骤S200,判断临时变量写语句中源表达式的类型,若表达式为内存读取操作,则跳到步骤S400;若语句为寄存器读取操作,则跳到步骤S500;否则,跳到步骤S800;步骤S300,判断寄存器写语句中源表达式的类型,若表达式为临时变量读取操作,跳到步骤S600;否则,跳到步骤S1100;步骤S400,判断内存读取表达式中源内存是否被污染,若是,跳到步骤S700;否则跳到步骤S1100;步骤S500,判断寄存器读取表达式中源寄存器是否被污染,若是,跳到步骤S900;否则跳到步骤S1100;步骤S600,判断临时变量读取表达式中临时变量是否被污染,若是,跳到步骤S1000;否则跳到步骤S1100;步骤S700,记录被外部输入污染的内存的地址和目标临时变量,跳到步骤S1100;步骤S800,记录源临时变量和目的临时变量之间的依赖关系,跳到步骤S1100;步骤S900,通过步骤S800记录的依赖关系找到污染源寄存器的内存地址,并记录该内存地址与目的临时变量,跳到步骤S1100;步骤S1000,通过步骤S800记录的依赖关系找到污染源临时变量的内存地址,并记录该内存地址与目的寄存器,跳到步骤S1100;步骤S1100,在VEX中间代码上进行代码插入;所述步骤S1100后还包括以下步骤:步骤S1200,颜色传播代码插入进行动态染色;步骤S1300,判断VEX语句的类型,若为内存写语句,则跳到步骤S1400;若语句中包含读内存操作或为无条件跳转操作,则跳到步骤S1500;否则,跳到步骤S1600;步骤S1400,插入记录污染内存数据的写指令的代码,然后跳到步骤S1500;步骤S1500,插入检测访存操作或无条件跳转操作的地址表达式是否被污染的代码,用来检测内存篡改,跳到S1600;步骤S1600,检测到异常,定位漏洞;所述步骤S1200由颜色传播代码插入部分(221)进行,包括以下步骤:步骤S1201,判断该语句处是否为read或recv系统调用,若是,则跳到步骤S1202;否则跳到步骤S1203;步骤S1202,将存放外部输入数据的内存进行染色,跳到步骤S1300;步骤S1203,根据颜色传播规则在VEX中间代码上,插入进行颜色传播的代码,跳到步骤S1300;所述步骤S1400由内存污染指令记录代码插入部分(223)进行,包括以下步骤:步骤S1401,判断内存写语句的源操作数是否被污染,若是,则跳到步骤S1402;否则,跳到步骤S1500;步骤S1402,记录内存写语句的地址W和该写语句的目的内存地址M,记为(M,W),跳到步骤S1500;所述步骤S1600检测到异常,定位漏洞,包括以下步骤:步骤S1601,在Valgrind平台上运行经过代码插入的程序,跳到步骤S1602;步骤S1602,判断程序运行是否结束,若是,则跳到步骤S1606;否则,跳到步骤S1603;步骤S1603,攻击检测代码插入部分(222)所插入的代码检测访存操作或无条件跳转操作中的地址操作数是否被污染,若是,则跳到步骤S1604;否则,跳到步骤S1601;步骤S1604,利用由数据依赖关系记录单元(21)记录的数据依赖关系回溯找到被篡改的内存地址M’,跳到步骤S1605;步骤S1605,利用步骤S1604找到的被篡改的内存地址M’和由步骤S1402所记录的(M,W)信息找到篡改M’的写指令的地址W’,跳到步骤S1606;步骤S1606,程序运行结束。
地址 210093 江苏省南京市汉口路22号南京大学蒙民伟楼501室