二进制程序动态污点分析方法及装置

文档序号:1952458 发布日期:2021-12-10 浏览:5次 >En<

阅读说明:本技术 二进制程序动态污点分析方法及装置 (Binary program dynamic taint analysis method and device ) 是由 陈茂飞 汪来富 金华敏 王渭清 刘东鑫 于文良 于 2020-06-09 设计创作,主要内容包括:本发明提供一种二进制程序动态污点分析方法及装置。一种二进制程序动态污点分析方法,对基于容器运行的二进制程序进行动态污点分析,所述二进制程序动态污点分析方法包括:插桩步骤,插桩操作系统的系统调用;获取步骤,通过所插桩的所述系统调用来获取在容器内运行的目标程序的信息;加载步骤,基于所述目标程序的信息,将动态二进制程序分析框架Pin加载到所述目标程序;以及分析步骤,基于所述Pin,对所述目标程序进行动态污点分析。(The invention provides a method and a device for analyzing dynamic taint of a binary program. A binary program dynamic taint analysis method is used for carrying out dynamic taint analysis on a binary program operated based on a container, and comprises the following steps: a pile inserting step, namely, the system call of a pile inserting operation system; an acquisition step of acquiring information of a target program running in a container through the system call of the instrumented; a loading step, loading a dynamic binary program analysis frame Pin to the target program based on the information of the target program; and an analysis step, based on the Pin, performing dynamic taint analysis on the target program.)

二进制程序动态污点分析方法及装置

技术领域

本发明涉及对二进制程序进行动态污点分析的技术,特别涉及一种对基于容器运行的二进制程序进行动态污点分析的技术。

背景技术

污点分析是动态程序分析的关键技术,广泛应用于恶意程序分析、软件测试等领域。

现有的二进制程序动态污点分析方法包括如下步骤:在步骤S1中,基于动态二进制程序分析框架(Pin),对主存和寄存器中来自外部渠道的输入进行识别并将其作为可疑污染源加以标记;在步骤S2中,通过中间指令层实现可疑污染源传播行为的跟踪,根据各指令操作数的污点状态对污点行为进行分析;在步骤S3中,建立内存模型和寄存器模型记录每个主存字节和寄存器字节的污点状态(参照专利文献:申请公布号CN107526970A)。

Pin是Intel开发的动态二进制程序分析框架,支持对x86架构上运行的二进制程序进行动态分析。

容器是轻量级的虚拟化技术,在云计算的趋势下得到愈来愈广泛的应用。然而由于容器对运行在其内的程序进行了隔离,Pin并不支持对基于容器运行的二进制程序进行动态污点分析,同时Pin也不能在容器中运行来对在容器内运行的目标程序进行分析。

发明内容

有鉴于此,本发明的目的在于提供一种对基于容器运行的二进制程序进行动态污点分析的方法及装置。

根据本发明的一个方面,提供一种二进制程序动态污点分析方法,对基于容器运行的二进制程序进行动态污点分析,所述二进制程序动态污点分析方法包括:

插桩步骤,插桩操作系统的系统调用;

获取步骤,通过所插桩的所述系统调用来获取在容器内运行的目标程序的信息;

加载步骤,基于所述目标程序的信息,将动态二进制程序分析框架Pin加载到所述目标程序;以及

分析步骤,基于所述Pin,对所述目标程序进行动态污点分析。

优选地,在所述插桩步骤中,插桩包括所述系统调用和用于获取所述系统调用的返回值的代码的定制代码。

优选地,在所述插桩步骤中,将系统调用表中的原有的系统调用替换为所述定制代码。

优选地,在所述插桩步骤中,所述定制代码作为内核模块动态地加载到操作系统内核。

优选地,在所述插桩步骤中,在所述系统调用中指定用于获取所述目标程序的信息的参数。

优选地,在所述获取步骤中,当所述目标程序在容器内运行时,所述定制代码被执行,并根据用于获取所述系统调用的返回值的代码的执行结果获取所述目标程序的信息。

优选地,所述系统调用包括:关于命名空间的系统调用。

优选地,在所述获取步骤中,获取所述目标程序在操作系统内的全局进程号,在所述加载步骤中,根据所述目标程序的全局进程号,将Pin加载到所述目标程序。

优选地,在所述获取步骤中,还获取所述目标程序的虚拟以太网设备,在所述分析步骤中,根据所述虚拟以太网设备,将从该虚拟以太网设备输入的数据标识为污点数据来进行动态污点分析。

