内存记账异常检测方法、装置、电子设备及存储介质与流程

文档序号:28168789发布日期:2021-12-24 23:09阅读:110来源:国知局
内存记账异常检测方法、装置、电子设备及存储介质与流程

1.本说明书一个或多个实施例涉及linux系统记账技术领域,尤其涉及一种内存记账异常检测方法、装置、电子设备及机器可读存储介质。


背景技术:

2.随着云原生时代的到来,越来越多用户开始使用容器;容器(container)是一种linux系统的内核虚拟化技术,可以用于隔离进程,以及可以为各个进程分配系统资源,如cpu、内存、磁盘i/o等。在实际应用中,通过内核功能cgroups(control groups,linux控制组),可以进行系统资源的记账、以及限制各个进程的资源使用量。
3.其中,memcg(memory control groups,linux内存控制组)是cgroups的子控制器之一,可以用于进行内存记账以及内存使用限制。在实际应用中,linux系统的内存管理机制很复杂,导致memcg进行内存记账的策略与实现也十分复杂。只有memcg针对各个容器进行公平公正、正确的内存记账,才能保障用户利益与云服务供应商的利益。


技术实现要素:

4.本技术提供一种内存记账异常检测方法,应用于搭载linux系统的终端设备;所述linux系统搭载了分别对应不同租户的相互隔离的若干容器,以及用于针对所述若干容器进行内存记账的linux内存控制组;所述方法包括:
5.扫描linux系统内核的llvm编译器的ir中间表示,识别针对待检测的目标容器的第一类函数集合与第二类函数集合;其中,所述第一类函数集合中包括若干与针对所述目标容器的内存申请操作相关的第一类函数;所述第二类函数集合中包括若干与针对所述目标容器的内存记账操作相关的第二类函数;
6.将所述第一类函数集合中的第一类函数依次确定为目标函数,并确定在所述第二类函数集合中是否存在与所述目标函数具有映射关系的第二类函数;
7.如果在所述第二类函数集合中不存在与所述目标函数具有映射关系的第二类函数,则确定linux内存控制组针对所述目标容器的内存记账操作存在异常。
8.可选的,所述方法还包括:
9.如果在所述第二类函数集合中存在与所述目标函数具有映射关系的第二类函数,则进一步确定在所述第二类函数集合中与所述目标函数具有映射关系的第二类函数的目标数量;
10.确定所述目标数量是否大于1;
11.如果所述目标数量大于1,则确定linux内存控制组针对所述目标容器的内存记账操作存在异常。
12.可选的,所述如果在所述第二类函数集合中不存在与所述目标函数具有映射关系的第二类函数,则确定linux内存控制组针对所述目标容器的内存记账操作存在异常,包括:
13.如果在所述第二类函数集合中不存在与所述目标函数具有映射关系的第二类函数,则进一步确定所述目标函数中携带的__gfp_account标志是否置位;
14.如果所述目标函数中携带的__gfp_account标志未置位,则确定linux内存控制组针对所述目标容器的内存记账操作存在异常。
15.可选的,所述第一类函数包括基本内存申请函数和所述基本内存申请函数的包装函数;所述第二类函数包括基本内存记账函数和所述基本内存记账函数的包装函数;
16.所述扫描linux系统内核的llvm编译器的ir中间表示,识别针对待检测的目标容器的第一类函数集合与第二类函数集合,包括:
17.扫描linux系统内核的llvm编译器的ir,生成所述linux系统内核的函数关系调用图;
18.基于针对所述目标容器的内存页分配操作,识别基本内存申请函数,以及基于针对所述linux内存控制组中的用于针对所述目标容器进行内存记账的页计数器的计数增加操作,识别基本记账函数;
19.基于所述函数关系调用图,递归识别所述基本内存申请函数的包装函数和所述基本内存记账函数的包装函数,并将所述基本内存申请函数和所述基本内存申请函数的包装函数,确定为针对所述目标容器的所述第一类函数集合,以及将所述基本内存记账函数和所述基本内存记账函数的包装函数,确定为针对所述目标容器的所述第二类函数集合。
20.本技术还提供另一种内存记账异常检测方法,应用于搭载linux系统的终端设备;所述linux系统搭载了分别对应不同租户的相互隔离的若干容器,以及用于针对所述若干容器进行内存记账的linux内存控制组;所述方法包括:
21.扫描linux系统内核的llvm编译器的ir,识别针对待检测的目标容器的第一类函数集合与第二类函数集合;其中,所述第一类函数集合中包括若干与针对所述目标容器的内存释放操作相关的第一类函数;所述第二类函数集合中包括若干与针对所述目标容器的内存清账操作相关的第二类函数;
22.将所述第一类函数集合中的第一类函数依次确定为目标函数,并确定在所述第二类函数集合中是否存在与所述目标函数具有映射关系的第二类函数;
23.如果在所述第二类函数集合中不存在与所述目标函数具有映射关系的第二类函数,则确定linux内存控制组针对所述目标容器的内存清账操作存在异常。
24.可选的,所述方法还包括:
25.如果在所述第二类函数集合中存在与所述目标函数具有映射关系的第二类函数,则进一步确定在所述第二类函数集合中与所述目标函数具有映射关系的第二类函数的目标数量;
26.确定所述目标数量是否大于1;
27.如果所述目标数量大于1,则确定linux内存控制组针对所述目标容器的内存清账操作存在异常。
28.可选的,所述第一类函数包括基本内存释放函数和所述基本内存释放函数的包装函数;所述第二类函数包括基本内存清账函数和所述基本内存清账函数的包装函数;
29.所述扫描linux系统内核的llvm编译器的ir,识别针对待检测的目标容器的第一类函数集合与第二类函数集合,包括:
30.扫描linux系统内核的llvm编译器的ir,生成所述linux系统内核的函数关系调用图;
31.基于针对所述目标容器的内存页释放操作,识别基本内存释放函数,以及基于针对所述linux内存控制组中的用于针对所述目标容器进行内存记账的页计数器的计数减少操作,识别基本清账函数;
32.基于所述函数关系调用图,递归识别所述基本内存释放函数的包装函数和所述基本内存清账函数的包装函数,并将所述基本内存释放函数和所述基本内存释放函数的包装函数,确定为针对所述目标容器的所述第一类函数集合,以及将所述基本内存清账函数和所述基本内存清账函数的包装函数,确定为针对所述目标容器的所述第二类函数集合。
33.本技术还提供一种内存记账异常检测装置,应用于搭载linux系统的终端设备;所述linux系统搭载了分别对应不同租户的相互隔离的若干容器,以及用于针对所述若干容器进行内存记账的linux内存控制组;所述装置包括:
34.识别单元,用于扫描linux系统内核的llvm编译器的ir中间表示,识别针对待检测的目标容器的第一类函数集合与第二类函数集合;其中,所述第一类函数集合中包括若干与针对所述目标容器的内存申请操作相关的第一类函数;所述第二类函数集合中包括若干与针对所述目标容器的内存记账操作相关的第二类函数;
35.映射单元,用于将所述第一类函数集合中的第一类函数依次确定为目标函数,并确定在所述第二类函数集合中是否存在与所述目标函数具有映射关系的第二类函数;
36.确定单元,用于如果在所述第二类函数集合中不存在与所述目标函数具有映射关系的第二类函数,则确定linux内存控制组针对所述目标容器的内存记账操作存在异常。
37.本技术还提供另一种内存记账异常检测装置,应用于搭载linux系统的终端设备;所述linux系统搭载了分别对应不同租户的相互隔离的若干容器,以及用于针对所述若干容器进行内存记账的linux内存控制组;所述装置包括:
38.识别单元,用于扫描linux系统内核的llvm编译器的ir,识别针对待检测的目标容器的第一类函数集合与第二类函数集合;其中,所述第一类函数集合中包括若干与针对所述目标容器的内存释放操作相关的第一类函数;所述第二类函数集合中包括若干与针对所述目标容器的内存清账操作相关的第二类函数;
39.映射单元,用于将所述第一类函数集合中的第一类函数依次确定为目标函数,并确定在所述第二类函数集合中是否存在与所述目标函数具有映射关系的第二类函数;
40.确定单元,用于如果在所述第二类函数集合中不存在与所述目标函数具有映射关系的第二类函数,则确定linux内存控制组针对所述目标容器的内存清账操作存在异常。
41.本技术还提供一种电子设备,包括通信接口、处理器、存储器和总线,所述通信接口、所述处理器和所述存储器之间通过总线相互连接;
42.所述存储器中存储机器可读指令,所述处理器通过调用所述机器可读指令,执行任一项上述方法。
43.本技术还提供一种机器可读存储介质,所述机器可读存储介质存储有机器可读指令,所述机器可读指令在被处理器调用和执行时,实现任一项上述方法。
44.通过以上实施例,通过扫描linux系统内核的llvm ir,可以先识别与针对目标容器的内存申请操作(或内存释放操作)相关的第一类函数集合、以及与针对所述目标容器的
内存记账操作(或内存清账操作)相关的第二类函数集合,再将所述第一类函数集合中的第一类函数依次确定为目标函数,根据在所述第二类函数集合中是否存在与所述目标函数具有映射关系的第二类函数,可以确定linux内存控制组针对所述目标容器的内存记账操作(或内存清账操作)是否存在异常;从而实现自动化分析linux内存控制组的内存记账的正确性,快速、准确地检测出潜在的内存记账漏洞,进而保证linux系统的安全,保障租户和云服务供应商的利益。
附图说明
45.图1是一示例性的实施例示出的一种内存记账异常检测方法的流程图;
46.图2是一示例性的实施例示出的另一种内存记账异常检测方法的流程图;
47.图3是一示例性的实施例示出的一种内存记账异常检测装置所在电子设备的结构示意图;
48.图4是一示例性的实施例示出的一种内存记账异常检测装置的框图;
49.图5是一示例性的实施例示出的另一种内存记账异常检测装置的框图。
具体实施方式
50.这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本说明书一个或多个实施例相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本说明书一个或多个实施例的一些方面相一致的装置和方法的例子。
51.需要说明的是:在其他实施例中并不一定按照本说明书示出和描述的顺序来执行相应方法的步骤。在一些其他实施例中,其方法所包括的步骤可以比本说明书所描述的更多或更少。此外,本说明书中所描述的单个步骤,在其他实施例中可能被分解为多个步骤进行描述;而本说明书中所描述的多个步骤,在其他实施例中也可能被合并为单个步骤进行描述。
52.为了使本技术领域的人员更好地理解本说明书实施例中的技术方案,下面先对本说明书实施例涉及的内存记账的相关技术,进行简要说明。
53.memcg(memory control groups,linux内存控制组),是cgroups(control groups,linux控制组)的子控制器之一,可以用于针对linux系统搭载的各个容器(container)进行内存记账以及内存使用限制。
54.memcg可以被广泛应用在各种基于linux系统的环境下;例如,memcg可以应用于数据中心、docker容器、openvz容器、无服务器架构计算(server

less computing)、移动终端设备上的内存监控应用等。
55.在实际应用中,linux系统的内存管理机制很复杂,导致memcg进行内存记账的策略与实现也十分复杂。
56.例如,在针对容器进行内存分配操作的位置,通常可以插入用于针对该容器进行内存记账操作的记账(charge)函数,相应地,在针对容器进行内存释放操作的位置,通常可以插入用于针对该容器进行内存清账操作的清账(uncharge)函数;然而,linux系统内核中
的内存申请操作与内存释放操作非常频繁,要在数以十万条计的与内存申请/释放函数相关的代码执行路径上,均插入记账/清账函数或调用记账/清账接口,显然难以毫无遗漏地、正确地实现相应的内存记账/清账操作。又例如,linux系统的内存管理接口之间存在着复杂的嵌套关系,如果在错误的位置插入记账/清账函数或调用记账/清账接口,就会导致内存记账/清账操作出现错漏问题。
57.实际上,内存记账的正确性不仅是保证linux系统安全的要求,也是保障租户利益与云服务供应商利益的关键指标。
58.一方面,如果内存记账过少,比如某些用户可以不被计费地申请并滥用系统内存,可能导致云服务供应商的利益受到损失;甚至有可能引发dos(denial of service,拒绝服务)攻击,导致系统内存资源被耗尽,无法正常地为用户提供服务。另一方面,如果内存记账过多,比如针对某个容器的同一次内存分配操作被多次记账,可能会导致与该容器对应的用户的利益受到损失。
59.目前,本领域并没有能够针对linux内存控制组的内存记账/清账操作的正确性进行自动化分析的相关工具。
60.有鉴于此,本说明书旨在提出一种针对linux内存控制组的静态分析工具,可以基于针对llvm ir的自动化分析,来检测linux内存控制组针对容器的内存记账异常的技术方案。
61.在实现时,可以扫描linux系统内核的llvm ir,识别针对待检测的目标容器的第一类函数集合与第二类函数集合;其中,上述第一类函数集合中包括若干与针对上述目标容器的内存申请操作(或内存释放操作)相关的第一类函数;上述第二类函数集合中包括若干与针对上述目标容器的内存记账操作(或内存清账操作)相关的第二类函数;进一步地,可以将上述第一类函数集合中的第一类函数依次确定为目标函数,并确定在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数;如果不存在,则可以确定linux内存控制组针对上述目标容器的内存记账操作(或内存清账操作)存在异常。
62.由此可见,在本说明书中的技术方案中,通过扫描linux系统内核的llvm ir,可以先识别与针对目标容器的内存申请操作(或内存释放操作)相关的第一类函数集合、以及与针对上述目标容器的内存记账操作(或内存清账操作)相关的第二类函数集合,再将上述第一类函数集合中的第一类函数依次确定为目标函数,根据在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数,可以确定linux内存控制组针对上述目标容器的内存记账操作(或内存清账操作)是否存在异常;从而实现自动化分析linux内存控制组的内存记账的正确性,快速、准确地检测出潜在的内存记账漏洞,进而保证linux系统的安全,保障租户和云服务供应商的利益。
63.下面以第一类函数包括与针对容器的内存申请操作相关的函数、且第二类函数包括与针对容器的内存记账操作相关的函数为例,结合具体的应用场景对本技术进行描述。
64.请参见图1,图1是一示例性的实施例示出的一种内存记账异常检测方法的流程图。上述方法可以应用于搭载linux系统的终端设备;上述linux系统搭载了分别对应不同租户的、相互隔离的若干容器,以及用于针对上述若干容器进行内存记账的linux内存控制组;上述方法执行以下步骤:
65.步骤102:扫描linux系统内核的llvm ir,识别针对待检测的目标容器的第一类函
数集合与第二类函数集合;其中,上述第一类函数集合中包括若干与针对上述目标容器的内存申请操作相关的第一类函数;上述第二类函数集合中包括若干与针对上述目标容器的内存记账操作相关的第二类函数;
66.步骤104:将上述第一类函数集合中的第一类函数依次确定为目标函数,并确定在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数;
67.步骤106:如果不存在,则确定linux内存控制组针对上述目标容器的内存记账操作存在异常。
68.在本说明书中,上述终端设备,可以包括搭载有linux系统的一台服务器、或由多台服务器形成的服务器集群,也可以包括搭载有linux系统的客户端侧网络设备,本说明书不做特别限制。
69.例如,上述终端设备具体可以包括搭载有内存记账异常检测程序或linux内存控制组分析工具的网络设备。
70.在本说明书中,可以扫描linux系统内核的llvm ir,识别针对待检测的目标容器的第一类函数集合与第二类函数集合;其中,上述第一类函数集合中可以包括若干与针对上述目标容器的内存申请操作相关的第一类函数;上述第二类函数集合中可以包括若干与针对上述目标容器的内存记账操作相关的第二类函数。
71.其中,上述llvm ir(llvm intermediate representation,llvm编译器的中间表示),是一种与源编程语言和目标机器架构无关的中间语言代码;llvm ir通常有三种表现形式,分别为:内存中的编译中间语言、磁盘中的二进制代码和可读汇编文本,上述llvm ir的三种形式实质上是等价的,本说明书不做特殊限制。
72.在实际应用中,基于llvm ir识别上述第一类函数集合与上述第二类函数集合,可以分别确定针对上述目标容器的全部内存申请操作以及全部内存记账操作在相应的代码执行路径上的位置;也即,可以快速、准确地定位linux内核中所有具有内存申请功能以及内存记账功能的接口,并作为后续分析内存申请接口与内存记账接口之间的映射关系、以及检测内存记账是否存在异常的基础。
73.例如,搭载在终端设备上的分析工具可以扫描linux系统内核的llvm ir,并识别与针对目标容器的内存申请操作相关的第一类函数集合、以及与针对上述目标容器的内存记账操作相关的第二类函数集合。
74.需要说明的是,在本说明书示出的各个实施例中,上述“第一类函数”、“第二类函数”仅仅是一种用于区分内存申请/释放函数与内存记账/清账函数的描述,并不代表对本说明书做出特殊限制。
75.在示出的一种实施方式中,上述第一类函数,可以包括基本内存申请函数和上述基本内存申请函数的包装函数(wrapper functions);其中,上述基本内存申请函数,可以包括用于针对容器进行内存页分配操作的函数;上述基本内存申请函数的包装函数,可以包括调用上述基本内存申请函数的函数。上述第二类函数,可以包括基本内存记账函数和上述基本内存记账函数的包装函数;其中,上述基本内存记账函数,可以包括用于针对linux内存控制组提供的页计数器(counter)进行计数增加操作的函数,上述页计数器可以用于针对容器进行内存记账;上述基本内存记账函数的包装函数,可以包括调用上述基本内存记账函数的函数。
76.在实现时,上述扫描linux系统内核的llvm ir,识别针对上述目标容器的第一类函数集合与第二类函数集合的过程,具体可以包括:扫描linux系统内核的llvm ir,生成上述linux系统内核的函数关系调用图(interactive map of linux kernel);基于针对上述目标容器的内存页分配操作,识别基本内存申请函数,以及,基于针对上述linux内存控制组中的用于针对上述目标容器进行内存记账的页计数器的计数增加操作,识别基本记账函数;基于上述函数关系调用图,递归识别上述基本内存申请函数的包装函数以及上述基本内存记账函数的包装函数;将上述基本内存申请函数和上述基本内存申请函数的包装函数,确定为针对上述目标容器的上述第一类函数集合,以及,将上述基本内存记账函数和上述基本内存记账函数的包装函数,确定为针对上述目标容器的上述第二类函数集合。
77.例如,可以扫描linux系统内核的llvm ir,并生成对应的函数关系调用图;基于针对目标容器的内存页分配操作,可以识别出基本内存申请函数a(如__alloc_pages函数等),以及,基于针对linux内存控制组中的用于针对上述目标容器进行内存记账的页计数器的计数增加操作,可以识别出基本记账函数b(如charge函数等);进一步地,假设函数c调用了基本内存申请函数a,函数d调用了基本记账函数b,那么基于生成的函数关系调用图,可以递归识别出基本内存申请函数a的包装函数c、以及基本内存记账函数b的包装函数d;因此,可以确定针对上述目标容器的第一类函数集合中包括基本内存申请函数a和对应的包装函数c,针对上述目标容器的上述第二类函数集合中包括基本记账函数b和对应的包装函数d。
78.需要说明的是,linux系统的内存管理机制中,通常可以将每个物理内存节点(node)划分为多个内存管理区域(zone),用于表示不同范围的内存,内核可以使用不同的映射方式映射物理内存;进一步地,可以将内存分为多个页帧(page frame,也可以称作页框、物理页),每个页帧可以包含一个页(page);因此,linux内核通常可以将内存页(page)作为内存管理的基本单位。
79.另外,需要说明的是,在以上示出的实施方式中,关于上述第一类函数集合中可以包括的基本内存申请函数和基本内存申请函数的包装函数的数量、以及上述第二类函数集合中可以包括的基本记账函数和基本记账函数的包装函数的数量,仅仅是一种示例性的描述,并不对本说明书做限制;在实际应用中,上述第一类函数集合以及上述第二类函数集合中可以包括更多数量的基本内存申请函数、基本记账函数、或相应的包装函数。另外,关于生成上述函数关系调用图的具体实现方式,请参见相关技术,在此不再赘述。
80.在本说明书中,在识别出与针对上述目标容器的内存申请操作相关的第一类函数集合、以及与针对上述目标容器的内存记账操作相关的第二类函数集合之后,可以将上述第一类函数集合中的第一类函数依次确定为目标函数,并确定在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数。
81.在实际应用中,上述第一类函数与上述第二类函数之间具有映射关系,可以理解为,响应于调用上述第一类函数为上述目标容器分配内存页,可以调用上述第二类函数针对为上述目标容器分配的上述内存页进行内存记账操作。
82.例如,在识别出针对目标容器的第一类函数集合与第二类函数集合之后,可以将上述第一类函数集合中的第一类函数依次确定为目标函数,并确定在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数,也即,确定上述第二类函数集合
中是否存在可以针对调用上述目标函数为上述目标容器分配的内存页进行内存记账操作的第二类函数。
83.接着以上示例继续举例,在识别出针对上述目标容器的第一类函数集合中包括基本内存申请函数a和对应的包装函数c,以及针对上述目标容器的上述第二类函数集合中包括基本记账函数b和对应的包装函数d之后,可以先将上述第一类函数集合中的基本内存申请函数a确定为目标函数,并确定在上述第二类函数集合中包括的函数b、函数d与目标函数a之间是否具有映射关系;类似地,可以继续将上述第一类函数集合中的包装函数c确定为目标函数,并确定在上述第二类函数集合中包括的函数b、函数d是否与目标函数c之间是否具有映射关系。
84.需要说明的是,在以上示出的实施方式中,在识别出上述第一类函数集合与上述第二类函数集合的基础上,可以基于来源认知技术,先对调用上述目标函数为上述目标容器分配的内存页进行标记,再针对被标记的上述内存页,沿调用链向上递归进行过程间的数据流分析,来准确地分析上述第一类函数与上述第二类函数之间的映射关系,从而解决linux内核中复杂的函数调用关系以及接口嵌套问题。
85.在本说明书中,如果在上述第二类函数集合中不存在与上述目标函数具有映射关系的第二类函数,则可以确定linux内存控制组针对上述目标容器的内存记账操作存在异常;否则,确定linux内存控制组针对上述目标容器的内存记账操作不存在异常。
86.在实际应用中,如果上述第一类函数与上述第二类函数之间没有映射关系,可以认为,响应于调用上述第一类函数为上述目标容器分配内存页,没有调用上述第二类函数针对为上述目标容器分配的上述内存页进行内存记账操作;也即,可以检测出linux内存控制组针对上述目标容器的内存记账存在记账遗漏问题。
87.例如,将上述第一类函数集合中的第一类函数确定为目标函数之后,如果在上述第二类函数集合中不存在与上述目标函数具有映射关系的第二类函数,则可以确定linux内存控制组针对目标容器的内存记账操作存在异常,可能存在内存记账遗漏问题。
88.需要说明的是,进一步地,针对基于上述分析工具自动检测得到的内存记账操作可能存在异常的位置,本领域技术人员还可以通过人工分析,确定上述内存记账异常是否为会被syscall真实触发的记账错漏问题,还可以分析上述记账错漏问题对linux系统安全的危害程度,本说明书不做限制。
89.例如,通过上述内存记账异常检测方法,检测到在bpf程序载入内核时会进行内存分配操作,但是不会进行内存记账操作,可以确定memcg存在内存记账遗漏问题;由此可见,如果恶意容器重复载入bpf程序,就可以在不触发memcg针对该容器的内存使用限制的同时,耗尽linux系统的内存资源,进而引发整个系统的dos攻击。
90.在示出的一种实施方式中,除了可以检测内存记账遗漏问题,还可以根据与同一第一类函数具有映射关系的第二类函数的数量,检测内存记账重复问题,从而检测出更多潜在的内存记账异常,更好地保证linux系统的安全,保障租户和云服务供应商的利益。在实现时,上述方法还可以包括:如果在上述第二类函数集合中存在与上述目标函数具有映射关系的第二类函数,则进一步确定在上述第二类函数集合中与上述目标函数具有映射关系的第二类函数的目标数量;进一步地,可以确定上述目标数量是否大于预设阈值;如果大于上述预设阈值,则确定linux内存控制组针对上述目标容器的内存记账操作存在异常;如
果不大于上述预设阈值,确定linux内存控制组针对上述目标容器的内存记账操作不存在异常。
91.在实际应用中,上述与目标函数具有映射关系的第二类函数的目标数量,可以理解为,响应于调用上述目标函数为上述目标容器分配内存页,linux内存组调用上述第二类函数以针对上述内存页进行内存记账操作的次数。
92.另外,在实际应用中,上述预设阈值通常可以设置为1,也即,为了保证内存记账的公平公正,同时兼顾云服务提供商与用户的利益,针对一次内存页分配操作应当只执行一次内存记账操作。由此可见,如果上述目标数量大于1,可以认为linux内存组针对同一内存页进行了多次内存记账操作,存在内存记账重复问题。
93.例如,如果在上述第二类函数集合中存在与上述目标函数具有映射关系的第二类函数,则可以确定在上述第二类函数集合中与上述目标函数具有映射关系的第二类函数的目标数量;当上述预设阈值为1时,如果上述目标数量为2,则可以认为linux内存组针对调用上述目标函数为上述目标容器分配同一内存页进行了2次内存记账操作,也即,可能存在内存记账重复问题。
94.在示出的另一种实施方式中,针对容器进行内存记账操作,除了可以在针对容器进行内存分配操作的位置插入记账函数或调用记账接口,还可以依赖于传入内存申请函数的gfp(get free page)标志;具体地,当且仅当上述第一类函数中携带的__gfp_account标志置位时,上述第一类函数可以执行内存记账功能。
95.在实现时,上述如果在上述第二类函数集合中不存在与上述目标函数具有映射关系的第二类函数,则可以确定linux内存控制组针对上述目标容器的内存记账操作存在异常的过程,具体可以包括:如果在上述第二类函数集合中不存在与上述目标函数具有映射关系的第二类函数,则进一步确定上述目标函数中携带的__gfp_account标志是否置位;如果未置位,则确定linux内存控制组针对上述目标容器的内存记账操作存在异常;如果置位,则确定linux内存控制组针对上述目标容器的内存记账操作不存在异常。
96.由此可见,如果上述第一类函数与上述第二类函数之间没有映射关系,且上述第一类函数中携带的__gfp_account标志已置位,可以认为linux内存组已针对调用上述第一类函数为上述目标容器分配的内存页进行内存记账操作,不存在内存记账遗漏问题,从而提高内存记账异常检测的精确度。需要说明的是,关于上述__gfp_account标志是否置位的具体表现形式,本领域技术人员可以自行设置,本说明书不做限制;例如,可以设置上述__gfp_account标志置位时为1,未置位时为0。
97.例如,如果在上述第二类函数集合中不存在与上述目标函数具有映射关系的第二类函数,则可以进一步针对传入上述目标函数中的gfp标志进行溯源,并检查其源数据中的__gfp_account标志是否为1;如果为1,则可以确定linux内存控制组针对上述目标容器的内存记账操作不存在异常;如果为0,则可能存在内存记账遗漏问题。
98.需要说明的是,相较于llvm提供的标准值追踪(value tracking)分析,在以上示出的实施方式中,可以采用上下文敏感(context

sensitive)的过程间分析(inter

procedural analysis),从而提高分析精度;同时,由于仅针对上述记账标志(即__gfp_account标志)进行分析,因而可以保留较低的性能开销。
99.通过以上技术方案可知,通过扫描linux系统内核的llvm ir,可以先识别与针对
目标容器的内存申请操作相关的第一类函数集合、以及与针对上述目标容器的内存记账操作相关的第二类函数集合,再将上述第一类函数集合中的第一类函数依次确定为目标函数,根据在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数,可以确定linux内存控制组针对上述目标容器的内存记账操作是否存在异常;从而实现自动化分析linux内存控制组的内存记账的正确性,快速、准确地检测出潜在的内存记账漏洞,进而保证linux系统的安全,保障租户和云服务供应商的利益。
100.下面以第一类函数包括与针对容器的内存释放操作相关的函数、且第二类函数包括与针对容器的内存清账操作相关的函数为例,结合具体的应用场景对本技术进行描述。
101.请参见图2,图2是一示例性的实施例示出的另一种内存记账异常检测方法的流程图。上述方法可以应用于搭载linux系统的终端设备;上述linux系统搭载了分别对应不同租户的、相互隔离的若干容器,以及用于针对上述若干容器进行内存记账的linux内存控制组;上述方法执行以下步骤:
102.步骤202:扫描linux系统内核的llvm ir,识别针对待检测的目标容器的第一类函数集合与第二类函数集合;其中,上述第一类函数集合中包括若干与针对上述目标容器的内存释放操作相关的第一类函数;上述第二类函数集合中包括若干与针对上述目标容器的内存清账操作相关的第二类函数;
103.步骤204:将上述第一类函数集合中的第一类函数依次确定为目标函数,并确定在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数;
104.步骤206:如果不存在,则确定linux内存控制组针对上述目标容器的内存清账操作存在异常。
105.在本说明书中,可以扫描linux系统内核的llvm ir,识别针对待检测的目标容器的第一类函数集合与第二类函数集合;其中,上述第一类函数集合中可以包括若干与针对上述目标容器的内存释放操作相关的第一类函数;上述第二类函数集合中可以包括若干与针对上述目标容器的内存清账操作相关的第二类函数。
106.在实际应用中,基于llvm ir识别上述第一类函数集合与上述第二类函数集合,可以分别确定针对上述目标容器的全部内存释放操作以及全部内存清账操作在相应的代码执行路径上的位置;也即,可以快速、准确地定位linux内核中所有具有内存释放功能以及内存清账功能的接口,并作为后续分析内存释放接口与内存清账接口之间的映射关系、以及检测内存清账操作是否存在异常的基础。
107.例如,搭载在终端设备上的分析工具可以扫描linux系统内核的llvm ir,并识别与针对目标容器的内存释放操作相关的第一类函数集合、以及与针对上述目标容器的内存清账操作相关的第二类函数集合。
108.在示出的一种实施方式中,上述第一类函数,可以包括基本内存释放函数和上述基本内存释放函数的包装函数;其中,上述基本内存释放函数,可以包括用于针对容器进行内存页释放操作的函数;上述基本内存释放函数的包装函数,可以包括调用上述基本内存释放函数的函数。上述第二类函数,可以包括基本内存清账函数和上述基本内存清账函数的包装函数;其中,上述基本内存清账函数,可以包括用于针对linux内存控制组提供的页计数器进行计数减少操作的函数,上述页计数器可以用于针对容器进行内存记账;上述基本内存清账函数的包装函数,可以包括调用上述基本内存清账函数的函数。
109.在实现时,上述扫描linux系统内核的llvm ir,识别针对上述目标容器的第一类函数集合与第二类函数集合的过程,具体可以包括:扫描linux系统内核的llvm ir,生成上述linux系统内核的函数关系调用图;基于针对上述目标容器的内存页释放操作,识别基本内存释放函数,以及,基于针对上述linux内存控制组中的用于针对上述目标容器进行内存清账的页计数器的计数减少操作,识别基本清账函数;基于上述函数关系调用图,递归识别上述基本内存释放函数的包装函数以及上述基本内存清账函数的包装函数;将上述基本内存释放函数和上述基本内存释放函数的包装函数,确定为针对上述目标容器的上述第一类函数集合,以及,将上述基本内存清账函数和上述基本内存清账函数的包装函数,确定为针对上述目标容器的上述第二类函数集合。
110.例如,可以扫描linux系统内核的llvm ir,并生成对应的函数关系调用图;基于针对目标容器的内存页释放操作,可以识别出基本内存释放函数e(如__free_pages函数等),以及,基于针对linux内存控制组中的用于针对上述目标容器进行内存清账的页计数器的计数增加操作,可以识别出基本清账函数f(如uncharge函数等);进一步地,假设函数g调用了基本内存释放函数e,函数h调用了基本清账函数f,那么基于生成的函数关系调用图,可以递归识别出基本内存释放函数e的包装函数g、以及基本内存清账函数f的包装函数h;因此,可以确定针对上述目标容器的第一类函数集合中包括基本内存释放函数e和对应的包装函数g,针对上述目标容器的上述第二类函数集合中包括基本清账函数f和对应的包装函数h。
111.另外,需要说明的是,在以上示出的实施方式中,关于上述第一类函数集合中可以包括的基本内存释放函数和基本内存释放函数的包装函数的数量、以及上述第二类函数集合中可以包括的基本清账函数和基本清账函数的包装函数的数量,仅仅是一种示例性的描述,并不对本说明书做限制;在实际应用中,上述第一类函数集合以及上述第二类函数集合中可以包括更多数量的基本内存释放函数、基本清账函数、或相应的包装函数。
112.在本说明书中,在识别出与针对上述目标容器的内存释放操作相关的第一类函数集合、以及与针对上述目标容器的内存清账操作相关的第二类函数集合之后,可以将上述第一类函数集合中的第一类函数依次确定为目标函数,并确定在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数。
113.在实际应用中,上述第一类函数与上述第二类函数之间具有映射关系,可以理解为,响应于调用上述第一类函数为上述目标容器释放内存页,可以调用上述第二类函数针对为上述目标容器释放的上述内存页进行内存清账操作。
114.例如,在识别出针对目标容器的第一类函数集合与第二类函数集合之后,可以将上述第一类函数集合中的第一类函数依次确定为目标函数,并确定在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数,也即,确定上述第二类函数集合中是否存在可以针对调用上述目标函数为上述目标容器释放的内存页进行内存清账操作的第二类函数。
115.接着以上示例继续举例,在识别出针对上述目标容器的第一类函数集合中包括基本内存释放函数e和对应的包装函数g,以及针对上述目标容器的上述第二类函数集合中包括基本清账函数f和对应的包装函数h之后,可以先将上述第一类函数集合中的基本内存释放函数e确定为目标函数,并确定在上述第二类函数集合中包括的函数f、函数h与目标函数
e之间是否具有映射关系;类似地,可以继续将上述第一类函数集合中的包装函数g确定为目标函数,并确定在上述第二类函数集合中包括的函数f、函数h是否与目标函数g之间是否具有映射关系。
116.在本说明书中,如果在上述第二类函数集合中不存在与上述目标函数具有映射关系的第二类函数,则可以确定linux内存控制组针对上述目标容器的内存清账操作存在异常;否则,确定linux内存控制组针对上述目标容器的内存清账操作不存在异常。
117.在实际应用中,如果上述第一类函数与上述第二类函数之间没有映射关系,可以认为,响应于调用上述第一类函数为上述目标容器释放内存页,没有调用上述第二类函数针对为上述目标容器释放的上述内存页进行内存清账操作;也即,可以检测出linux内存控制组针对上述目标容器的内存清账存在清账遗漏问题。
118.例如,将上述第一类函数集合中的第一类函数确定为目标函数之后,如果在上述第二类函数集合中不存在与上述目标函数具有映射关系的第二类函数,则可以确定linux内存控制组针对目标容器的内存清账操作存在异常,可能存在内存清账遗漏问题。
119.在示出的一种实施方式中,除了可以检测内存清账遗漏问题,还可以根据与同一第一类函数具有映射关系的第二类函数的数量,检测内存清账重复问题,从而检测出更多潜在的内存清账异常,更好地保证linux系统的安全,保障租户和云服务供应商的利益。在实现时,上述方法还可以包括:如果在上述第二类函数集合中存在与上述目标函数具有映射关系的第二类函数,则进一步确定在上述第二类函数集合中与上述目标函数具有映射关系的第二类函数的目标数量;进一步地,可以确定上述目标数量是否大于1;如果大于1,则确定linux内存控制组针对上述目标容器的内存清账操作存在异常;如果不大于1,确定linux内存控制组针对上述目标容器的内存清账操作不存在异常。
120.在实际应用中,上述与目标函数具有映射关系的第二类函数的目标数量,可以理解为,响应于调用上述目标函数为上述目标容器释放内存页,linux内存组调用上述第二类函数以针对上述内存页进行内存清账操作的次数。由此可见,如果上述目标数量大于1,可以认为linux内存组针对同一内存页进行了多次内存清账操作,存在内存清账重复问题。
121.例如,如果在上述第二类函数集合中存在与上述目标函数具有映射关系的第二类函数,则可以确定在上述第二类函数集合中与上述目标函数具有映射关系的第二类函数的目标数量;如果上述目标数量为2,则可以认为linux内存组针对调用上述目标函数为上述目标容器释放同一内存页进行了2次内存清账操作,也即,可能存在内存清账重复问题。
122.通过以上技术方案可知,通过扫描linux系统内核的llvm ir,可以先识别与针对目标容器的内存释放操作相关的第一类函数集合、以及与针对上述目标容器的内存清账操作相关的第二类函数集合,再将上述第一类函数集合中的第一类函数依次确定为目标函数,根据在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数,可以确定linux内存控制组针对上述目标容器的内存清账操作是否存在异常;从而实现自动化分析linux内存控制组的内存清账的正确性,快速、准确地检测出潜在的内存清账漏洞,进而保证linux系统的安全,保障租户和云服务供应商的利益。
123.由此可见,在本说明书请求保护的技术方案中,在识别出linux内核中的所有具有内存申请/释放功能的接口、以及具有内存记账/清账功能的接口(也即识别出上述第一类函数集合与上述第二类函数集合)的基础上,针对不同类型的内存记账异常,定制相应的检
测策略,就可以通过分析上述两类接口之间的映射关系,确定linux内存控制组是否正常实现了内存记账功能。
124.与上述内存记账异常检测方法的实施例对应的,本说明书还提供了一种内存记账异常检测装置的实施例。
125.请参见图3,图3是一示例性的实施例示出的一种内存记账异常检测装置所在电子设备的硬件结构图。在硬件层面,该设备包括处理器302、内部总线304、网络接口306、内存308以及非易失性存储器310,当然还可能包括其他业务所需要的硬件。本说明书一个或多个实施例可以基于软件方式来实现,比如由处理器302从非易失性存储器310中读取对应的计算机程序到内存308中然后运行。当然,除了软件实现方式之外,本说明书一个或多个实施例并不排除其他实现方式,比如逻辑器件抑或软硬件结合的方式等等,也就是说以下处理流程的执行主体并不限定于各个逻辑单元,也可以是硬件或逻辑器件。
126.请参见图4,图4是一示例性的实施例示出的一种内存记账异常检测装置的框图。该内存记账异常检测装置可以应用于如图3所示的电子设备中,以实现本说明书的技术方案。其中,上述内存记账异常检测装置可以包括:
127.识别单元402,用于扫描linux系统内核的llvm编译器的ir中间表示,识别针对待检测的目标容器的第一类函数集合与第二类函数集合;其中,上述第一类函数集合中包括若干与针对上述目标容器的内存申请操作相关的第一类函数;上述第二类函数集合中包括若干与针对上述目标容器的内存记账操作相关的第二类函数;
128.映射单元404,用于将上述第一类函数集合中的第一类函数依次确定为目标函数,并确定在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数;
129.确定单元406,用于如果在上述第二类函数集合中不存在与上述目标函数具有映射关系的第二类函数,则确定linux内存控制组针对上述目标容器的内存记账操作存在异常。
130.在本实施例中,上述确定单元406,还用于:
131.如果在上述第二类函数集合中存在与上述目标函数具有映射关系的第二类函数,则进一步确定在上述第二类函数集合中与上述目标函数具有映射关系的第二类函数的目标数量;
132.确定上述目标数量是否大于1;
133.如果上述目标数量大于1,则确定linux内存控制组针对上述目标容器的内存记账操作存在异常。
134.在本实施例中,上述确定单元406,具体用于:
135.如果在上述第二类函数集合中不存在与上述目标函数具有映射关系的第二类函数,则进一步确定上述目标函数中携带的__gfp_account标志是否置位;
136.如果上述目标函数中携带的__gfp_account标志未置位,则确定linux内存控制组针对上述目标容器的内存记账操作存在异常。
137.在本实施例中,上述第一类函数包括基本内存申请函数和上述基本内存申请函数的包装函数;上述第二类函数包括基本内存记账函数和上述基本内存记账函数的包装函数;
138.上述识别单元402,具体用于:
139.扫描linux系统内核的llvm编译器的ir,生成上述linux系统内核的函数关系调用图;
140.基于针对上述目标容器的内存页分配操作,识别基本内存申请函数,以及基于针对上述linux内存控制组中的用于针对上述目标容器进行内存记账的页计数器的计数增加操作,识别基本记账函数;
141.基于上述函数关系调用图,递归识别上述基本内存申请函数的包装函数和上述基本内存记账函数的包装函数,并将上述基本内存申请函数和上述基本内存申请函数的包装函数,确定为针对上述目标容器的上述第一类函数集合,以及将上述基本内存记账函数和上述基本内存记账函数的包装函数,确定为针对上述目标容器的上述第二类函数集合。
142.请参见图5,图5是一示例性的实施例示出的另一种内存记账异常检测装置的框图。该内存记账异常检测装置可以应用于如图3所示的电子设备中,以实现本说明书的技术方案。
143.其中,上述内存记账异常检测装置可以包括:
144.识别单元502,用于扫描linux系统内核的llvm编译器的ir,识别针对待检测的目标容器的第一类函数集合与第二类函数集合;其中,上述第一类函数集合中包括若干与针对上述目标容器的内存释放操作相关的第一类函数;上述第二类函数集合中包括若干与针对上述目标容器的内存清账操作相关的第二类函数;
145.映射单元504,用于将上述第一类函数集合中的第一类函数依次确定为目标函数,并确定在上述第二类函数集合中是否存在与上述目标函数具有映射关系的第二类函数;
146.确定单元506,用于如果在上述第二类函数集合中不存在与上述目标函数具有映射关系的第二类函数,则确定linux内存控制组针对上述目标容器的内存清账操作存在异常。
147.在本实施例中,上述确定单元506,还用于:
148.如果在上述第二类函数集合中存在与上述目标函数具有映射关系的第二类函数,则进一步确定在上述第二类函数集合中与上述目标函数具有映射关系的第二类函数的目标数量;
149.确定上述目标数量是否大于1;
150.如果上述目标数量大于1,则确定linux内存控制组针对上述目标容器的内存清账操作存在异常。
151.在本实施例中,上述第一类函数包括基本内存释放函数和上述基本内存释放函数的包装函数;上述第二类函数包括基本内存清账函数和上述基本内存清账函数的包装函数;
152.上述识别单元502,具体用于:
153.扫描linux系统内核的llvm编译器的ir,生成上述linux系统内核的函数关系调用图;
154.基于针对上述目标容器的内存页释放操作,识别基本内存释放函数,以及基于针对上述linux内存控制组中的用于针对上述目标容器进行内存记账的页计数器的计数减少操作,识别基本清账函数;
155.基于上述函数关系调用图,递归识别上述基本内存释放函数的包装函数和上述基
本内存清账函数的包装函数,并将上述基本内存释放函数和上述基本内存释放函数的包装函数,确定为针对上述目标容器的上述第一类函数集合,以及将上述基本内存清账函数和上述基本内存清账函数的包装函数,确定为针对上述目标容器的上述第二类函数集合。
156.上述装置中各个单元的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
157.对于装置实施例而言,由于其基本对应于方法实施例,所以相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例只是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本说明书方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
158.上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
159.在一个典型的配置中,计算机包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。
160.内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flash ram)。内存是计算机可读介质的示例。
161.计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd

rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带、磁盘存储、量子存储器、基于石墨烯的存储介质或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
162.还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
163.上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可
以的或者可能是有利的。
164.在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
165.应当理解,尽管在本说明书一个或多个实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”。
166.以上所述仅为本说明书一个或多个实施例的较佳实施例而已,并不用以限制本说明书一个或多个实施例,凡在本说明书一个或多个实施例的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本说明书一个或多个实施例保护的范围之内。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1