基于编译器代码注入的Linux系统调用监控方法技术方案

技术编号:31572918 阅读:15 留言:0更新日期:2021-12-25 11:13
本发明专利技术涉及网络安全技术领域,公开的一种基于编译器代码注入的Linux系统调用监控方法,包括:监控系统模块总体设计、监控系统方案流程设计、监控系统各模块的具体设计、系统调用监控系统的实现,系统调用监控系统的测试,用于对实现系统的功能和系统损耗方面进行验证和测试;本发明专利技术通过调用监控方案提供的调用监控系统能够对从监控系统环境的搭建和功能测试进行完整的高效工作及测试,并且还可以作为运行时系统保护机制的监控机制,当不可信程序请求执行敏感操作时,系统可以及时发现并进行安全分析或拦截。行安全分析或拦截。行安全分析或拦截。

【技术实现步骤摘要】
基于编译器代码注入的Linux系统调用监控方法


[0001]本专利技术涉及网络安全
,尤其涉及一种基于编译器代码注入的Linux系统调用监控方法。

技术介绍

[0002]随着互联网的飞速发展,信息安全事件也随之频发,人们对暴露在互联网中的服务器系统安全的重视程度也在不断增加。Linux作为最常用的一种服务器操作系统,其面临的恶意代码威胁也十分严峻。
[0003]信息安全届对恶意代码分析的研究已经持续多年,其中动态分析是目前针对高度混淆的恶意代码分析中效果较好的分析模式,而系统调用监控是动态分析中十分重要的一个分析信息来源。通过系统调用监控,安全人员可以直观的发现应用程序的所有敏感操作行为,并且不会受到代码混淆的影响。除了作为恶意代码分析工具,系统调用监控还可以作为运行时系统保护机制的监控机制,当不可信程序请求执行敏感操作时,系统可以及时发现并进行安全分析或拦截。当前主流的系统调用监控方案都需要对系统环境或内核进行修改,针对大规模部署在微处理器系统并不十分友好,因此需要一种能够实现系统调用监控方案通过编译器代码注入的方式,将监控逻辑直接整合到编译完成的可执行文件中,这样将编译完成的可执行文件分发给各系统中即可完成对系统调用的监控。

技术实现思路

