一种基于代码嵌入和聚类的PyPI恶意软件包检测方法

未命名 09-12 阅读:57 评论:0

一种基于代码嵌入和聚类的pypi恶意软件包检测方法
技术领域
1.本发明属于计算机技术领域,涉及一种基于代码嵌入和聚类的pypi软件仓库中恶意软件包检测方法。


背景技术:

2.作为最流行的程序设计语言,python由于其简洁、多功能、易用的特性,近年来得到了广泛的应用。python拥有一个庞大而活跃的开发者社区,大量的软件包促进了广泛工程的参与。软件仓库已经在现代软件开发过程中扮演了至关重要的角色,使得开发者能够毫不费力地下载并重用所需要的第三方代码,从而大大提升了开发效率。python软件包索引(pypi)是python的官方第三方软件包仓库,总共为相关软件开发人员提供了超过45万个第三方软件包。pypi开源社区为开发者提供了一个便捷的平台来发布自己的软件包,允许用户从中轻松地下载并重用软件包。然而,这种开放性使得pypi暴露于严重的恶意软件威胁之下。例如,攻击者上传的恶意软件包将通过软件供应链迅速扩散到下游工程当中,对无数用户造成严重的损害。根据sonatype的在2022年的”open source supply,demand,and security”报告,针对软件供应链攻击的数量在过去三年内激增了742%。为了在恶意软件包造成严重的后果之前阻止其传播,因此,亟需一种恶意软件包检测工具,来迅速且准确地检测pypi中新上传的软件包。
3.当前针对软件供应链的恶意软件包检测方法主要有malware checks,application-inspector,buildwatch和maloss等。这些方法通过对包的代码、元数据和动态行为应用各种分析技术来识别恶意包。这些现有的分析手段依赖于显式的检测知识,包括安全敏感函数(例如,source污点,sink点和危险的方法),恶意代码模式和行为模式。然而,获取显式的检测知识是十分昂贵的任务,研究者主要是通过人工分析来检测已知的恶意软件来收集所需的知识。更重要的是,这种需要知识的检测方法本质上是被动的。攻击者可以采用超出已知检测规则的技术实现攻击向量来逃避检测。事先准备一个全面的检测规则集是不现实的。因此,当前亟需一种不依赖于显式先验知识的高效恶意软件检测方法。


技术实现要素:

4.本发明的目的在于填补目前对不依赖于显式的先验知识进行恶意软件包检测的空白,提出一种基于代码嵌入和聚类的pypi恶意软件包检测方法。该方法可以在不依赖于显示的知识的情况下,依据软件包的安装脚本(即setup.py脚本)的离群程度和与已知恶意实例间的距离对其进行排名,突显出潜在的恶意软件包,协助其他检测方法进行检测,帮助审计者迅速发现恶意软件包,补充了软件供应链安全检测的武备库。
5.为实现上述目的,本发明采用如下技术方案:
6.基于代码嵌入和聚类的pypi恶意软件包检测方法,其步骤包括:
7.1)针对python代码构建apiem模型,该apiem模型能够学习函数的词嵌入向量,用于获取python脚本的标准化的api调用序列。
8.2)提取训练集的标准化api调用序列,并利用api调用序列作为训练样本对fastext-pvdm模型进行训练,从而得到标准化控制流图嵌入模型ccem(ccem,canonical cfg embedding model),该模型用于将python软件包的安装脚本的api调用序列嵌入为低维稠密向量,便于进行聚类和距离比较。
9.3)使用apiem模型,提取出待检测的python软件包和良性的python软件包的安装脚本的安装脚本的标准化的api调用序列。并使用ccem,将标准化的api调用序列嵌入为向量。
10.4)根据所得向量对待测样本进行聚类,识别出离群点,即,距离良性安装脚本较远的样本。
11.5)基于离群点的离群程度和与已知恶意样本间的距离来对离群点进行排名,将排名靠前的若干python软件包作为恶意软件包,以此来突显出潜在的恶意软件包。
12.进一步地,步骤1)中包括以下步骤:
13.a)从pypi中随机获取一定数量的python软件包,使用其中的所有python脚本来组成训练集。
14.b)对于每一个训练集中的python脚本,本发明按照函数api在python脚本中的物理顺序逐个抽取api函数调用来获得过程内的api调用序列。一个python软件包包含多个python脚本(.py文件),其中一个为安装脚本,每一个python脚本对应一个api调用序列。
15.c)为了引入足够的上下文信息,本发明基于python软件包的api函数调用图(cg)来将过程内的被调用者的api调用序列内联拼接到其过程内的调用者的api调用序列中,所生成的过程间的调用序列作为apiem模型的训练样本。
16.d)以过程间的api调用序列作为训练样本,采用fasttext词嵌入技术训练一个fasttext词嵌入模型,得到apiem模型。fastext词嵌入技术是公知的模型训练技术,fasttext模型是一个词嵌入模型,该模型通过fasttext词嵌入技术进行训练得到,该模型可以用于将词语嵌入为向量;apiem模型本质上是一个定制化(即使用我们定制化的训练样本进行训练)构建的fasttext模型。
17.进一步地,在步骤2)中,包括以下步骤:
18.a)对于每一个训练集中的python脚本,提取他们的函数调用图(cg)和控制流图(cfg)。
19.b)采用深度优先搜索和广度优先搜索两种策略来遍历函数的控制流图中的每一个基本块,并在apiem模型的指导下,基于后继节点的标准化遍历优先级来决定要访问的后继节点,从而形成一条目标函数的过程内的标准化api调用序列。
20.c)对于每一个控制流图中的过程内的标准化api调用序列,依据对应的函数调用图将被调用者的序列内联到调用者的序列上,生成过程间的标准化的api调用序列。
21.d)以过程间的标准化的api调用序列作为训练样本,采用fasttext pvdm文档嵌入技术来训练一个文档嵌入模型,得到ccem模型。
22.进一步地,在步骤2)中涉及的ccem模型训练可以采用与步骤1)中的相同的训练集。
23.进一步地,在步骤3)中,包括以下步骤:
24.a)从pypi中获取待测目标软件包集和良性软件包集。其中良性软件包定义为在软
件仓库中存活时间超过一定天数的软件包。
25.b)将待测样本集和良性样本集合并,并去除其中重复的安装脚本。
26.c)在apiem模型的指导下,提取合并的集合的安装脚本的过程间的标准化api调用序列。
27.d)使用ccem,将标准化的api调用序列嵌入为向量。
28.进一步地,在步骤4)中,包括以下步骤:
29.a)对合并的集合采用hdbscan方法进行聚类。聚类时应设置较为严格的阈值以避免稀疏区域中的相似噪声点被聚在一起。
30.b)对于聚类结果中的离群点,本发明将其识别为潜在的恶意样本。对于聚类结果中的簇,本发明将其确定为良性的簇。
31.优选地,在步骤4)中,所涉及的距离计算可选择余弦距离。
32.进一步地,在步骤5)中,包括以下步骤:
33.a)对于每一个离群点x,计算其与良性的簇的距离db(x)
34.b)对于每一个离群点x,计算其与恶意样本间的距离dm(x)。
35.c)对于每一个离群点x,根据距离db(x)和dm(x)计算x的排名分数rscore(x),并根据分数进行排名。上述计算所涉及的公式详见具体实施方式的描述。
36.d)对于排名靠前的样本,例如,排名前十名的样本,将被视为可疑的恶意软件包,并被报告给用户。
37.优选地,在步骤5)中,为了得到更好的效果,所涉及的距离计算选择余弦距离。
38.本发明还提供一种服务器,其特征在于,包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行上述方法中各步骤的指令。
39.本发明还提供一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现上述方法的步骤。
40.本发明的优点如下:
41.本发明通过运用代码嵌入与聚类技术,实现了不依赖显式知识的pypi恶意软件包自动化检测。该方法可以迁移至第三方软件仓库,是对软件供应链安全检测武备库很好的补充。本发明还设计了一种标准化的api调用序列生成办法,从而获得高质量的代码表示。此外,本发明设计了新的距离计算公式用于对离群点进行排名,使系统拥有更高的准确性和鲁棒性。
附图说明
42.图1是基于代码嵌入和聚类的pypi恶意软件包检测方法流程图。
43.图2是构建apiem模型的流程图。
44.图3是构建ccem模型的流程图。
45.图4是利用apiem模型获取标准化api调用序列,并利用ccem将目标安装脚本嵌入为向量的流程图。
46.图5是通过聚类来识别出离群点和良性的簇的流程图。
47.图6是基于样本点的离群程度和与已知恶意样本间的距离来对离群点进行排名的
流程图。
具体实施方式
48.下面结合附图对本发明进行进一步详细描述,所举实例只用于解释本发明,并非用于限定本发明的范围。
49.本实施例是基于代码嵌入和聚类的pypi恶意软件包检测方法,其总体流程如图1所示,该方法主要包括以下步骤:
50.1)针对python代码构建apiem模型,该apiem模型能够学习函数的词嵌入向量,用于获取python脚本的标准化的api调用序列。其中,构建apiem模型的流程如图2所示,具体说明如下:
51.1a)从pypi中随机获取一定数量的python软件包,使用其中的所有python脚本来组成训练集,转到1b)。
52.1b)对于每一个训练集中的python脚本,本发明按照函数api在python脚本中的调用顺序逐个抽取函数调用来获得过程内的api调用序列。一个python软件包包含多个python脚本(.py文件),其中一个为安装脚本,每一个python脚本对应一个api调用序列。为了引入足够的上下文信息,本发明基于函数调用图来将过程内的被调用者的api调用序列内联拼接到其过程内的调用者的api调用序列中,所生成的过程间的api调用序列作为apiem模型的训练样本,转到1c)。
53.1c)以过程间的api调用序列作为训练样本,采用fasttext词嵌入技术训练一个fasttext词嵌入模型,得到apiem模型。fastext词嵌入技术是公知的模型训练技术,fasttext模型是一个词嵌入模型,该模型通过fasttext词嵌入技术进行训练得到,该模型可以用于将词语嵌入为向量;apiem模型本质上是一个定制化(即使用我们定制化的训练样本进行训练)构建的fasttext模型。
54.2)提取训练集的标准化api调用序列,并利用标准化api调用序列作为训练样本对fastext-pvdm模型进行训练,从而得到标准化控制流图嵌入模型ccem,该模型用于将python软件包的安装脚本的api调用序列嵌入为低维稠密向量,便于进行聚类和距离比较。其中,是构建ccem模型的流程如图3所示,具体说明如下:
55.2a)对于每一个训练集中的python脚本,提取他们的函数调用图和控制流图,转到2b)。
56.2b)采用dfs和bfs两种策略来遍历函数的控制流图中的每一个基本块,来分别获取代码的全局特征和局部特征,并在apiem模型的指导下,基于后继节点的标准化遍历优先级来决定要访问的后继节点,从而形成一条目标函数的过程内的标准化api调用序列,转到2c)。
57.2c)对于每一个控制流图中的过程内的标准化api调用序列,依据对应的函数调用图将被调用者的序列内联到调用者的序列上,生成标准化的api调用序列,转到2d)。
58.2d)以过程间的标准化的api调用序列作为训练样本,采用fasttext pvdm文档嵌入技术来训练ccem模型。
59.3)在apiem模型的指导下,提取出待检测的python软件包和良性的python软件包的安装脚本的标准化api调用序列。并使用ccem模型,将标准化的api调用序列嵌入为向量。
标准化的api调用序列具有如下性质:从具有同质语义的代码中所获得的标准化api序列应是一致的。传统的控制流图遍历方法生成的是非标准化的api序列。事实上,传统的遍历方法可能在代码结构只有细微差异的情况下产生明显不同的遍历结果。理论上,为各种代码生成完美的标准化的api调用序列是极具挑战性的,如果不是不可能的话。在本发明中,利用以下规则来获得近乎完美的标准化api调用序列:包含类似api调用的基本块应具有相似的遍历优先级。其中,利用apiem模型获取标准化api调用序列,并利用ccem模型将目标安装脚本嵌入为向量的流程如图4所示,具体说明如下:
60.3a)从pypi中获取待测目标软件包集和良性软件包集。其中良性软件包定义为在软件仓库中存活时间超过一定天数的软件包,例如,存活时间超过90天的软件包,转到3b)。
61.3b)将待测样本集和良性样本集合并,以为接下来的聚类提供一个可靠的统计基础,并去除其中重复的安装脚本,转到3c)。
62.3c)使用apiem模型,提取合并的集合的安装脚本的标准化api调用序列。具体而言,对于目标程序的控制流图,假设在遍历时,本发明将依据基本块的遍历优先级后继基本块的访问顺序。本发明采用词嵌入技术来确定遍历优先级。每一个函数都可以用apiem模型编码成一个向量。apiem模型的语料库的几何中心被选为基向量。一个函数的优先级可以通过计算向量与基向量间的余弦距离来得到。基本块的优先级由其所包含的函数的最小优先级决定。本发明利用上述标准化控制流图遍历方法来获得标准化的api调用序列,转到3d)。
63.3d)使用ccem模型,将标准化的api调用序列嵌入为向量,以便进行聚类和距离比较。
64.4)根据所得向量对待测样本进行聚类,识别出离群点。本发明建立在两个基本且深刻的观察之上:首先,恶意包的数量远少于良性包的数量。其次,恶意软件包安装脚本的功能与良性软件包的安装脚本有很大不同,而后者常常形成簇。因此,本发明利用聚类技术来将pypi软件包中的安装脚本聚集为簇,以此来识别离群点,即潜在的恶意样本。其中,通过聚类来识别出离群点和良性的簇的流程如图5所示,具体说明如下:
65.4a)对合并的集合采用hdbscan聚类方法进行聚类,聚类所涉及的距离计算可以为余弦距离。聚类时应设置较为严格的阈值以避免稀疏区域中的相似噪声点被聚在一起,转到4b)。
66.4b)对于聚类结果中的离群点,本发明将其识别为潜在的恶意样本。对于聚类结果中的簇,本发明将其确定为良性的簇。
67.5)基于样本点的离群程度和与已知恶意样本间的距离来对离群点进行排名,将排名靠前的若干python软件包作为恶意软件包,以此来突显出潜在的恶意软件包。其中,基于样本点的离群程度和与已知恶意样本间的距离来对离群点进行排名的流程如图6所示,具体说明如下:
68.5a)对于每一个离群点x,计算其与良性的簇的疏远程度距离db(x)。具体而言,我们计算出离群点与一个良性簇中的所有成员之间的距离,并取其中的最小值来作为离群点与该簇之间的距离。计算x和最近的k个良性簇(例如,k=3)之间的平均距离db(x),具体公式如下所示,其中b为良性簇集合,b