优选地,在所述分析步骤中,在所述目标程序中插桩read系统调用,将从磁盘读取的数据标识为污点数据来进行动态污点分析。

根据本发明的另一方面,提供一种二进制程序动态污点分析装置,包括:

插桩单元,插桩操作系统的系统调用;

获取单元,通过所插桩的所述系统调用来获取在容器内运行的目标程序的信息;

加载单元,基于所述目标程序的信息,将动态二进制程序分析框架Pin加载到所述目标程序;以及

分析单元,基于所述Pin,对所述目标程序进行动态污点分析。

根据本发明的又一方面提供一种计算机可读存储介质,其上存储有计算机程序指令,该程序被处理器执行时实现上述二进制程序动态污点分析方法。

本发明通过插桩操作系统的系统调用来获取在容器内运行的目标程序的信息,并基于获取的所述目标程序的信息,将Pin加载到所述目标程序,进而实现基于Pin对所述目标程序进行动态污点分析,从而本发明能够基于Pin对基于容器运行的不限于编程语言的二进制程序进行动态污点分析,极大拓展了动态污点程序分析工具的边界,这是现有的动态程序分析框架不具备的。

附图说明

图1是通过Namespace实现容器功能的示意图。

图2是示出本发明实施方式的对基于容器运行的二进制程序进行动态污点分析的流程图。

图3是示出本发明实施方式的二进制程序动态污点分析装置的框图。

具体实施方式

下面参照附图对本发明进行更全面的描述,其中说明本发明的示例性实施例。

LXC为Linux Container(Linux容器)的简写,是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源。LXC包括Namespace(命名空间)、Cgroup等。LinuxNamespace机制提供一种资源隔离方案。Namespace将内核的全局资源做封装,使得每个Namespace都有一份独立的资源,因此不同的进程在各自的Namespace内对同一种资源的使用互不干扰。Cgroup是Control group的简称,是Linux内核提供的一个特性,用于限制和隔离一组进程对系统资源的使用。图1为通过Namespace实现容器功能的示意图。

目前Linux内核的Namespace提供了如下表1所示的6种隔离能力:

表1:

Linux对Namespace的实现主要是通过clone(),setns()、unshare()这3个系统调用来完成的。为了确定隔离的到底是哪项Namespace,在使用这些系统调用时,通常需要指定一些调用参数,例如CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER、CLONE_NEWUTS和CLONE_NEWCGROUP。

例如,在运行系统调用clone()时,指定参数CLONE_NEWPID,创建子进程,该子进程在新的Namespace中运行,当clone()运行完成时,返回该子进程的全局进程号。运行系统调用clone()时的指令代码例如如下:

child_pid=clone(childFunc,*,CLONE_NEWPID|SIGCHLD,NULL);

clone(),setns()、unshare()这3个系统调用的具体使用方式是现有技术,在此省略其详细说明。

下面说明本发明的基于Linux容器运行的二进制程序进行动态污点分析的实施方式。

图2示出本发明实施方式的对基于容器运行的二进制程序进行动态污点分析的流程图。

在步骤S101中,插桩操作系统的系统调用。

在本实施方式中,以Linux操作系统为例进行说明,操作系统的系统调用可以包括:Linux内核中关于Namespace实现的系统调用,即clone()、setns()、unshare()这三个系统调用。

为了通过所插桩的系统调用来获取目标程序的信息,在插桩系统调用时,可以通过插入用于获取系统调用的返回值的代码来获取系统调用的返回值。另外,可以根据需要获取的目标程序的信息,在系统调用中指定相应的参数。

作为插桩系统调用的方式,可以采用如下方式:编写定制代码,该定制代码中包括系统调用和用于获取系统调用的返回值的代码。然后修改系统调用表,将系统调用表中的原有的系统调用替换为上述定制代码。这样,当目标程序启动时,重新编译Linux内核,并加载此内核来执行上述定制代码,这时,定制代码中的系统调用被执行,用于获取系统调用的返回值的代码被执行而能够得到系统调用的返回值。

作为修改系统调用表的替代方式,上述定制代码也可以以Linux内核模块(LinuxKernel Module)的方式编写,并根据需要加载或卸载该定制代码。例如当需要获取目标程序的信息时,将该定制代码加载到Linux内核运行,例如不需要获取目标程序的信息时,从Linux内核卸载该定制代码。通过这种方式,可以实现动态加载和卸载定制代码的功能。

