检测应用漏洞代码的方法和装置技术领域
本申请涉及计算机技术领域,具体涉及代码检测技术领域,尤其
涉及检测应用漏洞代码的方法和装置。
背景技术
漏洞是指一个系统存在的弱点或缺陷,系统对特定威胁攻击或危
险事件的敏感性,或进行攻击的威胁作用的可能性。漏洞可能来自应
用软件或操作系统设计时的缺陷或编码时产生的错误,也可能来自业
务在交互处理过程中的设计缺陷或逻辑流程上的不合理之处。这些缺
陷、错误或不合理之处可能被有意或无意地利用,从而对一个组织的
资产或运行造成不利影响,如信息系统被攻击或控制,重要资料被窃
取,用户数据被篡改,系统被作为入侵其他主机系统的跳板。其中,
产生这些缺陷、错误或不合理之处的代码可以被称作漏洞代码。
然而,现有的检测应用漏洞代码的方法,一般限于通过静态分析
或动态分析方法发现漏洞代码,而对于漏洞代码的检验和修复,往往
缺乏有效的机制。对于应用的开发者不能及时发现或修复漏洞代码,
运行存在漏洞代码的应用的终端将面临被攻击或控制的威胁。因此,
这种检测应用漏洞代码的方法存在漏洞代码检测的有效性较低的问
题。
发明内容
本申请的目的在于提出一种改进的检测应用漏洞代码的方法和装
置,来解决以上背景技术部分提到的技术问题。
第一方面,本申请提供了一种检测应用漏洞代码的方法,所述方
法包括:获取所述应用的应用代码;将所述应用代码进行反编译,生
成预定格式的中间代码;基于所述中间代码中的函数调用关系,检测
所述中间代码中是否包含与预设的漏洞特征语句相匹配的语句,若是,
确定所述应用包含可疑漏洞代码;对所述中间代码执行针对所述可疑
漏洞代码预设的验证代码,根据执行结果确定所述可疑漏洞代码是否
为确切漏洞代码。
在一些实施例中,所述基于所述中间代码中的函数调用关系,检
测所述中间代码中是否包含与预设的漏洞特征语句相匹配的语句,若
是,确定所述应用包含可疑漏洞代码包括:根据所述中间代码的函数
调用关系生成调用路径;按照各调用路径上的调用关系,对所述中间
代码的语句与预设的漏洞特征语句进行匹配;如果在一条调用路径上
匹配到预设数量的漏洞特征语句,确定所述中间代码中包含与预设的
漏洞特征语句相匹配的语句,并确定所述应用包含可疑漏洞代码。
在一些实施例中,所述方法还包括:如果确定所述可疑漏洞代码
为确切漏洞代码,基于预设的修复规则修复所述中间代码。
在一些实施例中,所述方法进一步包括:如果确定所述可疑漏洞
代码为确切漏洞代码,呈现所述确切漏洞代码的漏洞名称;响应于确
定对所述确切漏洞代码进行修复的操作,基于预设的修复规则修复所
述中间代码。
在一些实施例中,所述预设的修复规则包括:将所述中间代码中
与预设的漏洞特征语句相匹配的语句修改为预设的修复语句;和/或,
在中间代码中增加预设的语句;和/或,在中间代码中删除与预设的漏
洞特征语句相匹配的代码。
在一些实施例中,所述方法还包括:对修复后的中间代码进行编
译,生成修复应用代码。
在一些实施例中,所述对所述中间代码执行针对所述可疑漏洞代
码预设的验证代码,根据执行结果确定所述可疑漏洞代码是否为确切
漏洞代码包括:对所述中间代码执行针对所述可疑漏洞代码预设的验
证代码;检验所述执行结果是否为漏洞行为结果,若是,确定所述可
疑漏洞代码为确切漏洞代码。
在一些实施例中,所述应用代码包括以下至少一项:源代码、安
装包代码或软件工具开发包代码。
第二方面,本申请提供了一种检测应用漏洞代码的装置,所述装
置包括:获取模块,配置用于获取所述应用的应用代码;反编译模块,
配置用于将所述应用代码进行反编译,生成预定格式的中间代码;检
测模块,配置用于基于所述中间代码中的函数调用关系,检测所述中
间代码中是否包含与预设的漏洞特征语句相匹配的语句,若是,确定
所述应用包含可疑漏洞代码;验证模块,配置用于对所述中间代码执
行针对所述可疑漏洞代码预设的验证代码,根据执行结果确定所述可
疑漏洞代码是否为确切漏洞代码。
在一些实施例中,所述检测模块包括:调用路径生成单元,配置
用于根据所述中间代码的函数调用关系生成调用路径;匹配单元,配
置用于按照各调用路径上的调用关系,对所述中间代码的语句与预设
的漏洞特征语句进行匹配;确定单元,配置用于如果在一条调用路径
上匹配到预设数量的漏洞特征语句,确定所述中间代码中包含与预设
的漏洞特征语句相匹配的语句,并确定所述应用包含可疑漏洞代码。
在一些实施例中,所述装置还包括:修复模块,配置用于如果确
定所述可疑漏洞代码为确切漏洞代码,基于预设的修复规则修复所述
中间代码。
在一些实施例中,所述修复模块进一步包括:呈现单元,配置用
于如果确定所述可疑漏洞代码为确切漏洞代码,呈现所述确切漏洞代
码的漏洞名称;修复单元,配置用于响应于确定对所述确切漏洞代码
进行修复的操作,基于预设的修复规则修复所述中间代码。
在一些实施例中,所述预设的修复规则包括:将所述中间代码中
与预设的漏洞特征语句相匹配的语句修改为预设的修复语句;和/或,
在中间代码中增加预设的语句;和/或,在中间代码中删除与预设的漏
洞特征语句相匹配的代码。
在一些实施例中,所述装置还包括:编译模块,配置用于对修复
后的中间代码进行编译,生成修复应用代码。
在一些实施例中,所述验证模块包括:执行单元,配置用于对所
述中间代码执行针对所述可疑漏洞代码预设的验证代码;检验单元,
配置用于检验所述执行结果是否为漏洞行为结果,若是,确定所述可
疑漏洞代码为确切漏洞代码。
在一些实施例中,所述应用代码包括以下至少一项:源代码、安
装包代码或软件工具开发包代码。
本申请提供的检测应用漏洞代码的方法和装置,通过获取所述应
用的应用代码,接着将应用代码进行反编译,生成预定格式的中间代
码,然后,基于中间代码中的函数调用关系,检测中间代码中是否包
含与预设的漏洞特征语句相匹配的语句,若是,确定应用包含可疑漏
洞代码,并对中间代码执行针对可疑漏洞代码预设的验证代码,根据
执行结果确定可疑漏洞代码是否为确切漏洞代码,由于通过静态的代
码语句匹配和动态的验证代码验证相结合的检测方法,可以提高检测
应用漏洞代码的有效性。
附图说明
通过阅读参照以下附图所作的对非限制性实施例的详细描述,本
申请的其它特征、目的和优点将会变得更明显:
图1示出了可以应用本申请实施例的示例性系统架构;
图2是根据本申请的检测应用漏洞代码的方法的一个实施例的流
程图;
图3是根据本申请的检测应用漏洞代码的方法的一个应用场景的
流程图;
图4是根据本申请的检测应用漏洞代码的方法的又一个实施例的
流程图;
图5是根据本申请的检测应用漏洞代码的装置的一个实施例的结
构示意图;
图6示出了适于用来实现本申请实施例的各装置的计算机系统的
结构示意图。
具体实施方式
下面结合附图和实施例对本申请作进一步的详细说明。可以理解
的是,此处所描述的具体实施例仅仅用于解释相关发明,而非对该发
明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与
有关发明相关的部分。
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例
中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本
申请。
图1示出了可以应用本申请实施例的示例性系统架构100。
如图1所示,系统架构100可以包括终端设备101、102、网络103
和服务器104。网络103用以在终端设备101、102和服务器104之间
提供通信链路的介质。网络103可以包括各种连接类型,例如有线、
无线通信链路或者光纤电缆等等。
终端设备101、102可以通过网络103与服务器104交互,以接收
或发送消息等。终端设备101、102上可以安装有各种通讯客户端应用,
例如漏洞代码检测类应用、杀毒类应用、搜索类应用、社交平台应用、
邮箱客户端、即时通信工具等。
终端设备101、102可以是支持漏洞代码检测类应用、杀毒类应用
等安装于其上的各种电子设备,包括但不限于智能手机、智能手表、
平板电脑、个人数字助理、电子书阅读器、MP3播放器(Moving Picture
Experts Group Audio Layer III,动态影像专家压缩标准音频层面3)、
MP4(Moving Picture Experts Group Audio Layer IV,动态影像专家压
缩标准音频层面4)播放器、膝上型便携计算机和台式计算机等等。
服务器104可以是提供各种服务的服务器。例如对终端设备101、
102的检测应用漏洞代码类应用、杀毒类应用等提供支持的后台服务
器等。服务器可以对接收到的数据进行存储、生成等处理,并将处理
结果反馈给终端设备。
需要说明的是,本申请实施例所提供的检测应用漏洞代码的方法
可以由终端设备101、102执行,也可以由服务器104执行,还可以由
终端设备101、102和服务器104分别执行其中的部分步骤,例如,可
以通过终端设备101、102执行“获取应用的应用代码”,由服务器104
执行“将应用代码进行反编译,生成预定格式的中间代码”等。相应
地,检测应用漏洞代码的装置可以设置在终端设备101、102中,也可
以设置在服务器104中,还可以在终端设备101、102和服务器104
中分别设置其中的部分模块。
应该理解,图1中的终端设备、网络和服务器的数目仅仅是示意
性的。根据实现需要,可以具有任意数目的终端设备、网络和服务器。
请参考图2,其示出了检测应用漏洞代码的方法的一个实施例的
流程200。该检测应用漏洞代码的流程200具体可以应用于电子设备
中,该电子设备可以是具有运行终端应用能力的终端设备(例如图1
所示的终端设备101、102),也可以是为终端设备上运行的检测应用
漏洞代码类应用提供支持的后台服务器(例如图1所示的服务器104)
中,本申请对此不做限定。该流程200包括以下步骤:
步骤201,获取应用的应用代码。
在本实施例中,电子设备可以从本地或远程地获取应用的应用代
码。具体而言,当电子设备时检测应用漏洞代码类应用运行于其上的
终端设备时,其可以直接从本地获取上述应用代码;而当电子设备是
对检测应用漏洞代码类应用进行支持的后台服务器时,其可以通过有
线连接方式或者无线连接方式从终端设备获取上述应用代码。上述无
线连接方式包括但不限于3G/4G连接、WiFi连接、蓝牙连接、WiMAX
连接、Zigbee连接、UWB(ultra wideband)连接、以及其他现在已知
或将来开发的无线连接方式。
在本实施例的一些可选实现方式中,电子设备所获取的应用代码
可以是应用的源代码、安装包代码或软件工具开发包代码。其中,源
代码是开发者编写应用的初始代码,如由C++编程语言表达的语句组
成的代码;应用的安装包代码是用于在终端设备的操作系统中安装并
执行的代码,如将应用的源代码编译形成的可执行代码(即机器语言
代码,一般为二进制代码,例如安卓系统的安装包AndroidPackage,
APK代码);工具开发包(Software Development Kit,SDK)是为特定
的软件包、软件框架、硬件平台、操作系统等建立应用软件时的开发
工具的集合,软件工具开发包往往封装了许多应用程序开发调用的函
数,并通过应用程序编程接口(Application Programming Interface,API)
的形式提供给编程者,软件工具开发包代码可以包括这些函数和接口。
步骤202,将应用代码进行反编译,生成预定格式的中间代码。
在本实施例中,电子设备接着可以通过静态分析手段将所获取应
用代码进行编译或反编译,从而生成预定格式的中间代码。
编译可以是利用编译程序从源代码产生目标代码的过程。编译可
以通过编译器来实现。编译器可以将汇编语言或高级计算机语言表达
的源代码(Source program),翻译成目标语言(Target language)表达
的机器代码。源代码一般为高级语言(High-level language),如Pascal、
C、C++、Java、汉语编程语言或汇编语言等等,而机器语言也称作机
器代码(Machine code),一般是二进制文件。编译器可以通过应用程
序来实现,也可以通过硬件结构来实现。进一步地,反编译可以是编
译的逆过程。
中间代码可以是通过某一种预定的编程语言表示的代码,例如
Java语言表示的应用代码;也可以是能够表现应用代码的数据逻辑关
系的其他代码。在一些实现中,应用代码可以是应用的源代码,此时,
电子设备可以对应用代码进行编译,转换成中间格式代码。在另一些
实现中,应用代码可以是应用的安装包代码,此时,电子设备可以对
应用代码进行反编译,从而将应用代码转换成中间格式代码。对于应
用代码包括软件工具开发包代码(可以为机器代码)的情况,电子设
备可以对应用代码进行反编译,从而将应用代码转换成中间格式代码。
步骤203,基于中间代码中的函数调用关系,检测中间代码中是
否包含与预设的漏洞特征语句相匹配的语句,若是,确定上述应用包
含可疑漏洞代码。
在本实施例中,电子设备接着可以通过各种静态分析方法对中间
代码进行,生成中间代码的函数调用关系,进而根据这些函数调用关
系检测中间代码中是否包含与预设的漏洞特征语句相匹配的语句。
在本实施例中,电子设备可以通过静态分析方法在不执行代码的
情况下对代码可能产生的行为进行分析。静态分析方法例如可以包括
但不限于不可达代码(在任何情况下都运行不到的代码)去除方法、
常量传播(constant propagation)方法等。其中,以不可达代码去除方
法的一种实现为例,电子设备可以建立以数据结构链的形式表示的中
间代码的控制流程图(Control flow graph,CFG),根据控制流程图确
定孤立的节点部分的代码为不可达代码,进而将不可达代码去除。其
中,数据结构链可以通过以下方法生成:从左至右按字符依次读入中
间代码,对中间代码的字符流进行扫描,通过使用正则表达式匹配方
法将应用代码转换为等价的符号流。这里,正则表达式匹配方法是使
用单个字符串来描述、匹配一系列符合某个句法规则的字符串的匹配
方法。
进一步地,电子设备可以根据对中间代码的静态分析过程获取中
间代码中所包含的函数之间的调用关系,并按照函数调用顺序将中间
代码的语句与预设的漏洞特征语句进行匹配。其中,漏洞特征语句可
以预先存储在电子设备上。漏洞特征语句可以与中间代码具有一致的
语言规则和格式,例如两者都是通过Java语言代码表达的语句。这里,
中间代码的语句与漏洞特征语句的匹配可以通过字符串匹配实现,可
以将中间代码的语句与漏洞特征语句进行匹配,也可以是在中间代码
的语句中查找漏洞特征语句的关键字,当查找到关键字时再进行整个
语句的匹配,本申请对此不做限定。如果在中间代码的语句中检测到
与漏洞特征语句相匹配的语句,电子设备可以确定所检测的应用包含
可疑漏洞代码。可选地,电子设备可以保存所匹配到的漏洞特征语句
的漏洞名称或类型,以及中间代码中包含的与漏洞特征语句相匹配的
语句所在的位置等等。
漏洞特征语句可以通过多种途径获得,例如,通过对已知的漏洞
代码及引起的漏洞行为进行分析,确定代码中引发漏洞行为的根源所
在的代码语句,作为漏洞特征语句;或者,从现有的漏洞代码数据库
中直接获取漏洞特征语句,等等,本申请对此不做限定。其中,在一
些实现中,漏洞特征语句可以是代码中可以被利用以对系统进行攻击
或控制的语句。例如,WINDOWS操作系统的USER32库的图像加载
(LoadImage)应用程序编程接口(Application Programming Interface,
API)允许加载一个bmp、cur、ico或ani格式的图标来进行显示,并
根据图片格式里给出的图片大小加4来进行数据的复制,如果将所给
出的图片大小为0xfffffffc-0xffffffff的bmp、cur、ico或ani格式的文
件嵌入到超文本标记语言(HyperText Markup Language,HTML)页
面或邮件中,加载HTML页面或接受邮件的终端系统将由于触发整数
溢出导致堆缓冲区被覆盖,进而系统权限可以被轻易获取。在该类型
的漏洞中,可以将实现“API允许加载一个bmp、cur、ico或ani格式
的图标来进行显示,并根据图片格式里给出的图片大小加4来进行数
据的复制”的语句作为漏洞特征语句。在另一些实现中,漏洞特征语
句也可以是不正确的参数设置语句,例如对于用于创建文件的API
“openFileOutput(String name,int mode)”而言,如果应用开发者把
mode参数设为MODE_WORLD_READABLE,则所创建的文件在创建
之后可以被任意应用读取。在该漏洞代码中,可以将实现“把mode
参数设为MODE_WORLD_READABLE”的语句作为漏洞特征语句。
在实践中,还有其他多种类型的漏洞特征语句,在此不再一一例举。
步骤204,对上述中间代码执行针对可疑漏洞代码预设的验证代
码,根据执行结果确定可疑漏洞代码是否为确切漏洞代码。
在本实施例中,由于静态分析误报率较高,如果确定所检测的应
用包含可疑漏洞代码,电子设备可以进一步通过动态测试手段对该可
疑漏洞代码进行验证,以确定其是否为确切漏洞代码。这里,确切漏
洞代码可以表示真实存在的、在运行时可以使应用产生漏洞行为的代
码。
其中,动态测试方法是通过运行代码对代码进行分析的方法。电
子设备可以通过模拟器(simulator,例如仿真应用)、虚拟机或物理设
备(physical device,包括硬件和操作系统所挂接的各种设备)运行所
检测应用的应用代码或者根据应用代码生成的中间代码。
验证代码是对可疑漏洞代码进行验证的代码,例如是可以利用漏
洞特征语句对应用代码进行攻击或破坏的代码。举例而言,对于拒绝
服务的漏洞,例如安卓系统中,如果开发者使用了获取传入数据的API
“getSerializableExtra()”,而没有对获取的传入数据做异常判断,则当
该API“getSerializableExtra()”接收到应用代码中没有定义的对象时,
会导致应用本地拒绝服务,则针对该漏洞代码的验证代码可以是向该
API“getSerializableExtra()”传入空数据的Intent(意图,用于安卓应
用的各项组件之间的通讯)。
电子设备可以根据对中间代码执行验证代码的执行结果与预设的
执行结果相比较,以确定可疑漏洞代码是否为真实存在的漏洞代码,
即确切漏洞代码。这里,预设的执行结果可以是可疑漏洞代码的漏洞
行为结果,即应用代码包含漏洞代码时的执行结果,此时,如果执行
结果包括预设的执行结果,则确定可疑漏洞代码为确切漏洞代码,否
则,确定所检测的应用不包括通过静态分析方法获取的可疑漏洞代码;
也可以是应用代码不包含漏洞代码时的执行结果,此时,如果执行结
果包括预设的执行结果,则确定所检测的应用不包括漏洞代码,否则,
确定可疑漏洞代码为确切漏洞代码。
在本实施例的一些可选实现方式中,对步骤203可以通过以下方
法实现:首先,电子设备可以根据中间代码的函数调用关系生成调用
路径,其中,每个函数可以调用多个函数,除了主函数外,每个函数
也可以被多个函数调用,每条调用路径形成“函数A调用函数B—函
数B调用函数C—函数C调用函数D……”的调用关系;接着,电子
设备可以按照各调用路径上的调用关系,对中间代码的语句与预设的
漏洞特征语句进行匹配,这里的匹配可以沿着调用路径进行,匹配方
法与前述的匹配方法一致;然后,如果电子设备在一条调用路径上匹
配到预设数量(如3条)的漏洞特征语句,则确定中间代码中包含与
预设的漏洞特征语句相匹配的语句,并确定应用包含可疑漏洞代码。
可选地,当电子设备在一条调用路径上匹配到的漏洞特征语句包括属
于同一漏洞的预设数量的漏洞特征语句时,确定中间代码中包含与预
设的漏洞特征语句相匹配的语句,并确定应用包含可疑漏洞代码。
继续参见图3,图3是根据本实施例的检测应用漏洞代码方法的
应用场景的一个示意图。在图3的应用场景中,在步骤3001中,用户
首先发起通过终端设备301向后台服务器302发起检测应用漏洞代码
的请求,在一些实现中,后台服务器302也可以主动请求检测终端设
备301中的终端应用的应用漏洞代码,此时,步骤3001不是必需的;
接着,通过步骤3002,后台服务器302从终端设备301获取待检测的
终端应用的应用代码;然后通过步骤3003,后台服务器302对所获取
的应用代码进行反编译,生成预定格式的中间代码;接着,通过步骤
3004,后台服务器302通过静态分析手段获取中间代码中的函数调用
关系,并将中间代码中的语句与预设的漏洞特征语句进行匹配,若匹
配到与漏洞特征语句相同的语句,确定终端应用中包含可疑漏洞代码;
然后,在步骤3005中,后台服务器302通过动态分析方法对中间代码
执行针对检测到的可疑漏洞代码预设的验证代码,根据执行结果确定
可疑漏洞代码是否为确切漏洞代码,并且,在一些实现中,后台服务
器302可以通过步骤3006向终端设备301呈现验证结果。
本申请的上述实施例提供的方法通过静态检测可疑漏洞代码和动
态验证可疑漏洞代码相结合,提高了检测应用漏洞代码的有效性。
进一步参考图4,其示出了检测应用漏洞代码方法的又一个实施
例的流程400。该检测应用漏洞代码方法的流程400,包括以下步骤:
步骤401,获取应用的应用代码。
在本实施例中,电子设备可以从本地或远程地获取应用的应用代
码。具体而言,当电子设备时检测应用漏洞代码类应用运行于其上的
终端设备时,其可以直接从本地获取上述应用代码;而当电子设备是
对检测应用漏洞代码类应用进行支持的后台服务器时,其可以通过有
线连接方式或者无线连接方式从终端设备获取上述应用代码。
步骤402,将应用代码进行反编译,生成预定格式的中间代码。
在本实施例中,电子设备接着可以通过静态分析手段将所获取应
用代码进行编译或反编译,从而生成预定格式的中间代码。这里,中
间代码可以是通过某一种预定的编程语言表示的代码,例如Java语言
表示的应用代码;也可以是能够表现应用代码的数据逻辑关系的其他
代码。电子设备可以对应用代码进行编译或反编译,从而转换成中间
格式代码。
步骤403,基于中间代码中的函数调用关系,检测中间代码中是
否包含与预设的漏洞特征语句相匹配的语句,若是,确定上述应用包
含可疑漏洞代码。
在本实施例中,电子设备接着可以通过各种静态分析方法对中间
代码进行,生成中间代码的函数调用关系,进而根据这些函数调用关
系检测中间代码中是否包含与预设的漏洞特征语句相匹配的语句。电
子设备可以通过静态分析方法在不执行代码的情况下对代码可能产生
的行为进行分析。静态分析方法例如可以包括但不限于不可达代码(在
任何情况下都运行不到的代码)去除方法、常量传播
(constant propagation)方法等。进一步地,电子设备可以根据对中间
代码的静态分析过程获取中间代码中所包含的函数之间的调用关系,
并按照函数调用顺序将中间代码的语句与预设的漏洞特征语句进行匹
配。
步骤404,对上述中间代码执行针对可疑漏洞代码预设的验证代
码,根据执行结果确定可疑漏洞代码是否为确切漏洞代码。
在本实施例中,电子设备可以进一步通过动态测试手段对该可疑
漏洞代码进行验证,以确定其是否为确切漏洞代码。这里,确切漏洞
代码可以表示真实存在的、在运行时可以使应用产生漏洞行为的代码。
其中,动态测试方法是通过运行代码对代码进行分析的方法。电子设
备可以通过模拟器、虚拟机或物理设备运行所检测应用的应用代码或
者根据应用代码生成的中间代码。验证代码是对可疑漏洞代码进行验
证的代码,例如是可以利用漏洞特征语句对应用代码进行攻击或破坏
的代码。在一些实现中,如果电子设备对上述中间代码执行针对可疑
漏洞代码预设的验证代码的执行结果为漏洞行为结果,则确定可疑漏
洞代码为确切漏洞代码。
步骤405,如果确定可疑漏洞代码为确切漏洞代码,基于预设的
修复规则修复中间代码。
在本实施例中,在经过验证步骤404确定应用中的可疑漏洞代码
为确切漏洞代码之后,电子设备可以借助预设的修复规则对中间代码
进行修改,从而修复确切漏洞代码。
其中,电子设备可以针对不同的漏洞特征语句,预存有与其对应
的修复规则,使代码不再产生漏洞行为。修复规则可以包括但不限于
以下至少一项:将中间代码中与预设的漏洞特征语句相匹配的语句修
改为预设的修复语句;在中间代码中增加预设的语句;在中间代码中
删除与预设的漏洞特征语句相匹配的代码。例如,对于用于创建文件
的API“openFileOutput(String name,int mode)”,mode参数被设为
MODE_WORLD_READABLE的确切漏洞代码,预设的修复规则可以
为将mode参数由“MODE_WORLD_READABLE”修改为“MODE
PRIVATE”,则所创建的文件不能被任意读取;对于安卓系统的应用中
的“使用了API“getSerializableExtra()”,而没有对获取的传入数据做
异常判断“的确切漏洞代码,预设的修复规则可以为:增加try catch
语句对“getSerializableExtra()”获取的传入数据做异常判断,等等,
在此不再一一列举。
在实践中,用户(例如开发人员)也可能有意利用一些确切漏洞
代码来实现一些特殊的功能。例如,某公司内部使用一个应用来共享
文件,可以通过在该应用的应用代码中通过调用创建文件的API
“openFileOutput(String name,int mode)”,把mode参数设为
MODE_WORLD_READABLE,则所创建的文件在创建之后可以被任
意应用读取,从而达到文件共享的目的。此时,如果电子设备从应用
的中间代码中检测到漏洞代码并进行修复,则该应用共享文件的功能
就没有了。因此,电子设备在确定存在确切漏洞代码之后,可以先向
用户呈现(例如通过对话框、语音呈现)确切漏洞代码的漏洞信息,
例如包括但不限于以下至少一项:漏洞名称、漏洞代码在应用代码中
出现的位置(如某个函数中)等等。电子设备所呈现的漏洞信息可以
接受用户的预定操作,例如确定对确切漏洞代码进行修复的操作、禁
止对确切漏洞代码进行修复的操作等。响应于接收到确定对确切漏洞
代码进行修复的操作,电子设备可以基于预设的修复规则修复上述的
中间代码。
在本实施例的一些可选实现方式中,还包括:
步骤406,对修复后的中间代码进行编译,生成修复应用代码。
这里,电子设备可以进一步对修复确切漏洞代码后的中间代码进
行重新编译,生成修复的应用代码。修复的应用代码可以是与电子设
备所获取的应用代码使用相同编程语言表达的代码,也可以是由中间
代码编译形成的可执行代码,本申请对此不做限定。
在图4的实施例中,上述实现流程中的步骤401、步骤402、步骤
403和步骤404分别与前述实施例中的步骤201、步骤202、步骤203
和步骤204基本相同,在此不再赘述。
从图4中可以看出,与图2对应的实施例不同的是,本实施例中
的检测应用漏洞代码的方法的流程400多出了基于预设的修复规则修
复中间代码的步骤405,还可以包括对修复后的中间代码进行编译,
生成修复应用代码的步骤406。通过增加的步骤405,本实施例描述的
方案有助于提高应用漏洞代码修复的智能化。本实施例还可以通过增
加步骤406,将修复后的中间代码重新编译,节约了人工参与成本,
从而有助于对检测应用漏洞代码方法的功能进行扩展,进一步提高检
测应用漏洞代码的有效性。
请进一步参考图5,作为对上述各图所示方法的实现,本申请提
供了一种检测应用漏洞代码的装置的一个实施例,该装置实施例与图
2所示的方法实施例相对应,该装置具体可以应用于电子设备中。
如图5所示,检测应用漏洞代码的装置500包括:获取模块501、
反编译模块502、检测模块503和验证模块504。其中,获取模块501
可以配置用于获取应用的应用代码;反编译模块502可以配置用于将
应用代码进行反编译,生成预定格式的中间代码;检测模块503可以
配置用于基于上述中间代码中的函数调用关系,检测上述中间代码中
是否包含与预设的漏洞特征语句相匹配的语句,若是,确定上述应用
包含可疑漏洞代码;验证模块504可以配置用于对上述中间代码执行
针对上述可疑漏洞代码预设的验证代码,根据执行结果确定可疑漏洞
代码是否为确切漏洞代码。
检测应用漏洞代码的装置500中记载的诸模块与参考图2描述的
方法中的各个步骤相对应。由此,上文结合图2所描述的针对检测应
用漏洞代码的方法描述的操作和特征同样适用于检测应用漏洞代码的
装置500及其中包含的模块或单元,在此不再赘述。
本领域技术人员可以理解,上述检测应用漏洞代码的装置500还
包括一些其他公知结构,例如处理器、存储器等,为了不必要地模糊
本公开的实施例,这些公知的结构在图5中未示出。
下面参考图6,其示出了适于用来实现本申请实施例的电子设备
的计算机系统600的结构示意图。
如图6所示,计算机系统600包括中央处理单元(CPU)601,其
可以根据存储在只读存储器(ROM)602中的程序或者从存储部分608
加载到随机访问存储器(RAM)603中的程序而执行各种适当的动作
和处理。在RAM 603中,还存储有系统600操作所需的各种程序和数
据。CPU 601、ROM 602以及RAM 603通过总线604彼此相连。输入
/输出(I/O)接口605也连接至总线604。
以下部件连接至I/O接口605:包括键盘、鼠标等的输入部分606;
包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的
输出部分607;包括硬盘等的存储部分608;以及包括诸如LAN卡、
调制解调器等的网络接口卡的通信部分609。通信部分609经由诸如
因特网的网络执行通信处理。驱动器610也根据需要连接至I/O接口
605。可拆卸介质611,诸如磁盘、光盘、磁光盘、半导体存储器等等,
根据需要安装在驱动器610上,以便于从其上读出的计算机程序根据
需要被安装入存储部分608。
特别地,根据本申请的实施例,上文参考流程图描述的过程可以
被实现为计算机软件程序。例如,本申请的实施例包括一种计算机程
序产品,其包括有形地包含在机器可读介质上的计算机程序,所述计
算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施
例中,该计算机程序可以通过通信部分609从网络上被下载和安装,
和/或从可拆卸介质611被安装。
本申请实施例中所涉及到的单元可以通过软件的方式实现,也可
以通过硬件的方式来实现。所描述的单元也可以设置在处理器中,例
如,可以描述为:一种处理器包括获取模块,反编译模块,检测模块
和验证模块。其中,这些模块的名称在某种情况下并不构成对该模块
本身的限定,例如,获取模块还可以被描述为“配置用于获取应用的
应用代码的模块”。
作为另一方面,本申请还提供了一种非易失性计算机存储介质,
该非易失性计算机存储介质可以是上述实施例中所述装置中所包含的
非易失性计算机存储介质;也可以是单独存在,未装配入终端或服务
器中的非易失性计算机存储介质。上述非易失性计算机存储介质存储
有一个或者多个程序,当所述一个或者多个程序被一个设备执行时,
使得所述设备:获取所述应用的应用代码;将所述应用代码进行反编
译,生成预定格式的中间代码;基于所述中间代码中的函数调用关系,
检测所述中间代码中是否包含与预设的漏洞特征语句相匹配的语句,
若是,确定所述应用包含可疑漏洞代码;对所述中间代码执行针对所
述可疑漏洞代码预设的验证代码,根据执行结果确定所述可疑漏洞代
码是否为确切漏洞代码。
以上描述仅为本申请的较佳实施例以及对所运用技术原理的说
明。本领域技术人员应当理解,本申请中所涉及的发明范围,并不限
于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离
所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合
而形成的其它技术方案。例如上述特征与本申请中公开的(但不限于)
具有类似功能的技术特征进行互相替换而形成的技术方案。