[0004]为克服现有技术的不足,本专利技术提供一种基于编译器代码注入的Linux系统调用监控方法。
[0005]为实现上述专利技术目的,本专利技术采用如下技术方案:
[0006]一种基于编译器代码注入的Linux系统调用监控方法,包括:监控系统模块总体设计、监控系统方案流程设计、监控系统各模块的具体设计、系统调用监控系统的实现,系统调用监控系统的测试,用于对实现系统的功能和系统损耗方面进行验证和测试;其步骤如下:
[0007]1).监控系统模块总体设计,构建一套用于在应用程序运行时实时搜索系统调用执行,并将其调用相关信息提供给安全人员,使得安全人员能够对应用程序的系统调用行为有直观的监控;因此系统的主要功能需求有:
[0008](1)能够搜索到应用程序中所有的系统调用函数监控系统的起点在于对系统调用函数的发现,由于LLVM IR阶段时,C库函数仍是以函数接口的形式出现,其具体实现仍在之后的链接过程中装入,因此监控系统将对系统调用对应的用户API函数作为监控的对象;
[0009](2)对调用函数的实时信息进行收集,函数的执行时信息主要包含了函数名,参数,返回值等信息,需要对这些运行时信息进行以及可执行文件的进程相关信息进行全面收集;
[0010](3)将收集到的信息以用户可读形式输出,由于系统调用执行时的参数多为指针
的形式出现,所指向内容不会永久保存,且
[0011]可读性不强,因此我们需要将收集到的信息以用户可读的形式
[0012]输出,便于安全人员的日志记录;
[0013]监控方案是在LLVM编译器IR优化阶段的注入来实现整个监控效果,系统总体由三个模块组成,即系统调用搜索模块、调用信息收集模块以及监控信息格式化输出模块;
[0014]系统调用搜索模块负责寻找监控系统的监控目标,其搜索粒度为系统调用API函数级别;调用信息收集模块负责收集一个函数调用中的全部信息及进程相关信息;监控信息格式化输出模块负责程序运行过程中监控系统所收集信息的格式化输出,提供进行分析;
[0015]2).监控系统方案流程设计,监控系统的核心处理时机为LLVM编译器的LLVM IR中间优化阶段,将编写的所有处理逻辑通过注册Pass的方式加载到LLVM IR的中间优化逻辑中,操作对象为LLVM IR比特码文件,其根据时序可以划分为搜索阶段、信息收集阶段及信息输出阶段。这四个阶段也与方案的四个功能模块相对应。处理后的内容为注入监控逻辑的LLVM IR比特码文件,使用LLVM项目提供的汇编工具集将注入后的比特码文件生成最终的可执行文件;
[0016]3).监控系统各模块的具体设计,即将对各个模块涉及到的的具体操作细节进行处理;
[0017]A.系统调用搜索模块,系统调用搜索模块是整个监控系统的出发点,也是整个监控系统细粒度划分的部分;根据LLVM的编译流程特征,以及系统调用在LLVM IR中的出现形式,设置以系统调用API函数为监控起始位置;系统调用搜索模块的功能是解析出LLVM IR比特码文件中的函数调用指令,并判断此次函数调用是否为系统调用API函数,根据其判断结果执行进一步监控逻辑;
[0018](1)解析LLVM IR比特码文件,搜索其中的函数调用指令;
[0019](2)如果本次函数调用不是系统调用API函数调用,则跳过该调用指令,继续寻找下一条函数调用指令;
[0020](3)如果本次函数调用属于系统调用API函数调用则:
[0021]a.从该函数调用指令中获取所调API函数;
[0022]b.将所调API函数实例传入系统调用信息收集模块;
[0023]c.等待信息收集模块处理完毕后继续搜索下一条调用指令;
[0024]B.调用信息收集模块,调用信息收集模块是整个系统调用监控系统的核心功能,是获取系统调用所有程序运行时信息的部分;调用信息收集模块的功能是处理传入的系统调用API函数,对本次系统调用的调用号、参数进行解析;
[0025]这里需要获得的信息分为系统调用信息、运行时API函数信息和相关进程信息;系统调用信息包括系统调用名称及系统调用号;运行时API函数信息包括此次系统调用所传入的参数内容和返回值信息;相关进程信息为发起本次系统调用的进程号;其逻辑为:
[0026](1)等待系统调用搜索模块传入系统调用API函数;
[0027](2)解析调用函数中的系统调用信息,取出系统调用并获取对应的系统调用号;
[0028](3)解析调用函数中的运行时信息,将传入参数及返回值进行保存;
[0029](4)注入获取发起调用函数的进程信息,将获取的进程号保存;
[0030]由于运行时API函数信息及相关进程信息需要在程序运行时实时获取,因此在这里需要将需要获取的以上两种信息以形参的形式进行保存,等待程序运行时获取其真实值;
[0031]C.监控信息格式化输出模块,监控信息格式化输出模块是监控系统的结果展示部分,负责所收集到的监控信息,以用户可读的形式从程序运行时输出,并持久化保存,便于后续对应用程序系统调用行为的进一步分析;
[0032]监控信息的格式化输出,分为格式化文本生成和文件输出部分;为了方便用户对监控结果的分析,首先需要所获取信息的类型,并根据其类型生成对应的格式化文本,将格式化后的文本以文件的形式持久化存储到程序所在的的运行目录中;
[0033]4).系统调用监控系统的实现
[0034]4.1系统调用搜索模块的实现,通过上述系统调用搜索模块的功能是搜索LLVM IR比特码文件中发起函数调用的call指令,并判断所调用的函数是否属于系统调用API函数,如果是则将该本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于编译器代码注入的Linux系统调用监控方法,其特征是:包括:监控系统模块总体设计、监控系统方案流程设计、监控系统各模块的具体设计、系统调用监控系统的实现,系统调用监控系统的测试,用于对实现系统的功能和系统损耗方面进行验证和测试;其步骤如下:1).监控系统模块总体设计,构建一套用于在应用程序运行时实时搜索系统调用执行,并将其调用相关信息提供给安全人员,使得安全人员能够对应用程序的系统调用行为有直观的监控;因此系统的主要功能需求有:(1)能够搜索到应用程序中所有的系统调用函数监控系统的起点在于对系统调用函数的发现,由于LLVM IR阶段时,C库函数仍是以函数接口的形式出现,其具体实现仍在之后的链接过程中装入,因此监控系统将对系统调用对应的用户API函数作为监控的对象;(2)对调用函数的实时信息进行收集,函数的执行时信息主要包含了函数名,参数,返回值等信息,需要对这些运行时信息进行以及可执行文件的进程相关信息进行全面收集;(3)将收集到的信息以用户可读形式输出,由于系统调用执行时的参数多为指针的形式出现,所指向内容不会永久保存,且可读性不强,因此我们需要将收集到的信息以用户可读的形式输出,便于安全人员的日志记录;监控方案是在LLVM编译器IR优化阶段的注入来实现整个监控效果,系统总体由三个模块组成,即系统调用搜索模块、调用信息收集模块以及监控信息格式化输出模块;系统调用搜索模块负责寻找监控系统的监控目标,其搜索粒度为系统调用API函数级别;调用信息收集模块负责收集一个函数调用中的全部信息及进程相关信息;监控信息格式化输出模块负责程序运行过程中监控系统所收集信息的格式化输出,提供进行分析;2).监控系统方案流程设计,监控系统的核心处理时机为LLVM编译器的LLVM IR中间优化阶段,将编写的所有处理逻辑通过注册Pass的方式加载到LLVM IR的中间优化逻辑中,操作对象为LLVM IR比特码文件,其根据时序可以划分为搜索阶段、信息收集阶段及信息输出阶段,这四个阶段也与方案的四个功能模块相对应,处理后的内容为注入监控逻辑的LLVM IR比特码文件,使用LLVM项目提供的汇编工具集将注入后的比特码文件生成最终的可执行文件;3).监控系统各模块的具体设计,即将对各个模块涉及到的的具体操作细节进行处理;A.系统调用搜索模块,系统调用搜索模块是整个监控系统的出发点,也是整个监控系统细粒度划分的部分;根据LLVM的编译流程特征,以及系统调用在LLVM IR中的出现形式,设置以系统调用API函数为监控起始位置;系统调用搜索模块的功能是解析出LLVM IR比特码文件中的函数调用指令,并判断此次函数调用是否为系统调用API函数,根据其判断结果执行进一步监控逻辑;(1)解析LLVM IR比特码文件,搜索其中的函数调用指令;(2)如果本次函数调用不是系统调用API函数调用,则跳过该调用指令,继续寻找下一条函数调用指令;(3)如果本次函数调用属于系统调用API函数调用则:a.从该函数调用指令中获取所调API函数;b.将所调API函数实例传入系统调用信息收集模块;c.等待信息收集模块处理完毕后继续搜索下一条调用指令;
B.调用信息收集模块,调用信息收集模块是整个系统调用监控系统的核心功能,是获取系统调用所有程序运行时信息的部分;调用信息收集模块的功能是处理传入的系统调用API函数,对本次系统调用的调用号、参数进行解析;这里需要获得的信息分为系统调用信息、运行时API函数信息和相关进程信息;系统调用信息包括系统调用名称及系统调用号;运行时API函数信息包括此次系统调用所传入的参数内容和返回值信息;相关进程信息为发起本次系统调用的进程号;其逻辑为:(1)等待系统调用搜索模块传入系统调用API函数;(2)解析调用函数中的系统调用信息,取出系统调用并获取对应的系统调用号;(3)解析调用函数中的运行时信息,将传入参数及返回值进行保存;(4)注入获取发起调用函数的进程信息,将获取的进程号保存;由于运行时API函数信息及相关进程信息需要在程序运行时实时获取,因此在这里需要将需要获取的以上两种信息以形参的形式进行保存,等待程序运行时获取其真实值;C.监控信息格式化输出模块,监控信息格式化输出模块是监控系统的结果展示部分,负责所收集到的监控信息,以用户可读的形式从程序运行时输出,并持久化保存,便于后续对应用程序系统调用行为的进一步分析;监控信息的格式化输出,分为格式化文本生成和文件输出部分;为了方便用户对监控结果的分析,首先需要所获取信息的类型,并根据其类型生成对应的格式化文本,将格式化后的文本以文件的形式持久化存储到程序所在的的运行目录中;4).系统调用监控系统的实现4.1系统调用搜索模块的实现,通过上述系统调用搜索模块的功能是搜索LLVM IR比特码文件中发起函数调用的call指令,并判断所调用的函数是否属于系统调用API函数,如果是则将该被调函数实例传给调用信息收集模块,并进行后续的流程;如果不是则继续搜索下一条指令,直到遍历完LLVM IR文件中的所有指令;所以系统调用搜索模块的任务有:a.遍历LLVM IR比特码文件中的所有指令b.获取函数调用指令中所调用函数的实例c.判断所调用函数是否为系统调用API函数通过以上每个任务的实现,实施系统调用模块的具体步骤:(1)对于任务1,在LLVM中,Pass处理的对象为由一个或多个LLVM IR比特码组成的Module,在Pass文件中,需要通过声明PassManger Interface方法将所编写的Pass注册在中间优化工具opt中;在该过程中,需要向ModulePassManager类的addPass方法中传入实现了run成员方法的Pass子类,LLVM IR系统函数会使opt工具的输入,即待处理的Module,传入run方法中;至此,获得了待处理比特码文件的整个Module实数,然后将在该Module实数中对比特码文件中的指令进行搜索;在/llvm/IR/Module.h文件,能够看到在Module类内部实现了遍历其内部Function的迭代器,因此使用for语句即可对所传入Module中的Function进行遍历;同样的在Function类实现了对内部BasicBlock的迭代器,BasicBlock类实现了对内部Instruction类的迭代器;因此从传入的Module实数开始,使用三层for循环,即可对LLVM IR比特码文件中的所有指令进行遍历;特别的,由于在LLVM IR阶段,还包含一些C标准库函数,这些函数在IR中仅以声明的形
式出现,并没有内部函数实现,因此在遍历Function时需要通过Function::isDeclaration()方法跳过这些仅声明的函数;(2)对于任务2,在LLVM IR中,Instruction类是所有指令类的基类,不同类型的指令又分别对应不同的指令类子类;函数调用指令call所对应的指令类子类为CallInst类;在Pass开发中,提供了dyn_cast()方法来进行实数的类型转换,如果能够转换成功则返回转换后的类实数,如果失败则返回空指针;因此,通过对每一条Instruction实例尝试向CallInst实例的转换,来完成对函数调用指令的识别;在获取到函数调用指令对应的CallInst实例后,使用CallInst::getCalledFunction()方法能够获取该函数调用指令所调用的函数实例;(3)对于任务3,在获取到所调用函数的Function实数后,通过Function::getName()方法得到该函数的函数名,需要搜索的是系统调用API函数,并且这些函数的函数名是已知的;因此,在这里设置一个系统调用API名称集,使用MAP数据结构,在监控系统初始化时将系统调用API函数列表传入名称集中;将所调用函数的函数名在其中搜索,如果搜索成功,则说明所调用函数为系统调用API函数,需要将该函数实例传入调用信息收集模块;反之则不是所搜索的目标函数,继续下一次指令遍历;4.2.调用信息收集模块的实现,调用信息收集模块的功能是将传入的系统调用API函数进行处理分析,将用户感兴趣的所有相关信息收集整合,以及之后输出模块注入点的定位;需要收集的信息分为系统调用信息、运行时函数信息和相关进程信息;因此调用信息收集模块的任务为:a.获取本次系统调用的属性信息,包括系统调用名称和系统调用号;b.获取系统调用API函数的运行时信息,包括所传入的参数、系统调用返回值以及调用指令指针;c.获取发起本次系统调用的相关进程信息,执行本次系统调用API函数的进程号在调用信息收集模块中,定义一个SystemCallInfo类,用来代表每一次系统调用所需要收集的信息,使用成员变量来保存所需要收集的全部信息,这样在对一次系统调用函数实例进行处理时,处理结束后获取的所有信息将会保存在一个S...

【专利技术属性】
技术研发人员:王震徐少坤苗泉强秦富童鲁智勇刘迎龙周超樊永文吴迪王鹏王少磊石鹏飞
申请(专利权)人:中国人民解放军六三八九一部队
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1