在本实施方式中,只要通过插桩系统调用能够获取到在容器内运行的目标程序的信息,则插桩系统调用的方式不限于上述方式。

在步骤S102中,通过所插桩的所述系统调用来获取在容器内运行的目标程序的信息。其中,目标程序是要进行动态污点分析的二进制程序。当容器内的目标程序启动时,在上述步骤S101中插桩的系统调用被执行,根据系统调用的返回值能够获取目标程序的信息。

在本实施方式中,能够获取的目标程序的信息可以包括:

所述目标程序的全局进程号(PID);

在所述目标程序所在的容器的命名空间号中生成的虚拟以太网设备(Network);

所述目标程序所在的容器内的用户ID和用户组ID(User);

所述目标程序所在的容器内的主机名和域名(UTS)。

能够获取的目标程序的信息不限于上述列举的信息,可以根据动态污点分析要求进行增减。作为一个实施例,根据需要获取的信息,在步骤S101中插桩系统调用时指定相应的参数即可。

在此,对目标程序的进程号进行说明。由于容器的隔离,一个基于容器运行的程序被赋予了多个进程号,一个是在容器内的进程号,可以称为局部或本地进程号;一个是基于操作系统的进程号,可以称为全局进程号。由于容器的隔离,在容器内部读取的目标程序的进程号只是本地进程号。本发明通过插桩与Namespace相关的系统调用,可以获取目标程序在操作系统中的全局进程号。

在步骤S103中,基于在所述步骤S102中获取的所述目标程序的信息,将动态二进制程序分析框架(Pin)加载到所述目标程序。

作为将Pin加载到所述目标程序的实现方式,例如,可以根据获取的所述目标程序的全局进程号,将Pin加载到所述目标程序。

例如,将Pin加载到所述目标程序的命令可以为pin–pid<全局进程号>。其中,Pin是Intel提供的动态程序分析框架二进制文件,pid是目标程序的全局进程号。

在本实施方式中,通过步骤S101和S102获取到了目标程序在操作系统中的全局进程号,因此虽然目标程序在操作系统中被容器所隔离,但基于目标程序在操作系统中的全局进程号,Pin可以被加载到在容器内运行的目标程序。

另外,作为另一实施例,在步骤S102中也可以获取所述目标程序所在的容器的命名空间号和所述目标程序在容器内的局部进程号而不获取目标程序的全局进程号,并根据所述目标程序所在的容器的命名空间号和所述目标程序在容器内的局部进程号,将Pin加载到所述目标进程。

在步骤S104中,基于所述Pin,对所述目标程序进行动态污点分析。

Pin被加载到目标程序之后,基于Pin进行目标程序的动态污点分析的方法可以采用现有的任何方式。

下面以插桩系统调用clone()来获取容器中的目标程序的全局进程号为例子,说明获取容器内的目标程序的信息的方法。为了得到目标进程的全局进程号,例如可以插桩系统调用clone(),获取clone()的返回值即可得到目标进程的全局进程号,具体如下:

编写定制的clone()系统调用代码。编写的定制代码可以包括原clone()代码和用于获取clone()的返回值的代码。作为获取clone()的返回值的代码,由于返回值通常保存在eax寄存器中,所以例如利用printk()函数,通过printk()函数将clone()的返回值打印出来。作为编写的定制代码的例子,可以将定制代码新命名为custom_clone(),custom_clone()如下:

编写定制代码之后,修改系统调用表(system call table),将原clone()函数替换为上述编写的定制代码,在本例子中替换为custom_clone()函数。修改系统调用表的指令如下:

original_call=sys_call_table[__NR_clone];

sys_call_table[__NR_clone]=custom_clone;

通过上述指令,在系统调用表中,将原clone()函数替换为custom_clone()函数。

重新编译Linux内核,并加载此内核,这样当基于容器运行的目标程序启动时,按照上述修改后的系统调用表执行custom_clone()函数,获取到该目标程序的全局进程号。

另外,如上说明,也可以把上述定制代码以Linux Kernel Module的方式编写,实现动态加载/卸载此功能。

另外,按照同样的方法,通过插桩与Namespace相关的setns()或unshare()系统调用,也能够获取目标程序的全局进程号,在此不进行详细说明。根据应用场景选用合适的系统调用来获取需要的信息即可。

