CN107194245A - 一种针对Linux内核页表隔离的功能调用改造方法 - Google Patents

一种针对Linux内核页表隔离的功能调用改造方法 Download PDF

Info

Publication number
CN107194245A
CN107194245A CN201710345893.7A CN201710345893A CN107194245A CN 107194245 A CN107194245 A CN 107194245A CN 201710345893 A CN201710345893 A CN 201710345893A CN 107194245 A CN107194245 A CN 107194245A
Authority
CN
China
Prior art keywords
function
module
call
kernel
isolated
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN201710345893.7A
Other languages
English (en)
Inventor
陈溯
黄皓
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Nanjing University
Original Assignee
Nanjing University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Nanjing University filed Critical Nanjing University
Priority to CN201710345893.7A priority Critical patent/CN107194245A/zh
Publication of CN107194245A publication Critical patent/CN107194245A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow

Landscapes

  • Engineering & Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种针对Linux内核页表隔离的功能调用改造方法。内核页表隔离通过将被隔离模块的代码和数据单独映射到由特定页表控制的物理地址空间中,并控制该页表的访问区间,以此实现模块间的隔离。本发明主要对Linux系统的模块间功能调用方式进行改造,以保证隔离后被隔离模块能正常访问内核中其它模块的代码和数据。主要步骤如下:(1)编写clang编译器插件获得被隔离模块的函数调用关系图;(2)编写查找算法查找接口函数调用点;(3)在被隔离模块和内核中分别实现存根子模块和回调子模块;(4)在每个调用点处用存根函数替换原接口函数;(5)重定向进程控制块以保证数据一致性。

Description

