CN118819667B - 一种动态库的加载方法、装置、设备及存储介质 - Google Patents
一种动态库的加载方法、装置、设备及存储介质Info
- Publication number
- CN118819667B CN118819667B CN202410818652.XA CN202410818652A CN118819667B CN 118819667 B CN118819667 B CN 118819667B CN 202410818652 A CN202410818652 A CN 202410818652A CN 118819667 B CN118819667 B CN 118819667B
- Authority
- CN
- China
- Prior art keywords
- dynamic
- dynamic library
- executable file
- target executable
- memory
- 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.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING OR CALCULATING; COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45583—Memory management, e.g. access or allocation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本公开提供了一种动态库的加载方法、装置、设备及存储介质,所述方法包括:接收针对目标可执行文件的加载请求,对目标可执行文件进行验证,如果目标可执行文件验证通过,则将目标可执行文件加载至内存中,读取内存中目标可执行文件中的动态链接器,对动态链接器进行验证,如果动态链接器验证通过,则将动态链接器加载至内存中,控制动态链接器在内存中启动;其中,动态链接器用于对劫持动态库进行验证,如果劫持动态库验证通过,则将劫持动态库加载至内存中,目标可执行文件用于调用劫持动态库对原始动态库进行验证,并在原始动态库验证通过时,调用劫持动态库将原始动态库加载至内存中。可见,本公开实施例能够有效防止动态库逃逸。
Description
技术领域
本公开涉及数据处理领域,尤其涉及一种动态库的加载方法、装置、设备及存储介质。
背景技术
随着软件复杂性的增加,特别是容器化技术的广泛应用,防止动态库逃逸显得尤为重要。
相关技术中,租户可以通过配置ldconfig(动态链接器运行时绑定配置)或设置LD_LIBRARY_PATH(动态链接器查找路径)环境变量的方式自定义动态库的查找路径,以满足自定义可执行文件的需求。
然而,动态库的自定义配置导致可执行文件绕过原有的劫持动态库,例如:以原有的劫持动态库为资源限额的劫持动态库为例,动态库的自定义配置导致资源限额的劫持动态库无法劫持可执行文件中调用的应用程序接口,造成动态库逃逸,因此,如何防止动态库逃逸成为亟需解决的一个技术问题。
发明内容
为了解决上述技术问题,本公开实施例提供了一种动态库的加载方法、装置、设备及存储介质。
第一方面,本公开提供了一种动态库的加载方法,所述方法包括:
接收针对目标可执行文件的加载请求,对所述目标可执行文件进行验证,如果所述目标可执行文件验证通过,则将所述目标可执行文件加载至内存中;
读取所述内存中所述目标可执行文件中的动态链接器,对所述动态链接器进行验证,如果所述动态链接器验证通过,则将所述动态链接器加载至内存中;
控制所述动态链接器在所述内存中启动;其中,所述动态链接器用于查找所述目标可执行文件对应的劫持动态库,并对所述劫持动态库进行验证,如果所述劫持动态库验证通过,则将所述劫持动态库加载至所述内存中,以及控制所述目标可执行文件在所述内存中启动,所述动态链接器用于拒绝加载原始动态库,所述原始动态库为所述目标可执行文件运行时所依赖的动态库,所述目标可执行文件用于调用所述劫持动态库对所述原始动态库进行验证,并在所述原始动态库验证通过时,调用所述劫持动态库将所述原始动态库加载至所述内存中。
一种可选的实施方式中,所述劫持动态库中包括所述目标可执行文件待调用的资源分配函数的接口符号值,所述目标可执行文件用于调用所述劫持动态库获取所述接口符号值,所述劫持动态库用于在所述资源分配函数对应的待分配资源量与所述目标可执行文件对应的容器的当前已使用资源量之和,未超出所述容器的预设资源限额时,基于所述接口符号值调用所述资源分配函数进行资源分配。
一种可选的实施方式中,所述劫持动态库中不包括所述目标可执行文件待调用的资源分配函数的接口符号值,所述目标可执行文件用于调用所述劫持动态库从所述原始动态库中获取所述资源分配函数的接口符号值,所述劫持动态库用于在所述资源分配函数对应的待分配资源量与所述目标可执行文件对应的容器的当前已使用资源量之和,未超出所述容器的预设资源限额时,基于所述接口符号值调用所述资源分配函数进行资源分配。
一种可选的实施方式中,所述接收针对目标可执行文件的加载请求,对所述目标可执行文件进行验证,包括:
接收针对目标可执行文件的加载请求,基于预设第一私钥对所述目标可执行文件预设的签名进行验证。
一种可选的实施方式中,所述读取所述内存中所述目标可执行文件中的动态链接器,对所述动态链接器进行验证,包括:
读取所述内存中所述目标可执行文件中的动态链接器,基于预设第二私钥对所述动态链接器预设的签名进行验证。
一种可选的实施方式中,所述动态链接器中设置有预设第三私钥,所述预设第三私钥用于对所述劫持动态库预设的签名进行验证。
一种可选的实施方式中,所述劫持动态库中设置有预设第四私钥,所述预设第四私钥用于对所述原始动态库预设的签名进行验证。
第二方面,本公开提供了一种动态库的加载装置,所述装置包括:
接收模块,用于接收针对目标可执行文件的加载请求,对所述目标可执行文件进行验证,如果所述目标可执行文件验证通过,则将所述目标可执行文件加载至内存中;
读取模块,用于读取所述内存中所述目标可执行文件中的动态链接器,对所述动态链接器进行验证,如果所述动态链接器验证通过,则将所述动态链接器加载至内存中;
控制模块,用于控制所述动态链接器在所述内存中启动;其中,所述动态链接器用于查找所述目标可执行文件对应的劫持动态库,并对所述劫持动态库进行验证,如果所述劫持动态库验证通过,则将所述劫持动态库加载至所述内存中,以及控制所述目标可执行文件在所述内存中启动,所述动态链接器用于拒绝加载原始动态库,所述原始动态库为所述目标可执行文件运行时所依赖的动态库,所述目标可执行文件用于调用所述劫持动态库对所述原始动态库进行验证,并在所述原始动态库验证通过时,调用所述劫持动态库将所述原始动态库加载至所述内存中。
第三方面,本公开提供了一种计算机可读存储介质,所述计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备实现上述的方法。
第四方面,本公开提供了一种动态库的加载设备,包括:存储器,处理器,及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现上述的方法。
第五方面,本公开提供了一种计算机程序产品,所述计算机程序产品包括计算机程序/指令,所述计算机程序/指令被处理器执行时实现上述的方法。
本公开实施例提供的技术方案与现有技术相比至少具有如下优点:
本公开实施例提供了一种动态库的加载方法,接收针对目标可执行文件的加载请求,对目标可执行文件进行验证,如果目标可执行文件验证通过,则将目标可执行文件加载至内存中,读取内存中目标可执行文件中的动态链接器,对动态链接器进行验证,如果动态链接器验证通过,则将动态链接器加载至内存中,控制动态链接器在内存中启动;其中,动态链接器用于查找目标可执行文件对应的劫持动态库,并对劫持动态库进行验证,如果劫持动态库验证通过,则将劫持动态库加载至内存中,以及控制目标可执行文件在内存中启动,动态链接器用于拒绝加载原始动态库,原始动态库为目标可执行文件运行时所依赖的动态库,目标可执行文件用于调用劫持动态库对原始动态库进行验证,并在原始动态库验证通过时,调用劫持动态库将原始动态库加载至内存中。可见,本公开实施例从操作系统内核到动态链接器,从动态链接器到劫持动态库,从劫持动态库到原始动态库多级验证的方式,能够有效防止动态库逃逸。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本公开实施例提供的一种可执行文件加载和运行过程的流程示意图;
图2为本公开实施例提供的一种动态库的加载方法的流程图;
图3为本公开实施例提供的另一种动态库的加载方法的流程图;
图4为本公开实施例提供的又一种动态库的加载方法的流程图;
图5为本公开实施例提供的一种动态库的加载装置的结构示意图;
图6为本公开实施例提供的一种动态库的加载设备的结构示意图。
具体实施方式
为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
在云计算场景下,资源以资源池的形式存在并根据合理的策略按需分配调度,这些资源包括但不限于中央处理单元CPU资源、内存资源、磁盘资源,以及其他输入输出IO外设资源。常见的资源限额方案有Linux内核的控制组、文件系统的限额quota能力、劫持动态库函数等,云厂商根据租户实际购买情况分配等价资源来提供服务。
操作系统、容器镜像中包含大量的可执行文件和动态库,这些动态库向上为应用程序提供统一的应用程序接口,向下可与操作系统内核交互、与硬件设备交互等。
为便于理解针对可执行文件的加载和运行过程进行具体描述,参考图1,为本公开实施例提供的一种可执行文件加载和运行过程的流程示意图,如图1所示,首先,在可执行文件执行之初,首先通过操作系统内核将可执行文件加载到内存,在可执行文件加载到内存之后,操作系统内核继续将可执行文件指定的动态链接器加载到内存,并跳转到动态链接器开始执行(即操作系统内核将控制权给了动态链接器),动态链接器根据可执行文件依赖的动态库表将动态库加载到内存中,继而跳转到可执行文件入口点进行执行(即动态链接器将控制权给了可执行文件),至此,完成了可执行文件的加载和运行,其中,可执行文件的加载和运行过程在容器中是相同的。
操作系统内核通过动态库为应用程序提供接口,这些接口可以是:分配设备内存、在设备上执行一段程序来使用设备的计算资源等。硬件厂商会提供可供应用程序调用的动态库程序,如英伟达的CUDA(Compute Unified Device Architecture,计算统一设备架构)/NVML(NVIDIA Management Library,英伟达管理库)动态库提供英伟达图形处理器NVIDIA GPU接口。
在云场景下,容器编排引擎Kubernetes集群中运行大量的容器组Pod,通常每个Pod不会占用全额的设备资源。也就是说,需要在Pod的启动过程,Kubernetes根据资源分配情况进行Pod设备资源配额。
其中,基于动态库的资源限额技术方案的实现依赖于动态库劫持技术,容器场景下,在容器启动时,通过挂载卷将劫持动态库挂载到容器动态库查找路径中。当依赖于被劫持动态库的可执行文件被执行时,劫持动态库将会被加载,劫持动态库实现了原始动态库的所有应用程序接口,这些接口包含资源限制算法和对原始应用程序接口的钩子。当这些应用程序接口被调用时,首先判断劫持动态库是否已经加载原始动态库中的应用程序接口,如果没有则需要首先加载这些接口符号值并赋值给劫持动态库的钩子函数。然后根据当前进程或容器对硬件资源的使用情况,调用限额算法,若超出指定的资源限制,不再分配新的资源,否则成功分配。
该动态库劫持方案可应用于对Kubernetes集群中英伟达图形处理器的资源限制。例如,一个英伟达图形处理器拥有8GB显存资源,通过劫持cuMemAlloc库函数,对已分配内存进行计数,进而实现内存分配限额。这样,就可以根据租户/用户的实际支付情况,为用户分配相应的资源。
基于上述的描述,通过劫持动态库,从而修改原始动态库函数以实现资源限额的功能。在这个过程中,动态库的加载是通过动态链接器加载进内存的,比如GNU C标准库的动态链接器/加载器ld.so(在x86_64架构下通常为/lib64/ld-linux-x86-64.so.2)会根据可执行文件依赖的动态库,在动态链接器查找路径LD_LIBRARY_PATH中找到匹配的动态库,并加载进内存。
综上,租户可以通过配置ldconfig(动态链接器运行时绑定配置)或通过设置LD_LIBRARY_PATH环境变量的方式自定义动态库的查找路径,如图2所示,致使应用程序可以使用任何能正常加载的动态库,从而导致资源限额的劫持动态库无法劫持可执行文件中调用的应用程序接口,造成动态库逃逸,实际应用场景中,若租户在使用Pod时指定了可以使用全额资源的动态库,那么就会让租户花费较小的费用,使用较多的资源,因此,如何防止动态库逃逸成为亟需解决的一个技术问题。
为了防止动态库逃逸,本公开实施例提供了一种动态库的加载方法。
具体地,接收针对目标可执行文件的加载请求,对目标可执行文件进行验证,如果目标可执行文件验证通过,则将目标可执行文件加载至内存中,读取内存中目标可执行文件中的动态链接器,对动态链接器进行验证,如果动态链接器验证通过,则将动态链接器加载至内存中,控制动态链接器在内存中启动;其中,动态链接器用于查找目标可执行文件对应的劫持动态库,并对劫持动态库进行验证,如果劫持动态库验证通过,则将劫持动态库加载至内存中,以及控制目标可执行文件在内存中启动,动态链接器用于拒绝加载原始动态库,原始动态库为目标可执行文件运行时所依赖的动态库,目标可执行文件用于调用劫持动态库对原始动态库进行验证,并在原始动态库验证通过时,调用劫持动态库将原始动态库加载至内存中。本公开实施例从操作系统内核到动态链接器,从动态链接器到劫持动态库,从劫持动态库到原始动态库多级验证的方式,能够有效防止动态库逃逸。
基于此,本公开实施例提供了一种动态库的加载方法,参考图3,为本公开实施例提供的另一种动态库的加载方法的流程图,该方法包括:
S301:接收针对目标可执行文件的加载请求,对目标可执行文件进行验证,如果目标可执行文件验证通过,则将目标可执行文件加载至内存中。
本公开实施例提供的动态库的加载方法可以应用于操作系统内核中,其中,操作系统可以为UNIX系统、Windows操作系统,本公开实施例在此不做任何限定。
相应地,针对不同的操作系统,对应的目标可执行文件的文件格式不同,如UNIX系统对应UNIX ELF(Executable and Linkable Format,可执行与可链接格式)格式,Windows操作系统对应Windows PE(Portable Executable,便携式可执行文件格式)格式。
以容器编排引擎Kubernetes为例,目标可执行文件可以为在Kubernetes环境中,任一容器内运行的应用程序。
需要说明的是,本公开实施例对容器编排引擎不进行任何限定。
具体地,操作系统内核可以基于下述方式对目标可执行文件进行验证。
一种可选的实施方式中,接收针对目标可执行文件的加载请求,基于预设第一私钥对所述目标可执行文件预设的签名进行验证。
本公开实施例中,操作系统内核设置有预设第一私钥,其中,该预设第一私钥用于对目标可执行文件预设的签名进行验证,如果目标可执行文件预设的签名可以被预设第一私钥验证,则表明目标可执行文件验证通过。
另一种可选的实施方式中,还可以通过哈希校验方式对目标可执行文件进行验证。
本公开实施例中,操作系统内核可以通过计算目标可执行文件的哈希值的方式,与预设哈希值进行比对,如果比对成功,则表明目标可执行文件验证通过。
需要说明的是,上述仅作为示例,本公开实施例对操作系统内核对目标可执行文件的验证方式并不做任何限定。
本公开实施例中,在目标可执行文件验证通过,操作系统内核首先读取目标可执行文件的头部信息,包括目标可执行文件的格式、入口点、代码段和数据段的位置和大小,然后操作系统内核为目标可执行文件的各个段(如代码段、数据段)在内存中分配空间,从而可以将目标可执行文件的代码段和数据段加载至内存中分配的空间。
本公开实施例中,如果目标可执行文件验证失败,则拒绝加载。
S302:读取内存中目标可执行文件中的动态链接器,对动态链接器进行验证,如果动态链接器验证通过,则将动态链接器加载至内存中。
其中,动态链接器也可以成为动态链接库加载器,用于对目标可执行文件进行解析和加载,以确定目标可执行文件中的动态库。
具体地,操作系统内核可以基于下述方式对动态链接器进行验证。
一种可选的实施方式中,读取内存中目标可执行文件中的动态链接器,基于预设第二私钥对动态链接器预设的签名进行验证。
其中,预设第二私钥可以和上述预设第一私钥相同,即操作系统内核可以设置同一私钥对目标可执行文件和动态链接器进行验证。
本公开实施例中,操作系统内核设置有预设第二私钥,其中,该预设第二私钥用于对动态链接器预设的签名进行验证,如果动态链接器预设的签名可以被预设第二私钥验证,则表明动态链接器验证通过。
如果验证未通过,则拒绝加载,并释放上述已加载的目标可执行程序。
需要说明的是,操作系统内核还可以通过哈希校验方式,对动态链接器进行验证,具体可以参考操作系统内核对目标可执行文件进行验证的描述,本公开实施例对操作系统内核对动态链接器的验证方式并不做任何限定。
S303:控制动态链接器在内存中启动。
其中,动态链接器用于查找目标可执行文件对应的劫持动态库,并对劫持动态库进行验证,如果劫持动态库验证通过,则将劫持动态库加载至内存中,以及控制目标可执行文件在内存中启动,动态链接器用于拒绝加载原始动态库,原始动态库为目标可执行文件运行时所依赖的动态库,目标可执行文件用于调用劫持动态库对原始动态库进行验证,并在原始动态库验证通过时,调用劫持动态库将原始动态库加载至内存中。
本公开实施例中,操作系统内核控制动态链接器在内存中启动,也就是说操作系统内核将控制权给了动态链接器。
本公开实施例中,动态链接器运行过程中,对可执行文件的头部信息进行解析,如果查找到目标可执行文件对应的劫持动态库后,动态链接器可以对劫持动态库进行验证。
一种可选的实施方式中,动态链接器中设置有预设第三私钥,预设第三私钥用于对劫持动态库预设的签名进行验证。
本公开实施例中,动态链接器可以通过数字签名的方式对劫持动态库进行验证,具体地,动态链接器可以通过内置预设第三私钥的方式,对劫持动态库预设的签名进行验证,如果劫持动态库预设的签名验证成功,则表明劫持动态库验证通过。
如果劫持动态库验证通过,动态链接器将该劫持动态库加载至内存中,如果劫持动态库验证未通过,则释放上述已加载的目标可执行程序和动态链接器。
需要说明的是,动态链接器还可以通过哈希校验方式,对劫持动态库进行验证,具体实现方式可以参考操作系统内核对目标可执行文件进行验证的描述,本公开实施例对动态链接器对劫持动态库的验证方式并不做任何限定。
为了避免租户对原始动态库进行篡改,动态链接器可以设置为拒绝加载原始动态库。
本公开实施例中,在劫持动态库验证通过,动态链接器将劫持动态库加载至内存后,控制目标可执行文件在内存中启动,也就是说动态链接器将控制权给了目标可执行文件。
目标可执行文件的运行过程中,目标可执行文件可以通过调用劫持动态库的方式对原始动态库进行验证,从而在原始动态库验证通过时,目标可执行文件可以调用劫持动态库将原始动态库加载至内存中。
一种可选的实施方式中,劫持动态库中设置有预设第四私钥,预设第四私钥用于对原始动态库预设的签名进行验证。
本公开实施例中,劫持动态库可以通过内置预设第四私钥的方式,对原始动态库预设的签名进行验证,从而在原始动态库预设的签名验证通过后,将原始动态库加载至内存,如果原始动态库预设的签名验证未通过,则拒绝加载,同时释放上述已加载的目标可执行文件、动态链接器、劫持动态库。
需要说明的是,劫持动态库还可以通过哈希校验方式、动态库白名单方式,对原始动态库进行验证,具体实现方式可以参考操作系统内核对目标可执行文件进行验证的描述。
参考图4,为本公开实施例提供的又一种动态库的加载流程图,如图4所示,实际应用中,以预设第一私钥和预设第二私钥为私钥1,以预设第三私钥为私钥2,预设第四私钥为私钥3,目标可执行文件预设的签名和动态链接器预设的签名为签名1,劫持动态库预设的签名为签名2,原始动态库预设的签名为签名3为例,可以在操作系统内核中设置私钥1,目标可执行文件和动态链接器中设置签名1,其中,签名1由私钥1生成,也就是说在目标可执行文件设置的签名为签名1时,目标可执行文件可以被操作系统内核中设置的私钥1验证通过,在动态链接器设置的签名为签名1时,动态链接器可以被操作系统内核中设置的私钥1验证通过。
动态链接器中设置私钥2,基础动态库和劫持动态库中设置签名2,其中,签名2由私钥2生成,也就是说,在劫持动态库设置的签名为签名2时,劫持动态库可以被动态链接器设置的私钥2验证通过,在基础动态库设置的签名为签名2时,基础动态库可以被动态链接器设置的私钥2验证通过。
劫持动态库中设置私钥3,原始动态库中设置签名3,其中,签名3由私钥3生成,也就是说,在原始动态库设置的签名为签名3时,原始动态库可以被劫持动态库设置的私钥3验证通过,而在原始动态库设置的签名为签名3时,不可以被动态链接器设置的私钥2验证通过,以拒绝被动态链接器加载。
通过上述方式:操作系统内核拒绝加载未签名或者验签失败的目标可执行文件和动态链接器,动态链接器拒绝加载未签名或者验签失败的动态库(如未加签的劫持动态库、基础动态库),劫持动态库拒绝加载未签名或者验签失败的原始动态库。
需要说明的是,容器组中安装的软件由容器组提供商统一提供并且安装、编译的软件需要通过认证后签名。
在上述目标可执行文件、动态链接器、劫持动态库、原始动态库均加载至内存后,在劫持动态库中包括目标可执行文件待调用的资源分配函数的接口符号值时,相应地,目标可执行文件用于调用劫持动态库获取接口符号值,劫持动态库用于在资源分配函数对应的待分配资源量与目标可执行文件对应的容器的当前已使用资源量之和,未超出容器的预设资源限额时,基于接口符号值调用资源分配函数进行资源分配。
本公开实施例中,如果劫持动态库中包括目标客户咨询文件待调用的资源分配函数的接口符号值,则表明目标可执行文件已经调用劫持动态库从原始动态库中获取了资源分配函数的接口符号值。
进一步地,目标可执行文件直接通过调用劫持动态库的方式获取接口符号值,而劫持动态库可以通过调用资源限制算法的方式,确定资源分配函数对应的待分配资源量与目标可执行文件对应的容器的当前已使用资源量之和,是否超出容器的预设资源限额,如果未超出容器的预设资源限额,劫持动态库可以基于接口符号值调用资源分配函数进行资源分配,如果超出容器的预设资源限额,则提示资源超额。
一种可选的实施方式中,劫持动态库中不包括目标可执行文件待调用的资源分配函数的接口符号值,目标可执行文件用于调用劫持动态库从原始动态库中获取资源分配函数的接口符号值,劫持动态库用于在资源分配函数对应的待分配资源量与目标可执行文件对应的容器的当前已使用资源量之和,未超出容器的预设资源限额时,基于接口符号值调用资源分配函数进行资源分配。
其中,预设资源限额是指预先设置的目标可执行文件所在容器的可使用的系统资源(如内存、存储空间等)的最大资源量。
本公开实施例中,如果劫持动态库中不包括目标可执行文件待调用的资源分配函数的接口符号值,目标可执行文件可以通过调用劫持动态库从原始动态库中获取资源分配函数的接口符号值,同样地,劫持动态库可以通过调用资源限制算法的方式,确定资源分配函数对应的待分配资源量与目标可执行文件对应的容器的当前已使用资源量之和,是否超出容器的预设资源限额,如果未超出容器的预设资源限额,劫持动态库可以基于接口符号值调用资源分配函数进行资源分配,如果超出容器的预设资源限额,则提示资源超额。
相关技术中,通过劫持动态库可以实现资源限额,可以为Kubernetes集群提供硬件资源限额机制,但用户可以通过自定义动态库实现逃逸,从而使用整个设备的资源,甚至进行危险操作从而影响整个设备的运行,而本公开实施例可以通过“验证链”机制有效防止上述行为,同时并不会占用额外资源,不影响性能。
本公开实施例提供的动态库的加载方法中,接收针对目标可执行文件的加载请求,对目标可执行文件进行验证,如果目标可执行文件验证通过,则将目标可执行文件加载至内存中,读取内存中目标可执行文件中的动态链接器,对动态链接器进行验证,如果动态链接器验证通过,则将动态链接器加载至内存中,控制动态链接器在内存中启动;其中,动态链接器用于查找目标可执行文件对应的劫持动态库,并对劫持动态库进行验证,如果劫持动态库验证通过,则将劫持动态库加载至内存中,以及控制目标可执行文件在内存中启动,动态链接器用于拒绝加载原始动态库,原始动态库为目标可执行文件运行时所依赖的动态库,目标可执行文件用于调用劫持动态库对原始动态库进行验证,并在原始动态库验证通过时,调用劫持动态库将原始动态库加载至内存中。可见,本公开实施例从操作系统内核到动态链接器,从动态链接器到劫持动态库,从劫持动态库到原始动态库多级验证的方式,能够有效防止动态库逃逸。
实际应用中,针对目标可执行文件的加载过程包括如下步骤:
1.操作系统内核通过系统调用运行目标可执行文件;
2.操作系统内核加载目标可执行文件,并对目标可执行文件进行验证,在目标可执行文件验证成功后将需要加载的数据段和代码段等加载到内存,若验证失败则拒绝加载;
3.操作系统内核读取目标可执行文件中指定的动态链接器,并对动态链接器进行验证,验证成功后将动态链接器加载到内存,若失败则拒绝加载,并释放加载的目标可执行程序;
4.操作系统内核将控制权交给动态链接器/加载器(通常为_start符号的地址);
5.动态链接器/加载器在动态库查找路径查找可执行文件依赖的动态库,并对劫持动态库和基础动态库进行验证,验证成功后将劫持动态库和基础动态库加载到内存,并进行必要的ELF(Executable and Linkable Format Relocation,可执行与可链接格式重定位)重定位等操作;若验证失败则拒绝加载,并释放加载的目标可执行程序和动态链接器,程序退出;
6.动态链接器/加载器将控制权交给目标可执行文件(通常为_start符号的地址),进而进入main函数;
7.目标可执行文件开始正常运行;
8.当目标可执行文件调用到劫持动态库时,劫持动态库会加载原始动态库,在劫持动态库加载原始动态库的过程,劫持动态库也需要对原始动态库进行验证,若验证失败,则程序退出,若验证成功,则劫持动态库将原始动态库加载至内存。
可见,通过上述步骤,通过在操作系统内核中添加了对目标可执行程序和动态链接器的验证机制,用以验证可靠安全的应用程序,在动态链接器添加对动态库的验证机制,用以验证可靠安全的动态库(如劫持动态库、基础动态库),在劫持动态库中添加验证机制,用以验证可靠安全的原始动态库,从操作系统内核到动态链接器,从动态链接器到劫持动态库,从劫持动态库到原始动态库多级验证的方式,通过“验证链”防止动态库被篡改或加载错误的动态库。
另外,还可以使租户无法自定义动态库查找路径,防止动态库逃逸。
基于上述方法实施例,本公开还提供了一种动态库的加载装置,参考图5,为本公开实施例提供的一种动态库的加载装置的结构示意图,所述装置包括:
接收模块501,用于接收针对目标可执行文件的加载请求,对所述目标可执行文件进行验证,如果所述目标可执行文件验证通过,则将所述目标可执行文件加载至内存中;
读取模块502,用于读取所述内存中所述目标可执行文件中的动态链接器,对所述动态链接器进行验证,如果所述动态链接器验证通过,则将所述动态链接器加载至内存中;
控制模块503,用于控制所述动态链接器在所述内存中启动;其中,所述动态链接器用于查找所述目标可执行文件对应的劫持动态库,并对所述劫持动态库进行验证,如果所述劫持动态库验证通过,则将所述劫持动态库加载至所述内存中,以及控制所述目标可执行文件在所述内存中启动,所述动态链接器用于拒绝加载原始动态库,所述原始动态库为所述目标可执行文件运行时所依赖的动态库,所述目标可执行文件用于调用所述劫持动态库对所述原始动态库进行验证,并在所述原始动态库验证通过时,调用所述劫持动态库将所述原始动态库加载至所述内存中。
一种可选的实施方式中,所述劫持动态库中包括所述目标可执行文件待调用的资源分配函数的接口符号值,所述目标可执行文件用于调用所述劫持动态库获取所述接口符号值,所述劫持动态库用于在所述资源分配函数对应的待分配资源量与所述目标可执行文件对应的容器的当前已使用资源量之和,未超出所述容器的预设资源限额时,基于所述接口符号值调用所述资源分配函数进行资源分配。
一种可选的实施方式中,所述劫持动态库中不包括所述目标可执行文件待调用的资源分配函数的接口符号值,所述目标可执行文件用于调用所述劫持动态库从所述原始动态库中获取所述资源分配函数的接口符号值,所述劫持动态库用于在所述资源分配函数对应的待分配资源量与所述目标可执行文件对应的容器的当前已使用资源量之和,未超出所述容器的预设资源限额时,基于所述接口符号值调用所述资源分配函数进行资源分配。
一种可选的实施方式中,所述接收模块501包括接收子模块和第一加载子模块;
所述接收子模块,用于接收针对目标可执行文件的加载请求,对所述目标可执行文件进行验证;
所述第一加载子模块,用于所述目标可执行文件验证通过时,将所述目标可执行文件加载至内存中;
一种可选的实施方式中,所述接收子模块具体用于:
接收针对目标可执行文件的加载请求,基于预设第一私钥对所述目标可执行文件预设的签名进行验证。
一种可选的实施方式中,所述读取模块502包括读取子模块和第二加载子模块;
所述读取子模块,用于读取所述内存中所述目标可执行文件中的动态链接器,对所述动态链接器进行验证;
所述第二加载子模块,用于所述动态链接器验证通过时,将所述动态链接器加载至内存中;
一种可选的实施方式中,所述读取子模块具体用于:
读取所述内存中所述目标可执行文件中的动态链接器,基于预设第二私钥对所述动态链接器预设的签名进行验证。
一种可选的实施方式中,所述动态链接器中设置有预设第三私钥,所述预设第三私钥用于对所述劫持动态库预设的签名进行验证。
一种可选的实施方式中,所述劫持动态库中设置有预设第四私钥,所述预设第四私钥用于对所述原始动态库预设的签名进行验证。
本公开实施例提供的动态库的加载装置中,接收针对目标可执行文件的加载请求,对目标可执行文件进行验证,如果目标可执行文件验证通过,则将目标可执行文件加载至内存中,读取内存中目标可执行文件中的动态链接器,对动态链接器进行验证,如果动态链接器验证通过,则将动态链接器加载至内存中,控制动态链接器在内存中启动;其中,动态链接器用于查找目标可执行文件对应的劫持动态库,并对劫持动态库进行验证,如果劫持动态库验证通过,则将劫持动态库加载至内存中,以及控制目标可执行文件在内存中启动,动态链接器用于拒绝加载原始动态库,原始动态库为目标可执行文件运行时所依赖的动态库,目标可执行文件用于调用劫持动态库对原始动态库进行验证,并在原始动态库验证通过时,调用劫持动态库将原始动态库加载至内存中。可见,本公开实施例从操作系统内核到动态链接器,从动态链接器到劫持动态库,从劫持动态库到原始动态库多级验证的方式,能够有效防止动态库逃逸。
除了上述方法和装置以外,本公开实施例还提供了一种计算机可读存储介质,计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备实现本公开实施例所述的动态库的加载方法。
本公开实施例还提供了一种计算机程序产品,所述计算机程序产品包括计算机程序/指令,所述计算机程序/指令被处理器执行时实现本公开实施例所述的动态库的加载方法。
另外,本公开实施例还提供了一种动态库的加载设备,参见图6所示,可以包括:
处理器601、存储器602、输入装置603和输出装置604。动态库的加载设备中的处理器601的数量可以一个或多个,图6中以一个处理器为例。在本公开的一些实施例中,处理器601、存储器602、输入装置603和输出装置604可通过总线或其它方式连接,其中,图6中以通过总线连接为例。
存储器602可用于存储软件程序以及模块,处理器601通过运行存储在存储器602的软件程序以及模块,从而执行动态库的加载设备的各种功能应用以及数据处理。存储器602可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序等。此外,存储器602可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。输入装置603可用于接收输入的数字或字符信息,以及产生与动态库的加载设备的用户设置以及功能控制有关的信号输入。
具体在本实施例中,处理器601会按照如下的指令,将一个或一个以上的应用程序的进程对应的可执行文件加载到存储器602中,并由处理器601来运行存储在存储器602中的应用程序,从而实现上述动态库的加载设备的各种功能。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
Claims (10)
1.一种动态库的加载方法,其特征在于,所述方法包括:
接收针对目标可执行文件的加载请求,对所述目标可执行文件进行验证,如果所述目标可执行文件验证通过,则将所述目标可执行文件加载至内存中;
读取所述内存中所述目标可执行文件中的动态链接器,对所述动态链接器进行验证,如果所述动态链接器验证通过,则将所述动态链接器加载至内存中;
控制所述动态链接器在所述内存中启动;其中,所述动态链接器用于查找所述目标可执行文件对应的劫持动态库,并对所述劫持动态库进行验证,如果所述劫持动态库验证通过,则将所述劫持动态库加载至所述内存中,以及控制所述目标可执行文件在所述内存中启动,所述动态链接器用于拒绝加载原始动态库,所述原始动态库为所述目标可执行文件运行时所依赖的动态库,所述目标可执行文件用于调用所述劫持动态库对所述原始动态库进行验证,并在所述原始动态库验证通过时,调用所述劫持动态库将所述原始动态库加载至所述内存中。
2.根据权利要求1所述的方法,其特征在于,所述劫持动态库中包括所述目标可执行文件待调用的资源分配函数的接口符号值,所述目标可执行文件用于调用所述劫持动态库获取所述接口符号值,所述劫持动态库用于在所述资源分配函数对应的待分配资源量与所述目标可执行文件对应的容器的当前已使用资源量之和,未超出所述容器的预设资源限额时,基于所述接口符号值调用所述资源分配函数进行资源分配。
3.根据权利要求1所述的方法,其特征在于,所述劫持动态库中不包括所述目标可执行文件待调用的资源分配函数的接口符号值,所述目标可执行文件用于调用所述劫持动态库从所述原始动态库中获取所述资源分配函数的接口符号值,所述劫持动态库用于在所述资源分配函数对应的待分配资源量与所述目标可执行文件对应的容器的当前已使用资源量之和,未超出所述容器的预设资源限额时,基于所述接口符号值调用所述资源分配函数进行资源分配。
4.根据权利要求1所述的方法,其特征在于,所述接收针对目标可执行文件的加载请求,对所述目标可执行文件进行验证,包括:
接收针对目标可执行文件的加载请求,基于预设第一私钥对所述目标可执行文件预设的签名进行验证。
5.根据权利要求1所述的方法,其特征在于,所述读取所述内存中所述目标可执行文件中的动态链接器,对所述动态链接器进行验证,包括:
读取所述内存中所述目标可执行文件中的动态链接器,基于预设第二私钥对所述动态链接器预设的签名进行验证。
6.根据权利要求1所述的方法,其特征在于,所述动态链接器中设置有预设第三私钥,所述预设第三私钥用于对所述劫持动态库预设的签名进行验证。
7.根据权利要求1所述的方法,其特征在于,所述劫持动态库中设置有预设第四私钥,所述预设第四私钥用于对所述原始动态库预设的签名进行验证。
8.一种动态库的加载装置,其特征在于,所述装置包括:
接收模块,用于接收针对目标可执行文件的加载请求,对所述目标可执行文件进行验证,如果所述目标可执行文件验证通过,则将所述目标可执行文件加载至内存中;
读取模块,用于读取所述内存中所述目标可执行文件中的动态链接器,对所述动态链接器进行验证,如果所述动态链接器验证通过,则将所述动态链接器加载至内存中;
控制模块,用于控制所述动态链接器在所述内存中启动;其中,所述动态链接器用于查找所述目标可执行文件对应的劫持动态库,并对所述劫持动态库进行验证,如果所述劫持动态库验证通过,则将所述劫持动态库加载至所述内存中,以及控制所述目标可执行文件在所述内存中启动,所述动态链接器用于拒绝加载原始动态库,所述原始动态库为所述目标可执行文件运行时所依赖的动态库,所述目标可执行文件用于调用所述劫持动态库对所述原始动态库进行验证,并在所述原始动态库验证通过时,调用所述劫持动态库将所述原始动态库加载至所述内存中。
9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质中存储有指令,当所述指令在终端设备上运行时,使得所述终端设备实现如权利要求1-7任一项所述的方法。
10.一种动态库的加载设备,其特征在于,包括:存储器,处理器,及存储在所述存储器上并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时,实现如权利要求1-7任一项所述的方法。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202410818652.XA CN118819667B (zh) | 2024-06-24 | 2024-06-24 | 一种动态库的加载方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| CN202410818652.XA CN118819667B (zh) | 2024-06-24 | 2024-06-24 | 一种动态库的加载方法、装置、设备及存储介质 |
Publications (2)
| Publication Number | Publication Date |
|---|---|
| CN118819667A CN118819667A (zh) | 2024-10-22 |
| CN118819667B true CN118819667B (zh) | 2025-10-28 |
Family
ID=93064277
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| CN202410818652.XA Active CN118819667B (zh) | 2024-06-24 | 2024-06-24 | 一种动态库的加载方法、装置、设备及存储介质 |
Country Status (1)
| Country | Link |
|---|---|
| CN (1) | CN118819667B (zh) |
Citations (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN1310395A (zh) * | 2000-02-24 | 2001-08-29 | 英业达股份有限公司 | 登记库的动态监控方法 |
| CN116679996A (zh) * | 2022-02-23 | 2023-09-01 | 青岛海尔科技有限公司 | 智能设备的动态库处理方法、装置、电子设备及存储介质 |
Family Cites Families (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| GB2407656B (en) * | 2003-10-28 | 2008-12-17 | Symbian Ltd | Mapping of dynamic link libraries in computing devices |
| KR101503785B1 (ko) * | 2013-10-10 | 2015-03-18 | (주)잉카엔트웍스 | 동적 라이브러리를 보호하는 방법 및 장치 |
-
2024
- 2024-06-24 CN CN202410818652.XA patent/CN118819667B/zh active Active
Patent Citations (2)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| CN1310395A (zh) * | 2000-02-24 | 2001-08-29 | 英业达股份有限公司 | 登记库的动态监控方法 |
| CN116679996A (zh) * | 2022-02-23 | 2023-09-01 | 青岛海尔科技有限公司 | 智能设备的动态库处理方法、装置、电子设备及存储介质 |
Also Published As
| Publication number | Publication date |
|---|---|
| CN118819667A (zh) | 2024-10-22 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US11221838B2 (en) | Hot update method, operating system, terminal device, system, and computer-readable storage medium for a system process | |
| US10019598B2 (en) | Dynamic service discovery | |
| US11159577B2 (en) | Method and apparatus for interworking of cloud platform and security tools | |
| CN108121594B (zh) | 一种进程管理方法及装置 | |
| US9413746B2 (en) | Extension point application and configuration of a login module | |
| US12086262B2 (en) | Secure container image builds | |
| EP1967981A1 (en) | Program execution control method, device, and execution control program | |
| US10360396B2 (en) | Token-based control of software installation and operation | |
| US9734311B1 (en) | Secure authentication of firmware configuration updates | |
| CN116150116B (zh) | 文件系统共享的方法、装置、电子设备及存储介质 | |
| US7647629B2 (en) | Hosted code runtime protection | |
| CN111159657A (zh) | 一种应用程序鉴权方法及系统 | |
| CN115509687A (zh) | 一种基于白名单的系统防御方法、装置、介质及电子设备 | |
| CN117940921A (zh) | 在容器中执行特权操作 | |
| CN118819667B (zh) | 一种动态库的加载方法、装置、设备及存储介质 | |
| CN111158771B (zh) | 处理方法、装置及计算机设备 | |
| CN108563472A (zh) | 基于多开应用的服务插件加载方法及装置 | |
| CN115935321A (zh) | 算法库的访问方法、装置及存储介质 | |
| WO2022179101A1 (zh) | 存储架构下的软件存储方法 | |
| CN115906046B (zh) | 可信计算系统及基于可信计算系统的度量方法 | |
| CN115544496A (zh) | 基于可信执行环境的无服务器计算方法、装置及设备 | |
| CN113127097A (zh) | 应用的启动方法、装置、设备和存储介质 | |
| CN117251842B (zh) | 电子设备的启动方法、电子设备及可读存储介质 | |
| CN118070293B (zh) | 数据中心服务器操作系统内核扩展管理系统及运行方法 | |
| US12547441B2 (en) | Protection of a process of setting up a subdirectory and a network interface for a container instance |
Legal Events
| Date | Code | Title | Description |
|---|---|---|---|
| PB01 | Publication | ||
| PB01 | Publication | ||
| SE01 | Entry into force of request for substantive examination | ||
| SE01 | Entry into force of request for substantive examination | ||
| GR01 | Patent grant | ||
| GR01 | Patent grant |