另外,通过插桩系统调用获取目标程序的其它信息的方法也可以采用同样的方法,在此不进行详细说明。

下面,说明基于Pin对在容器内运行的目标程序进行动态污点分析的具体例子。例如,可以通过插桩系统调用来获取目标程序的虚拟以太网设备,根据所获取的所述虚拟以太网设备,将从该虚拟以太网设备输入的数据标识为污点数据来进行动态污点分析。作为另一例,还可以在所述目标程序中插桩read系统调用,将从磁盘读取的数据标识为污点数据来进行动态污点分析。

例如,在获取到容器内的目标程序的全局进程号之后,需要编写、编译相应的pintool模块,以实现对目标程序具体的污点分析功能,其中pintool是基于Pin提供的API编写的分析模块。

编写pintool实现对目标程序的污点数据流追踪的例子如下:

1)pin提供了插桩目标程序运行系统调用时的API:

·LEVEL_PINCLIENT::SYSCALL_ENTRY_CALLBACK

·LEVEL_PINCLIENT::SYSCALL_EXIT_CALLBACK

其中前者是在目标程序开始系统调用时插桩,后者是在系统调用完成时插桩。

使用API获取目标程序运行系统调用时的调用号,当调用号为read系统调用时:

PIN_GetSyscallNumber(ctx,std)==__NR_read,获取read系统调用的第2、3个参数,得到输入数据读取到内存的地址空间范围,并标注为污点数据。

目标程序继续运行时会对输入数据进行处理,例如使用load/store等指令将输入数据读进寄存器,或存放到其它内存空间地址。

2)pin同样提供了针对指令(instruction)级别的插桩API:

LEVEL_PINCLIENT::INS_INSTRUMENT_CALLBACK

使用提供的API编写pintool代码,追踪load/store等指令的运行,原则是如果指令的输入数据被标记为污点数据,那么输出数据同样被标记为污点数据。

基于1)和2)及其它需要步骤编写、编译pintool,并在分析时使用命令加载:pin–tpintool–pid<全局进程号>,就可以实现对容器中的目标程序的污点数据流追踪。另外,需要说明的是,可以通过pin–t pintool–pid<全局进程号>这样的命令同时实现上述步骤S103中的Pin向目标程序的加载和上述步骤S104中的基于Pin的对目标程序的分析。

本发明不限于以上举出的动态污点分析例子,基于Pin进行动态污点分析的方法可以采用现有的技术,在此不进行详细说明。

图3是示出本发明实施方式的二进制程序动态污点分析装置的框图。如图3所示,本发明实施方式的二进制程序动态污点分析装置包括:插桩单元201,插桩操作系统的系统调用;获取单元202,通过所插桩的所述系统调用来获取在容器内运行的目标程序的信息;加载单元203,基于所述目标程序的信息,将动态二进制程序分析框架Pin加载到所述目标程序;分析单元204,基于所述Pin,对所述目标程序进行动态污点分析。本发明实施方式的二进制程序动态污点分析装置可以通过处理电路来实现,插桩单元201、获取单元202、加载单元203、分析单元204等各个单元仅是根据所实现的具体功能所划分的逻辑模块,而不是用于限制具体的实现方式。在实际实现时,上述各个单元可被实现为独立的物理实体,或者也可以由单个实体(例如,处理器(CPU或DSP等)、集成电路等)来实现。

在另一些实施例中,一种计算机可读存储介质,其上存储有计算机程序指令,该指令被处理器执行时实现图2所对应实施方式中的方法的步骤。本领域内的技术人员应明白,本公开的实施例可提供为方法、装置、或计算机程序产品。因此,本公开可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本公开可采用在一个或多个其中包含有计算机可用程序代码的计算机可用非瞬时性存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。

在以上实施方式中,给出了以基于Linux操作系统的Linux容器技术为例,说明了对基于容器运行的二进制程序进行动态污点分析的方法,但本发明不限于此,在Windows和MacOS等其它操作系统中基于容器运行的二进制程序也能够应用本发明实施方式的二进制程序动态污点分析方法。Windows和MacOS是商业软件、非开源操作系统,但是也同样使用类似的系统调用机制,也提供了相应的系统调用。因此,在其它操作系统中,也同样能够应用本发明实施方式的二进制程序动态污点分析方法。

以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场技术的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。

11页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:回归测试方法、装置及电子设备

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!