为其大小为k的子集,b为一个良性簇,y为其中的一个样本向量,distance(x,y)为x与y之间的相似度距离计算公式,可以为余弦距离公式:
[0069][0070]
5b)对于每一个离群点x,计算其与恶意样本间的距离dm(x)。具体而言,计算是x与最近的已知恶意样本脚本m间的最小距离dm(x),具体公式如下所示,其中m为良性簇集合,m为其中的一个样本向量,distance(x,m)为x与m之间的相似度距离计算公式,可以为余弦距离公式:dm(x)=min
m∈m distance(x,m)
[0071]
5c)对于每一个离群点x,根据距离db(x)和dm(x),计算x的排名分数rscore(x),并根据分数进行排名。值得一提的是,一些恶意安装脚本可能仅包含数个函数调用,而良性的安装脚本则常常具有更多的语义。在这种情况下,dm(x)包含有更多信息。本发明引入了一个偏置β(x)基于x的大小来更好地平衡db(x)和dm(x)。计算rscore(x)的具体公式如下所示,其中sizeof(x)为x向量对应的api调用序列的api数量:
[0072]
rscore(x)=(0.5-β(x))db(x)+(0.5+β(x))dm(x)
[0073][0074]
5d)对于排名靠前的样本,例如,排名前十名的样本,视其为可疑的恶意软件包,并交由专业的安全人员进一步分析。
[0075]
尽管为说明目的公开了本发明的具体实施例,其目的在于帮助理解本发明的内容并据以实施,本领域的技术人员可以理解:在不脱离本发明及所附的权利要求的精神和范围内,各种替换、变化和修改都是可能的。因此,本发明不应局限于最佳实施例所公开的内容,本发明要求保护的范围以权利要求书界定的范围为准。