一种针对Linux内核页表隔离的功能调用改造方法
技术领域
本发明属于计算机操作系统安全领域,即一种基于内核模块隔离的保护内核模块安全的研究,涉及一种针对Linux内核页表隔离的功能调用改造方法。
背景技术
随着技术的发展,Linux系统已在各行各业都得到了广泛的应用,这其中就包括金融、保险、政府机关等对安全性要求较高的行业,然而Linux内核作为系统中最重要的部分,其安全性一直为人所诟病。导致Linux安全性不高的原因有很多,最根本的原因在于其宏内核的设计模式使得内核中的各个模块都能以最高权限访问整个内核地址空间,从而任意模块的漏洞都可能会扩散到内核的其他模块,最终导致整个系统的崩溃。
随着恶意攻击手段的不断增加,包括沙箱、可信技术及访问控制在内的传统防御机制已无法满足内核的安全性。为此,学界和工业界引入了安全隔离机制来提供一个安全隔离的运行环境以保护内核。根据隔离机制实现方式的不同,我们可以将其归纳为硬件隔离技术和软件隔离技术两类。所谓硬件隔离技术,是指对相关芯片设计一个专门用于存储系统关键数据的安全硬件模块,并通过硬件限制其它模块的非法访问,以此达到隔离的目的,常见的应用模型有可信平台模块TPM和TrustZone安全处理架构两种。然而硬件隔离技术往往依赖于硬件类型,这会降低隔离产品的通用性。所谓软件隔离技术,是指在软件层构建一个安全的隔离运行环境用于存放系统中的敏感数据和相关代码,使这些数据和代码不会受到外界恶意攻击的影响。虚拟化隔离技术是最常见的软件隔离技术之一,它之所以能作为系统安全隔离的手段之一,是因为虚拟机管理软件能拦截并模拟处理客户操作系统的敏感指令,阻止客户机对主机的非法操作,并且保证各个客户机的独立性,使得某个客户机的恶意操作不会扩散到其它客户机上。然而,虚拟机目前只能隔离一些动态载入的驱动模块,而对于包括文件系统在内的静态模块的隔离困难较大。
针对以上两种内核隔离机制的缺陷,提出了基于内存页表不可见性的内核隔离方案。具体做法是将被隔离模块的代码和数据单独映射到由特定页表控制的物理地址空间中,并控制该页表的访问区间,以此实现模块间的隔离。然而原Linux系统采用宏内核模式来设计模块间的功能调用机制,全部过程都处于同一个进程上下文中,但在内存不可见的情况下,一个进程是无法访问两个被隔离模块的。如果不对原功能调用形式进行改造,被隔离模块依旧会通过直接调用接口函数的方式访问其它模块,届时相关的内存访问操作会被拒绝,导致系统不能完整地处理用户请求。
针对上述原Linux内核功能调用的缺陷,本发明提出了一种针对Linux内核页表隔离的功能调用改造方法,即分别在文件系统和内核中插入存根子模块和回调子模块,并将功能调用由原来的宏内核模式改成微内核模式,使系统在保证内核代码和数据的安全性的同时,能够让被隔离模块正常访问内核代码并正确处理用户空间的服务请求。
发明内容
发明目的:本发明所要解决的技术问题是针对原Linux内核的功能调用方式无法适用于基于内存页表不可见性的内核模块隔离方案这一问题,提出了一种针对Linux内核页表隔离的功能调用改造方法。
为了解决以上问题,本发明公开了一种针对Linux内核页表隔离的功能调用改造方法,该方法所有的步骤均运行与Linux平台,用于将被隔离模块间的功能调用方式由原来的宏内核模式改为微内核模式,以允许被隔离模块依旧可以正常的访问内核中其它模块的代码和数据。
所述针对Linux内核页表隔离的功能调用改造方法的步骤如下:
包括如下步骤:
步骤1,在clang编译器中编写插件,利用该插件分析被隔离模块并获得其函数调用关系图;
步骤2,编写查找算法在函数调用关系图中查找其它模块的所有接口函数调用点;
步骤3,根据所得的接口函数编写相应的存根函数和回调函数,并分别存入被隔离模块的存根子模块以及内核的回调子模块中;
步骤4,在每个接口函数调用点处都用对应的存根函数替换原接口函数;
步骤5,针对数据处理过程中的一致性问题,提出了对进程控制块进行重定向的方法。
本发明步骤1包括如下步骤:
步骤1-1,在clang编译器内部编写相关插件并重新编译LLVM,使其在构造完抽象语法树后都以深度优先的范式遍历树中的节点,并过滤出调用函数节点、被调用函数节点以及被调用函数指针节点;
步骤1-2,用步骤1-1得到的编译器插件分析Linux内核源码中的被隔离模块部分,得到其中包括函数指针在内的函数调用关系图;为了解决歧义性问题,还必须将架构相关文件和配置文件导入插件中;
步骤1-3,将步骤1-2得到的函数调用关系信息格式化到指定的哈希表中,其中关键字为调用函数名,值为包括函数指针在内的被调用函数列表;无论是调用函数名还是被调用函数名都以字符串形式保存,并且此时键值对中无模块标签。
本发明步骤1-1包括以下步骤:
步骤1-1-1,重载HandleTranslationUnit函数,在该函数内部调用TraverseDecl函数,从而让clang编译器每次构造完抽象语法树后都以深度优先的范式遍历树中的节点;
步骤1-1-2,重载的VisitFunctionDecl函数,使得clang编译器每当遇到函数声明/类型节点时,都会自动过滤掉函数声明的情况,并将保留下来的函数定义信息作为调用函数保存;
步骤1-1-3,重载的VisitDeclRefExpr函数,使得clang编译器每当遇到引用表达式类型节点时,都会自动过滤掉非函数表达式的情况,并将保留下来的函数表达式信息作为被调用函数保存;
步骤1-1-4,重载的VisitMemberExpr函数,使得clang编译器每当遇到成员表达式类型节点时,都会自动过滤掉非函数指针的情况,并将保留下来的函数指针信息作为被调用函数指针保存。
本发明步骤2包括以下步骤:
步骤2-1,从内核镜像vmlinux中提取各个模块的函数符号信息和接口函数信息,其中每个函数项都包含对应的模块信息;将函数符号信息和接口函数信息按需存放到函数符号表和接口函数表中;
步骤2-2,遍历步骤1中的得到的被隔离模块的函数调用关系图,对每个调用函数或被调用函数都在步骤2-1中的得到的函数符号表中搜索对应的模块信息,并将得到的模块信息以字符串标签的形式打印到函数调用关系图中的相应位置;
步骤2-3,设计并实现了按模块查找接口函数调用点的功能;利用该算法分析步骤2-2中得到的带模块标签的函数调用关系图,以获取被隔离模块中所有调用其它模块接口函数的位置;
步骤2-4,设计并实现了按函数查找接口函数调用点的功能;利用该算法分析步骤2-2中得到的带模块标签的函数调用关系图,以获取被查找函数的调用关系链中所有调用其它模块接口函数的位置。
本发明步骤2-1包括以下步骤:
步骤2-1-1,调用nm命令从内核镜像vmlinux中提取出带位置信息的内核符号表;
步骤2-1-2,根据符号类型从步骤2-1-1得到的内核符号表中筛选出函数符号信息和接口函数信息,其中将类型为T或t符号整理为函数符号信息,而将类型为T的符号整理为接口函数信息;
步骤2-1-3,设计两种哈希表,分别以函数名和函数地址为关键字;将步骤2-1-2得到的函数符号信息存入以函数名为关键字的哈希表中,并将该哈希表作为函数符号表;将步骤2-1-2得到的接口函数表按两种格式分别存入以函数名为关键字的哈希表和已函数地址为关键字的哈希表中,这两个哈希表都称为接口函数表。
本发明步骤2-3包括以下步骤:
步骤2-3-1,将函数调用关系图中的第一个关键字函数(即第一个调用函数)作为当前关键字函数;
步骤2-3-2,获得当前关键字函数对应的被调用函数列表;遍历该被调用函数列表,依次检查被调用函数的模块标签是否是被查找模块或头文件:若是,则直接跳到下一被调用函数;否则,将当前关键字函数和该被调用函数组成的二元组作为接口函数调用点记录下来;
步骤2-3-3,待该关键字函数对应的被调用函数值列表遍历完毕后,检查函数调用关系图中是否还有下一个关键字未被处理:若有,则获取下一个关键字函数作为当前关键字函数返回步骤2-3-2继续执行;否则,结束查找算法。
本发明步骤2-4包括以下步骤:
步骤2-4-1,将被查找函数作为当前关键字函数;
步骤2-4-2,深度优先遍历当前关键字函数对应的被调用函数值列表,若表项函数在目标模块中,则将当前关键字函数和该被调用函数组成的二元组作为接口函数调用点记录下来;否则,执行步骤2-4-3;
步骤2-4-3,若表项函数位于头文件或所在模块与被查找函数相同,则以该表项函数作为当前关键字函数返回步骤2-4-2中继续查找;否则,直接取下一表项函数作为当前关键字返回步骤2-4-2中继续查找,直到遍历结束。
本发明步骤3包括以下步骤:
步骤3-1,设计并实现了一种接口函数改造方案:在被隔离模块和内核中分别设计并实现存根子模块和回调子模块;当被隔离模块需要访问内核中的代码或数据时会重定向到存根子模块中,存根子模块负责打包消息并通过IPC传递到内核中;回调子模块收到消息后交由回调子模块执行,回调子模块负责拆解消息块以获取其中的参数等信息,之后执行真正的工作函数(即原接口函数),最后将返回值打包反馈给被隔离模块;
步骤3-2,设计并实现了存根子模块和回调子模口之间用于IPC传输的消息块,其内部包含六个成员对象,分别是当前进程的current、回调函数指针、指向实参容器的泛型指针、指向返回值的泛型指针、结束位以及反馈消息的队列号;其中当前进程的current值用于解决数据一致性问题,回调函数指针用于告诉内核需要调用哪个回调函数处理,指向实参容器的指针用于存储各种类型和数量的实参,返回值指针用于存储各种类型的返回值,结束位用于指示核心态工作是否结束,反馈消息队列号用于告诉内核将带有返回值的消息块发送到哪个消息队列中;
步骤3-3,设计并实现了用于存储各种类型和数量实参的参数容器,本发明根据参数数量设计了八种实参容器,实现过程中利用C语言中的宏定义来模拟高级语言中的模板,并通过模板实例化的方式来统一传输各种类型和数量的实参。
本发明步骤3-1包括以下步骤:
步骤3-1-1,根据步骤2-1中得到的接口函数表,为每个接口函数都编写对应的存根函数和回调函数,分别存放到被隔离模块的存根子模块和内核的回调子模块中;
步骤3-1-2,存根函数的执行过程:生成并初始化消息块,包括注册回调函数、被隔离模块的当前current值、反馈消息队列号;创建并初始化参数容器,并将其挂载到消息块中;调用消息模块提供的API函数msgsnd发送消息;在先前注册的消息队列号上等待内核的反馈消息;解析反馈消息中的返回值并继续执行下一指令;
步骤3-1-2,回调函数的执行过程:解析获得的消息块并用其中的PCB指针伪装自己的current,以此实现数据一致性;创建参数容器,并以此解析消息块中的具体参数;将具体参数传入真正的工作函数(即原接口函数),并将返回值存入原消息块的相关位置;调用消息模块提供的API函数msgsnd,将原消息块(此时存有返回值)发送到消息块中指定的消息队列中。
本发明步骤4需要根据被调用函数的类型进行分类操作:
若接口函数调用点处调用的是一个普通函数,则直接在源码中用对应的存根函数替换原接口函数;若接口函数调用点处调用的是一个函数指针,则先在步骤2-1-3中得到的以函数地址为关键字的接口函数表中查询该函数指针是否指向一个接口函数的指针,若是,则调用对应的存根函数;否则,直接执行该函数指针。
本发明步骤5包括以下步骤:
步骤5-1,为被隔离模块保存一个独一无二而的全局变量temp(假设被隔离模块是单进程的),用来存储内核传过来的PCB指针;
步骤5-2,被隔离模块每次接收到新的消息块时,都用该消息块中的current成员去更新全局变量temp;
步骤5-3,根据需要重定义current:通过get_current()判断当前进程是被隔离模块进程还是内核进程,若是被隔离模块进程,则返回全局变量temp;若是内核进程,则直接返回get_current()的结果。
附图说明
下面结合附图和具体实施方式对本发明做更进一步的具体说明,本发明的上述或其他方面的优点将会变得更加清楚。
图1为本发明的背景图,即基于内存页表不可见性的内核隔离框架图。
图2为本发明的实现流程图
图3为函数调用关系分析软件的内部流程图
图4为接口函数调用点查找过程的原理图
图5为改造后的功能调用框架图
图6为进程控制块重定向的原理图
具体实施方式
下面结合附图对本发明做进一步说明。
本发明提出了一种针对Linux内核页表隔离的功能调用改造方法,通过对Linux系统的模块间功能调用方式进行改造,以保证隔离后被隔离模块能正常访问内核中其它模块的代码和数据。
图1为基于内存页表不可见性的内核隔离框架图,展示了该隔离环境下一次完整的用户空间服务请求的执行过程,具体步骤如下:
步骤1,应用程序发出的与被隔离模块相关的服务请求时会被hook到被隔离模块进程中执行;
步骤2,当被隔离模块模块需要访问内核其它模块的代码和数据时,并不会直接调用原来的接口函数,取而代之的是调用存根子模块中对应的存储函数,这些存根函数负责生成消息块并选择合适的消息队列号,然后通过消息模块发送到内核中的回调子模块;
步骤3,内核收到消息后交由回调子模块处理,回调子模块调用消息块中先前注册的回调函数执行真正的工作函数,并将返回值通过消息模块返回给被隔离模块以便执行后续指令;
步骤4,当被隔离模块完成整个服务请求后,会将最终的返回值交给内核,然后由内核交给用户应用程序。
图2为本发明的实现流程图,展示了功能调用改造的实现过程,具体步骤如下:
步骤1,在clang编译器中编写插件,利用该插件分析被隔离模块并获得其函数调用关系图,具体插件的实现方法如图3所示;
步骤2,编写查找算法在函数调用关系图中查找其它模块的所有接口函数调用点,具体接口函数调用点查找算法的实现方法如图4所示;
步骤3,根据所得的接口函数编写相应的存根函数和回调函数,并分别存入被隔离模块的存根子模块以及内核的回调子模块中,存根子模块和回调子模块的内部构造如图5所示;
步骤4,在每个接口函数调用点处都用对应的存根函数替换原接口函数,具体工作步骤如下:
步骤4-1,判断当前接口函数调用点处调用的是一个普通函数还是一个函数指针,若是一个普通函数,则执行步骤4-2;若是一个函数指针,则执行步骤4-3;
步骤4-2,直接在源码中用对应的存根函数替换原接口函数;
步骤4-3,先在以函数地址为关键字的接口函数表中查询该函数指针是否指向一个接口函数的指针,若是,则调用对应的存根函数;否则,直接执行该函数指针。
步骤5,针对数据处理过程中的一致性问题,设计并实现了对进程控制块进行重定向的方法,进程控制块重定向的具体实现方法如图6所示。
图3为函数调用关系分析软件(即clang编译器插件)的内部流程图,展示了本发明中函数调用关系分析软件模块的实现方法,具体步骤如下:
步骤1,分别对VisitFunctionDecl函数、VisitDeclRefExpr函数以及VisitMemberExpr函数进行重载,这些被重载的函数用于分析抽象语法树并得到包括函数指针在内的函数调用关系图,具体实现原理如下:
步骤1-1,重载VisitFunctionDecl函数,内部调用isThisDeclarationADefinition函数用于判断当前AST节点表示的是一个函数声明还是一个函数定义,若表示的是一个函数定义,则将当前函数作为关键字保存到哈希表中,并为该关键字函数创建一个空的值列表用于保存它的被调用函数集,否则,直接跳过;该步骤用于获得函数调用关系图中的调用函数信息;
步骤1-2,重载VisitDeclRefExpr函数,内部利用动态类型转换判断当前AST节点是否是函数类型节点,若是,则将当前函数作为被调用函数保存到最近关键字函数所对应的值列表中,否则,直接跳过;该步骤用于获得函数调用关系图中的被调用函数信息;
步骤1-3,重载VisitMemberExpr函数,内部调用isFunctionPointerType函数用于当前AST节点表示的是否是一个函数指针,若是,则将当前指针作为被调用函数指针保存到最近关键字函数所对应的值列表中,否则,直接跳过;该步骤用于获得函数调用关系图中的被调用函数指针信息。
步骤2,重载HandleTranslationUnit函数,内部TraverseDecl函数用于以深度优先的方式遍历AST的每个节点,并根据节点的类型调用相应的重载访问函数进行处理,例如在访问到函数声明/定义类型节点时,会调用步骤1-1中实现的VisitFunctionDecl重载函数仅获得函数定义相关信息;clang编译器每次构造完抽象语法树后都会调用该驱动函数,综合步骤1和步骤2中的重载函数,可以在每次AST构造结束后都获得相关源码的函数调用关系图。
图4为接口函数调用点查找过程的原理图,展示了本发明中接口函数调用点查找算法模块的实现方法,具体步骤如下:
步骤1,从内核镜像vmlinux中整理出函数符号表和接口函数表,具体实现过程如下:
步骤1-1,通过nm命令从内核镜像vmlinux中获得带有位置信息的内核符号表,并根据符号类型筛选出函数符号信息和接口函数信息,其中将类型为T或t的符号整理为函数符号信息,而将类型为T的符号整理为接口函数信息;
步骤1-2,设计两种哈希表,分别以函数名和函数地址为关键字;将步骤1-1得到的函数符号信息存入以函数名为关键字的哈希表中,并将该哈希表作为函数符号表;将步骤1-1得到的接口函数表按两种格式分别存入以函数名为关键字的哈希表和已函数地址为关键字的哈希表中,这两个哈希表都称为接口函数表。
步骤2,遍历被隔离模块的函数调用关系图,对每个调用函数或被调用函数都在步骤1中的得到的函数符号表中搜索对应的模块信息,并将得到的模块信息以字符串标签的形式打印到函数调用关系图中的相应位置;
步骤3,设计两种接口函数调用点查找算法,分别提供按模块查找和按函数查找接口函数调用点的功能;利用这两个算法对步骤2中得到的带有模块标签的函数调用关系图进行分析,以得到被隔离模块中所有调用其它模块接口函数的位置:
步骤3-1,在按模块查找接口函数调用点的算法中,遍历带模块标签的函数关系调用图,首先将第一个关键字(即调用函数)作为当前关键字函数;接着遍历当前关键字函数对应的值列表(即被调用函数列表),依次判断列表中的被调用函数的定义是否在当前模块或头文件中:若是,则继续检查下一个被调用函数;否则,将当前的调用函数和被调用函数组成二元组,保存在特定的哈希表中,以便后续打印结果。
步骤3-2,在按函数查找接口函数调用点的算法中,遍历带模块标签的函数关系调用图,首先将被查找函数作为当前关键字函数;接着深度优先遍历当前关键字函数的第一层被调用函数列表,判断列表中的被调用函数的定义是否在当前模块或头文件中(为了提高效率,可以先判断当前的被调用函数是否已被检查过,并跳过那些已被检查的函数):若是,则将该被调用函数作为当前关键字函数按之前的方式继续递归检查;否则,将当前关键字函数和该被调用函数组成的二元组作为接口函数调用点保存在特定的哈希表中,以便后续打印结果。
图5为改造后的功能调用框架图,展示了功能调用改造后被隔离模块间的交互过程,具体实现过程如下:
步骤1,存根函数的执行流程如下:
步骤1-1,生成并初始化消息块,包括注册回调函数、发送方当前PCB以及接收方反馈消息所在的消息队列号;
步骤1-2,创建并初始化参数容器,并将其挂载到消息块中;
步骤1-3,调用消息模块提供的API函数msgsnd发送消息;
步骤1-4,在指定的消息队列号上等待接收方的反馈消息;
步骤1-5,解析反馈消息中的返回值,并继续执行下一指令。
步骤2,回调函数的执行流程如下:
步骤2-1,解析获得的消息块,并用其中的PCB指针伪装自己的current,以此实现一致性;
步骤2-2,创建参数容器,并以此解析消息块中的具体参数;
步骤2-3,将具体参数传入真正的工作函数(即原接口函数),并将返回值存入原消息块的相关位置;
步骤2-4,调用消息模块提供的API函数msgsnd,并将原消息块(此时存有返回值)发送到消息块中指定的消息队列中。
图6为进程控制块重定向的原理图,展示了本发明是如何通过重定向current以解决数据一致性问题的,具体实现过程如下:
步骤1,为被隔离模块保存一个独一无二而的全局变量temp,用来存储内核传过来的PCB指针;
步骤2,根据需要重定义current,具体做法是通过get_current()判断当前进程是被隔离模块进程还是内核进程,若是被隔离模块进程,则返回全局变量temp;若是内核进程,则直接返回get_current()的结果;
步骤3,被隔离模块每次从内核接收到新的消息块时,都用该消息块中描述PCB的成员去更新其全局变量temp,以此达到实时性的目的。
综上所述,本发明解决了原Linux内核的功能调用方式无法适用于基于内存页表不可见性的内核模块隔离方案这一问题,依次通过提取函数调用关系图、查找接口函数调用点、编写存根子模块和回调子模块、接口函数调用点源码替换以及重定向进程控制块这五个步骤,将被隔离模块间的功能调用方式由原来的宏内核模式改为微内核模式,以允许被隔离模块依旧可以正常的访问内核中其它模块的代码和数据。目前本发明已经成功应用于文件系统隔离和驱动隔离。
本发明提供了一种针对Linux内核页表隔离的功能调用改造方法,对本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还适用于若干场景,例如利用该方法对Linux进行微内核化。这些应用场景也应视为本发明的保护范围。