技术特征:
1.一种基于代码嵌入和聚类的pypi恶意软件包检测方法,其步骤包括:1)针对python代码构建apiem模型,所述apiem模型用于获取python脚本对应的标准化api调用序列,以及获取python软件包的安装脚本对应的api调用序列;2)从pypi软件仓库中选取若干python软件包,利用所选python软件包中的python脚本构建一训练集;利用所述apiem模型提取所述训练集中每一python脚本对应的标准化api调用序列,并将所述标准化api调用序列作为训练样本对fastext-pvdm模型进行训练,得到标准化控制流图嵌入模型ccem;3)使用所述apiem模型提取出各待检测python软件包的安装脚本对应的api调用序列,并使用所述标准化控制流图嵌入模型ccem将其嵌入为向量;使用所述apiem模型提取出各良性python软件包的安装脚本对应的api调用序列,并使用所述标准化控制流图嵌入模型ccem将其嵌入为向量;4)根据步骤3)所得向量对各待检测python软件包和各良性python软件包进行聚类,识别出离群点;5)基于离群点的离群程度以及该离群点与已知恶意样本间的距离计算该离群点的排名分数;根据各离群点的排名分数对离群点进行排名,将排名靠前的若干python软件包作为恶意软件包。2.根据权利要求1所述的方法,其特征在于,构建所述apiem模型的方法为:1a)从pypi软件仓库中选取多个python软件包,将所选python软件包中的各python脚本组成训练集;1b)对于所述训练集中的每一python脚本,按照该python脚本中各函数api的出现顺序逐个抽取api函数调用来获得过程内的api调用序列;1c)基于python软件包的函数调用图将过程内的被调用者的api调用序列内联拼接到其过程内的调用者的api调用序列中,生成过程间的api调用序列;1d)以过程间的api调用序列作为训练样本,采用fasttext词嵌入技术构建apiem模型。3.根据权利要求1所述的方法,其特征在于,得到所述标准化控制流图嵌入模型ccem的方法为:2a)对所述训练集中的每一python脚本,提取python脚本的函数调用图和函数控制流图;2b)遍历函数控制流图中的每一个基本块,并在所述apiem模型的指导下,基于后继节点的标准化遍历优先级来决定要访问的后继节点,从而形成一条目标函数的标准化序列;2c)对于每一函数控制流图中的标准化序列,依据对应的函数调用图将被调用者的序列内联到调用者的序列上,生成过程间的标准化api调用序列;2d)以标准化api调用序列作为训练样本,采用fasttext pvdm文档嵌入技术训练文档嵌入模型,得到所述标准化控制流图嵌入模型ccem。4.根据权利要求1或2或3所述的方法,其特征在于,对于每一个离群点x,分别计算其与各聚类簇的距离d
b
(x)、其与恶意样本间的距离d
m
(x),然后根据距离d
b
(x)和d
m
(x)计算该离群点x的排名分数rscore(x)。5.根据权利要求4所述的方法,其特征在于,得到该离群点x的排名分数rscore(x)的方法为:5a)对于该离群点x,选取与该离群点x最近的k个聚类簇;计算该离群点x与每一所选
聚类簇中的所有成员之间的距离,并取其中的最小值来作为该离群点x与该所选聚类簇的距离;然后将该离群点x和所选k个聚类簇之间的距离平均值作为距离d
b
(x);5b)对于该离群点x,将其与各已知恶意样本间的最小距离作为距离d
m
(x);5c)根据公式rscore(x)=(0.5-β(x))d
b
(x)+(0.5+β(x))d
m
(x)计算该离群点x的排名分数rscore(x);其中,sizeof(x)为该离群点x的对应api调用序列的api数量。6.一种服务器,其特征在于,包括存储器和处理器,所述存储器存储计算机程序,所述计算机程序被配置为由所述处理器执行,所述计算机程序包括用于执行权利要求1至5任一所述方法中各步骤的指令。7.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至5任一所述方法的步骤。

技术总结
本发明公开了一种基于代码嵌入和聚类的PyPI恶意软件包检测方法,其步骤包括:1)构建APIEM模型,用于获取Python脚本对应的标准化API调用序列;2)利用APIEM模型提取训练集中每一Python脚本对应的标准化API调用序列,并将其作为训练样本训练得到标准化控制流图嵌入模型CCEM;3)提取出各待检测Python软件包、良性Python软件包的安装脚本对应的标准化API调用序列,并使用CCEM将其嵌入为向量;4)根据向量对软件包进行聚类,识别出离群点;5)基于离群点的离群程度以及该离群点与已知恶意样本间的距离判断软件包是否为恶意软件包。间的距离判断软件包是否为恶意软件包。间的距离判断软件包是否为恶意软件包。


技术研发人员:梁文韬 凌祥 吴敬征 罗天悦 武延军
受保护的技术使用者:中国科学院软件研究所
技术研发日:2023.07.03
技术公布日:2023/9/9
版权声明

本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

航空之家 https://www.aerohome.com.cn/

飞机超市 https://mall.aerohome.com.cn/

航空资讯 https://news.aerohome.com.cn/

分享:

扫一扫在手机阅读、分享本文

相关推荐