Claims (10)

1.一种针对Linux内核页表隔离的功能调用改造方法,其特征在于,包括以下步骤:
步骤1,在clang编译器中编写插件,利用该插件分析被隔离模块并获得其函数调用关系图;
步骤2,编写查找算法在函数调用关系图中查找其它模块的所有接口函数调用点;
步骤3,根据所得的接口函数编写相应的存根函数和回调函数,并分别存入被隔离模块的存根子模块以及内核的回调子模块中;
步骤4,在每个接口函数调用点处都用对应的存根函数替换原接口函数;
步骤5,针对数据处理过程中的一致性问题,提出了对进程控制块进行重定向的方法。
2.根据权利要求1所述的方法,其特征在于,步骤1包括以下子步骤:
步骤1-1,在clang编译器内部编写相关插件并重新编译LLVM,使其在构造完抽象语法树后都以深度优先的范式遍历树中的节点,并过滤出调用函数节点、被调用函数节点以及被调用函数指针节点;
步骤1-2,用步骤1-1得到的编译器插件分析Linux内核源码中的被隔离模块部分,得到其中包括函数指针在内的函数调用关系图;为了解决歧义性问题,还必须将架构相关文件和配置文件导入插件中;
步骤1-3,将步骤1-2得到的函数调用关系信息格式化到指定的哈希表中,其中关键字为调用函数名,值为包括函数指针在内的被调用函数列表;无论是调用函数名还是被调用函数名都以字符串形式保存,并且此时键值对中无模块标签。
3.根据权利要求2所述的方法,其特征在于,步骤1-1包括以下子步骤:
步骤1-1-1,重载HandleTranslationUnit函数,在该函数内部调用TraverseDecl函数,从而让clang编译器每次构造完抽象语法树后都以深度优先的范式遍历树中的节点;
步骤1-1-2,重载的VisitFunctionDecl函数,使得clang编译器每当遇到函数声明/类型节点时,都会自动过滤掉函数声明的情况,并将保留下来的函数定义信息作为调用函数保存;
步骤1-1-3,重载的VisitDeclRefExpr函数,使得clang编译器每当遇到引用表达式类型节点时,都会自动过滤掉非函数表达式的情况,并将保留下来的函数表达式信息作为被调用函数保存;
步骤1-1-4,重载的VisitMemberExpr函数,使得clang编译器每当遇到成员表达式类型节点时,都会自动过滤掉非函数指针的情况,并将保留下来的函数指针信息作为被调用函数指针保存。
4.根据权利要求1所述的方法,其特征在于,步骤2包括以下子步骤:
步骤2-1,从内核镜像vmlinux中根据符号类型提取各个模块的函数符号信息和接口函数信息,其中每个函数项都包含对应的模块信息;将函数符号信息和接口函数信息按需存放到函数符号表和接口函数表中,其中接口函数表分为以函数名为关键字的哈希表和已函数地址为关键字的哈希表两种;
步骤2-2,遍历步骤1中的得到的被隔离模块的函数调用关系图,对每个调用函数或被调用函数都在步骤2-1中的得到的函数符号表中搜索对应的模块信息,并将得到的模块信息以字符串标签的形式打印到函数调用关系图中的相应位置;
步骤2-3,设计并实现了按模块查找接口函数调用点的功能;利用该算法分析步骤2-2中得到的带模块标签的函数调用关系图,以获取被隔离模块中所有调用其它模块接口函数的位置;
步骤2-4,设计并实现了按函数查找接口函数调用点的功能;利用该算法分析步骤2-2中得到的带模块标签的函数调用关系图,以获取被查找函数的调用关系链中所有调用其它模块接口函数的位置。
5.根据权利要求4所述的方法,其特征在于,步骤2-3包括以下子步骤:
步骤2-3-1,将函数调用关系图中的第一个关键字函数(即第一个调用函数)作为当前关键字函数;
步骤2-3-2,获得当前关键字函数对应的被调用函数列表;遍历该被调用函数列表,依次检查被调用函数的模块标签是否是被查找模块或头文件:若是,则直接跳到下一被调用函数;否则,将当前关键字函数和该被调用函数组成的二元组作为接口函数调用点记录下来;
步骤2-3-3,待该关键字函数对应的被调用函数值列表遍历完毕后,检查函数调用关系图中是否还有下一个关键字未被处理:若有,则获取下一个关键字函数作为当前关键字函数返回步骤2-3-2继续执行;否则,结束查找算法。
6.根据权利要求4所述的方法,其特征在于,步骤2-4包括以下子步骤:
步骤2-4-1,将被查找函数作为当前关键字函数;
步骤2-4-2,深度优先遍历当前关键字函数对应的被调用函数值列表,若表项函数在目标模块中,则将当前关键字函数和该被调用函数组成的二元组作为接口函数调用点记录下来;否则,执行步骤2-4-3;
步骤2-4-3,若表项函数位于头文件或所在模块与被查找函数相同,则以该表项函数作为当前关键字函数返回步骤2-4-2中继续查找;否则,直接取下一表项函数作为当前关键字返回步骤2-4-2中继续查找,直到遍历结束。
7.根据权利要求1所述的方法,其特征在于,步骤3包括以下子步骤:
步骤3-1,设计并实现了一种接口函数改造方案:在被隔离模块和内核中分别设计并实现存根子模块和回调子模块;当被隔离模块需要访问内核中的代码或数据时会重定向到存根子模块中,存根子模块负责打包消息并通过IPC传递到内核中;回调子模块收到消息后交由回调子模块执行,回调子模块负责拆解消息块以获取其中的参数等信息,之后执行真正的工作函数(即原接口函数),最后将返回值打包反馈给被隔离模块;
步骤3-2,设计并实现了存根子模块和回调子模口之间用于IPC传输的消息块,其内部包含六个成员对象,分别是当前进程的current、回调函数指针、指向实参容器的泛型指针、指向返回值的泛型指针、结束位以及反馈消息的队列号;其中当前进程的current值用于解决数据一致性问题,回调函数指针用于告诉内核需要调用哪个回调函数处理,指向实参容器的指针用于存储各种类型和数量的实参,返回值指针用于存储各种类型的返回值,结束位用于指示核心态工作是否结束,反馈消息队列号用于告诉内核将带有返回值的消息块发送到哪个消息队列中;
步骤3-3,设计并实现了用于存储各种类型和数量实参的参数容器,本发明根据参数数量设计了八种实参容器,实现过程中利用C语言中的宏定义来模拟高级语言中的模板,并通过模板实例化的方式来统一传输各种类型和数量的实参。
8.根据权利要求8所述的方法,其特征在于,步骤3-1包括以下子步骤:
步骤3-1-1,根据步骤2-1中得到的接口函数表,为每个接口函数都编写对应的存根函数和回调函数,分别存放到被隔离模块的存根子模块和内核的回调子模块中;
步骤3-1-2,存根函数的执行过程:生成并初始化消息块,包括注册回调函数、被隔离模块的当前current值、反馈消息队列号;创建并初始化参数容器,并将其挂载到消息块中;调用消息模块提供的API函数msgsnd发送消息;在先前注册的消息队列号上等待内核的反馈消息;解析反馈消息中的返回值并继续执行下一指令;
步骤3-1-2,回调函数的执行过程:解析获得的消息块并用其中的PCB指针伪装自己的current,以此实现数据一致性;创建参数容器,并以此解析消息块中的具体参数;将具体参数传入真正的工作函数(即原接口函数),并将返回值存入原消息块的相关位置;调用消息模块提供的API函数msgsnd,将原消息块(此时存有返回值)发送到消息块中指定的消息队列中。
9.根据权利要求1所述的方法,其特征在于,步骤4需要根据被调用函数的类型进行分类操作:
若接口函数调用点处调用的是一个普通函数,则直接在源码中用对应的存根函数替换原接口函数;若接口函数调用点处调用的是一个函数指针,则先在步骤2-1-3中得到的以函数地址为关键字的接口函数表中查询该函数指针是否指向一个接口函数的指针,若是,则调用对应的存根函数;否则,直接执行该函数指针。
10.根据权利要求1所述的方法,其特征在于,步骤5包括以下子步骤:
步骤5-1,为被隔离模块保存一个独一无二而的全局变量temp(假设被隔离模块是单进程的),用来存储内核传过来的PCB指针;
步骤5-2,被隔离模块每次接收到新的消息块时,都用该消息块中的current成员去更新全局变量temp;
步骤5-3,根据需要重定义current:通过get_current()判断当前进程是被隔离模块进程还是内核进程,若是被隔离模块进程,则返回全局变量temp;若是内核进程,则直接返回get_current()的结果。
CN201710345893.7A 2017-05-12 2017-05-12 一种针对Linux内核页表隔离的功能调用改造方法 Pending CN107194245A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710345893.7A CN107194245A (zh) 2017-05-12 2017-05-12 一种针对Linux内核页表隔离的功能调用改造方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710345893.7A CN107194245A (zh) 2017-05-12 2017-05-12 一种针对Linux内核页表隔离的功能调用改造方法

Publications (1)

Publication Number Publication Date
CN107194245A true CN107194245A (zh) 2017-09-22

Family

ID=59873635

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710345893.7A Pending CN107194245A (zh) 2017-05-12 2017-05-12 一种针对Linux内核页表隔离的功能调用改造方法

Country Status (1)

Country Link
CN (1) CN107194245A (zh)

Cited By (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108595982A (zh) * 2018-03-19 2018-09-28 中国电子科技集团公司第三十研究所 一种基于多容器分离处理的安全计算架构方法及装置
CN108595921A (zh) * 2018-03-22 2018-09-28 北京奇艺世纪科技有限公司 一种源代码中字符串的混淆方法和装置
CN108920217A (zh) * 2018-03-30 2018-11-30 惠州市德赛西威汽车电子股份有限公司 一种减少不可重入函数的重构方法
CN111025127A (zh) * 2019-12-05 2020-04-17 上海御渡半导体科技有限公司 一种Pattern静态编译链接的方法
WO2020114057A1 (zh) * 2018-12-07 2020-06-11 华为技术有限公司 数据处理的方法、装置和服务器
CN112596737A (zh) * 2020-12-28 2021-04-02 上海品顺信息科技有限公司 一种函数调用关系的扫描方法、系统、设备及存储介质
CN112817986A (zh) * 2021-02-26 2021-05-18 北京易捷思达科技发展有限公司 适用于Linux生产环境的数据结构修复方法及装置
CN113342361A (zh) * 2021-05-25 2021-09-03 上海商汤智能科技有限公司 模型部署方法及装置、电子设备和存储介质
CN113835952A (zh) * 2021-09-02 2021-12-24 中国人民解放军63891部队 基于编译器代码注入的Linux系统调用监控方法
CN114090096A (zh) * 2022-01-21 2022-02-25 成都云祺科技有限公司 一种网络虚拟文件系统实现方法、系统及存储介质
CN115509514A (zh) * 2022-11-23 2022-12-23 济南浪潮数据技术有限公司 一种前端数据模拟方法、装置、设备及介质
CN117251205A (zh) * 2023-11-16 2023-12-19 沐曦集成电路(杭州)有限公司 一种头文件的处理方法、装置、设备及介质

Cited By (23)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108595982A (zh) * 2018-03-19 2018-09-28 中国电子科技集团公司第三十研究所 一种基于多容器分离处理的安全计算架构方法及装置
CN108595921A (zh) * 2018-03-22 2018-09-28 北京奇艺世纪科技有限公司 一种源代码中字符串的混淆方法和装置
CN108595921B (zh) * 2018-03-22 2020-11-13 北京奇艺世纪科技有限公司 一种源代码中字符串的混淆方法和装置
CN108920217A (zh) * 2018-03-30 2018-11-30 惠州市德赛西威汽车电子股份有限公司 一种减少不可重入函数的重构方法
CN108920217B (zh) * 2018-03-30 2021-12-03 惠州市德赛西威汽车电子股份有限公司 一种减少不可重入函数的重构方法
CN111290827A (zh) * 2018-12-07 2020-06-16 华为技术有限公司 数据处理的方法、装置和服务器
WO2020114057A1 (zh) * 2018-12-07 2020-06-11 华为技术有限公司 数据处理的方法、装置和服务器
US11947985B2 (en) 2018-12-07 2024-04-02 Huawei Technologies Co., Ltd. Data processing method and apparatus, and server for ensuring consistency of data processing processes of a plurality of containers
CN111290827B (zh) * 2018-12-07 2023-09-08 华为技术有限公司 数据处理的方法、装置和服务器
CN111025127A (zh) * 2019-12-05 2020-04-17 上海御渡半导体科技有限公司 一种Pattern静态编译链接的方法
CN111025127B (zh) * 2019-12-05 2022-09-23 上海御渡半导体科技有限公司 一种Pattern静态编译链接的方法
CN112596737A (zh) * 2020-12-28 2021-04-02 上海品顺信息科技有限公司 一种函数调用关系的扫描方法、系统、设备及存储介质
CN112817986B (zh) * 2021-02-26 2022-03-22 北京易捷思达科技发展有限公司 适用于Linux生产环境的数据结构修复方法及装置
CN112817986A (zh) * 2021-02-26 2021-05-18 北京易捷思达科技发展有限公司 适用于Linux生产环境的数据结构修复方法及装置
CN113342361A (zh) * 2021-05-25 2021-09-03 上海商汤智能科技有限公司 模型部署方法及装置、电子设备和存储介质
CN113835952B (zh) * 2021-09-02 2024-03-15 中国人民解放军63891部队 基于编译器代码注入的Linux系统调用监控方法
CN113835952A (zh) * 2021-09-02 2021-12-24 中国人民解放军63891部队 基于编译器代码注入的Linux系统调用监控方法
CN114090096A (zh) * 2022-01-21 2022-02-25 成都云祺科技有限公司 一种网络虚拟文件系统实现方法、系统及存储介质
CN114090096B (zh) * 2022-01-21 2022-04-15 成都云祺科技有限公司 一种网络虚拟文件系统实现方法、系统及存储介质
CN115509514A (zh) * 2022-11-23 2022-12-23 济南浪潮数据技术有限公司 一种前端数据模拟方法、装置、设备及介质
CN115509514B (zh) * 2022-11-23 2023-03-10 济南浪潮数据技术有限公司 一种前端数据模拟方法、装置、设备及介质
CN117251205B (zh) * 2023-11-16 2024-02-06 沐曦集成电路(杭州)有限公司 一种头文件的处理方法、装置、设备及介质
CN117251205A (zh) * 2023-11-16 2023-12-19 沐曦集成电路(杭州)有限公司 一种头文件的处理方法、装置、设备及介质

Similar Documents

Publication Publication Date Title
CN107194245A (zh) 一种针对Linux内核页表隔离的功能调用改造方法
CN100470480C (zh) 分析程序加速器装置以及更新其的方法
US8819621B2 (en) System and method for automated re-architectureing of legacy systems using object oriented language
Shalev et al. Binary similarity detection using machine learning
CN101950296B (zh) 云数据审计的方法及系统
CN105550594A (zh) 安卓应用文件的安全性检测方法
CN106355092B (zh) 用于优化反病毒测定的系统和方法
GB2513537A (en) Natural language processing
CN104424018A (zh) 分布式计算事务处理方法及装置
CN112347126B (zh) 大数据处理方法、装置、设备及介质
US20150193213A1 (en) Computer Implemented System and Method for Checking a Program Code
CN109408591A (zh) 支持sql驱动的ai与特征工程的决策型分布式数据库系统
CN100407663C (zh) 一种电信智能业务的通用测试系统及方法
CN111309589A (zh) 一种基于代码动态分析的代码安全扫描系统及方法
CN110162963A (zh) 一种识别过权应用程序的方法
CN112732567B (zh) 基于ip的mock数据测试方法、装置、电子设备及存储介质
CN107885489A (zh) 一种快速检测实名登记数据指标的方法和系统
Wen et al. Code similarity detection using ast and textual information
CN112882994A (zh) 一种日志提取方法和装置
Lin Study on the principle and defense of buffer overflow attacks
WO2023115968A1 (zh) 用户端识别违规数据的方法、设备、介质及程序产品
Zhang et al. Distributed system model using SysML and event-B
WO2021051583A1 (zh) 变量的传输和收集方法、装置及计算机可读存储介质
CN114358748B (zh) 基于bim的工程建造信息化管理方法及装置
Newman et al. Modeling the relationship between identifier name and behavior

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
WD01 Invention patent application deemed withdrawn after publication

Application publication date: 20170922

WD01 Invention patent application deemed withdrawn after publication