一种恶意npm包检测方法、装置、设备及介质与流程

文档序号:33296009发布日期:2023-02-28 21:30阅读:80来源:国知局
一种恶意npm包检测方法、装置、设备及介质与流程

1.本技术涉及程序包检测技术领域,特别涉及一种恶意npm包检测方法、装置、设备及介质。


背景技术:

2.javascript流行已久,v8引擎更是让其进化为服务端开发语言的一员。其对应的包管理工具npm(即node package manager,node包管理器)中存在着大量的可重用软件包,体量巨大。社区的热度促进了npm的发展,也促进了node.js的发展。但在npm中发布一个新的包只需要注册一个npm账户即可,更新一个包的新版本也只需要简单地进行注册表上传同步。恶意包在近几年成为一大焦点问题,因为即使很快地发现并清除这些恶意包,在注册表中存活很短一段时间也会影响到很多终端用户。
3.目前,由于npm包发布量大,传统人工审核或半自动化审核的方式难以应对,且存在错误标记正常包或遗漏恶意包导致的准确率低的问题。


技术实现要素:

4.有鉴于此,本技术的目的在于提供一种恶意npm包检测方法、装置、设备及介质,能够提升恶意npm包检测的效率和准确率。其具体方案如下:
5.第一方面,本技术公开了一种恶意npm包检测方法,包括:
6.提取待检测npm包的特征数据;
7.将所述特征数据输入分类模型,得到所述待检测npm包的分类结果;
8.当所述分类结果为正常包,则基于预设的检测逻辑对所述待检测npm包进行检测,得到检测结果。
9.可选的,所述基于预设的检测逻辑对所述待检测npm包进行检测,得到检测结果,包括:
10.对所述待检测npm包内的源代码进行重构以得到重构文件,并基于所述重构文件以及所述待检测npm包在注册表中的信息判断所述待检测npm包是否为恶意包,得到检测结果;
11.或,对所述待检测npm包内的可执行文件与已知恶意包进行比较,得到检测结果。
12.可选的,所述提取待检测npm包的特征数据,包括:
13.提取所述待检测npm包内的源代码或可执行文件的特征数据;
14.和/或,提取所述待检测npm包内的安装时运行脚本的特征数据;
15.和/或,基于所述待检测npm包内的说明文件提取所述待检测npm包的版本特征数据。
16.可选的,所述提取所述待检测npm包内的源代码或可执行文件的特征数据,包括:
17.提取所述待检测npm包内的源代码或可执行文件中目标操作的特征数据;所述目标操作包括获取用户个人信息的操作、访问特定的系统资源的操作、调用特定的apis的操
作;
18.和/或,提取所述源代码或可执行文件的香农熵。
19.可选的,所述调用特定的apis的操作包括调用动态代码生成的apis的操作,所述方法包括:
20.对所述待检测npm包内的源代码或可执行文件进行正则匹配,若匹配到模板引擎,则对所述模板引擎所生成的代码进行关键字匹配,得到调用动态代码生成的apis的操作的特征数据。
21.可选的,所述提取所述待检测npm包内的安装时运行脚本的特征数据,包括:
22.匹配所述安装时运行脚本中用于生成代码的函数,并提取所述函数的函数内容,得到所述安装时运行脚本的特征数据。
23.可选的,所述基于所述待检测npm包内的说明文件提取所述待检测npm包的版本特征数据,包括:
24.利用预设语义分析逻辑提取所述说明文件的语义特征,并获取所述待检测npm包与上一版本的版本发布间隔时间,得到所述待检测npm包的版本特征数据。
25.第二方面,本技术公开了一种恶意npm包检测装置,包括:
26.特征数据提取模块,用于提取待检测npm包的特征数据;
27.分类结果获取模块,用于将所述特征数据输入分类模型,得到所述待检测npm包的分类结果;
28.检测结果获取模块,用于当所述分类结果为正常包,则基于预设的检测逻辑对所述待检测npm包进行检测,得到检测结果。
29.第三方面,本技术公开了一种电子设备,包括存储器和处理器,其中:
30.所述存储器,用于保存计算机程序;
31.所述处理器,用于执行所述计算机程序,以实现前述的恶意npm包检测方法。
32.第四方面,本技术公开了一种计算机可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现前述的恶意npm包检测方法。
33.可见,本技术先提取待检测npm包的特征数据,之后将所述特征数据输入分类模型,得到所述待检测npm包的分类结果,并且当所述分类结果为正常包,则基于预设的检测逻辑对所述待检测npm包进行检测,得到检测结果。也即,本技术先利用分类器基于待检测npm包的特征数据输出待检测npm包的分类结果,当分类结果为正常包时,调用预设的检测逻辑对待检测npm包进行二次检测,这样,实现了npm包的自动化监测,并避免了将恶意包标记为正常包,能够提升恶意npm包检测的效率和准确率。
附图说明
34.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
35.图1为本技术公开的一种恶意npm包检测方法流程图;
36.图2为本技术公开的一种具体的恶意npm包检测方法流程图;
37.图3为本技术公开的一种恶意npm包检测装置结构示意图;
38.图4为本技术公开的一种电子设备结构图。
具体实施方式
39.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
40.首先,对本技术涉及的专业术语进行解释说明:npm是javascript运行时node.js的默认程序包管理器。javascript是互联网上最流行的脚本语言,这门语言可用于html和web,更可广泛用于服务器、pc、笔记本电脑、平板电脑和智能手机等设备。typescript是一种自由和开源的编程语言,它是javascript的一个超集,扩展了javascript的语法。tree-sitter:是一个解析器生成器工具和增量解析库,它可以为源代码文件构建具体的语法树,并在编辑源文件时高效地更新语法树,它支持多种编程语言的解析,包括python,java,c等。
41.npm是javascript和typescript生态系统的支柱之一,托管了超过大量的包,其中包含了各类简单的实用程序库、复杂框架甚至整个应用程序。每天全球的开发人员都会提交数以万计的更新以及发布数百个新包。由于npm的流行,导致其已成为恶意攻击者的主要目标,恶意攻击者在发布的新软件包时或更新现有软件包时引入恶意软件,进而篡改或泄露安装这些软件包或任何软件包的用户的敏感数据。防御此类攻击对于维护软件供应链的完整性至关重要,但软件包更新的庞大数量意味着无法完全手动审查。其中,
42.要从根本上解决针对npm的攻击问题,可以从两个方面入手:一是阻断这些恶意包被同步到注册表中,即严格执行审查机制,在这些恶意包从上传开始到实际被同步到注册表中的这段时间里进行检查并清理;二是执行访问控制来限制包的安装过程,缩小攻击面。发明人在实现本技术的过程中发现:1、由于恶意攻击者可能通过窃取npm软件包维护人员的凭证来发布一个恶意npm包,因此单纯信任npm软件包提供者或发布者的方式并不适用。2、恶意npm包往往不会公开其源代码以避免被发现,因此纯源码的检测方式可能并不适用。3、攻击者经常以不同的名称发布同一个恶意程序包的多个文本相同的副本。然而,由于包元数据可能不同,因此传统的分类器有时无法发现这些副本。4、在很短的时间内,开发人员发布了大量公共包版本,包括新包和现有包的更新版本,因此传统人工审核分类或半自动化审核分类的方式是无法应对如此庞大的数量。5、由于npm包更新速度非常快,因此需要一种快速的方式来分类npm包是否属于恶意npm包。为了解决上述问题,本技术提供了一种恶意npm包检测方案,能够提升恶意npm包检测的效率和准确率。
43.参见图1所示,本技术实施例公开了一种恶意npm包检测方法,包括:
44.步骤s11:提取待检测npm包的特征数据。
45.在具体的实施方式中,可以提取所述待检测npm包内的源代码或可执行文件的特征数据;和/或,提取所述待检测npm包内的安装时运行脚本的特征数据;和/或,基于所述待检测npm包内的说明文件提取所述待检测npm包的版本特征数据。可以理解的是,npm包内可以包括源代码/可执行文件、安装时运行脚本、说明文件。当发布者不想公布源代码时,可以
以可执行文件的方式公布,安装时运行脚本为安装npm包时执行环境配置等操作的脚本,说明文件通常为npm包的描述,可以包括软件功能、更新的功能描述等。
46.进一步的,所述提取所述待检测npm包内的源代码或可执行文件的特征数据具体可以为:提取所述待检测npm包内的源代码或可执行文件中目标操作的特征数据;所述目标操作包括获取用户个人信息的操作、访问特定的系统资源的操作、调用特定的apis的操作;和/或,提取所述源代码或可执行文件的香农熵。其中,获取用户个人信息的操作可以为获取用户账户、密码的操作,访问特定的系统资源的操作可以包括文件操作(比如读取/写入)、进程创建操作(创建新进程)、网络请求(收发数据)等。调用特定的apis的操作可以包括调用加密功能的apis的操作、调用数据编码的apis的操作、调用动态代码生成的apis的操作。并且,源代码可能为压缩后的短代码。
47.在具体的实施方式中,可以使用字符串匹配来特征匹配提取获取用户个人信息的操作的特征数据;并且,可以利用api关键字匹配访问特定的系统资源的操作、调用特定的apis的操作的特征数据,包括利用操作系统的api和其他api关键字进行匹配。并且,若所述调用特定的apis的操作包括调用动态代码生成的apis的操作,可以对所述待检测npm包内的源代码或可执行文件进行正则匹配,若匹配到模板引擎,则对所述模板引擎所生成的代码进行关键字匹配,得到调用动态代码生成的apis的操作的特征数据。其中,关键字匹配可以为使用api关键字进行匹配。模板引擎即用于生成代码的引擎。并且,匹配到的目标操作的特征数据可以包括函数和函数内容。
48.进一步的,可以匹配所述安装时运行脚本中用于生成代码的函数,并提取所述函数的函数内容,得到所述安装时运行脚本的特征数据。
49.并且,可以利用预设语义分析逻辑提取所述说明文件的语义特征,并获取所述待检测npm包与上一版本的版本发布间隔时间,得到所述待检测npm包的版本特征数据。其中,版本发布间隔时间为当前版本发布时间减去上一版本发布时间,若该待检测npm包为初始版本,则版本发布间隔时间确定为0。也即,版本特征数据包括语义特征和版本发布间隔时间。这样,通过版本特征,进一步的进行该包其他版本包的检测,不仅能够检测恶意更新(即以前良性程序包变成恶意程序),而且能够检测从一开始就是恶意的程序包。
50.步骤s12:将所述特征数据输入分类模型,得到所述待检测npm包的分类结果。
51.在具体的实施方式中,分类模型为基于训练数据对初始模型进行训练得到的模型,初始模型可以为决策树、朴素贝叶斯分类器、svm(即support vector machine,支持向量机)等。其中,训练数据包括npm包样本的特征数据以及标签信息,并且,决策树、朴素贝叶斯分类器的训练数据包括正常样本和恶意样本的特征数据,svm的训练数据包括正常样本的特征数据。
52.步骤s13:当所述分类结果为正常包,则基于预设的检测逻辑对所述待检测npm包进行检测,得到检测结果。
53.在具体的实施方式中,可以对所述待检测npm包内的源代码进行重构以得到重构文件,并基于所述重构文件以及所述待检测npm包在注册表中的信息判断所述待检测npm包是否为恶意包,得到检测结果;或,对所述待检测npm包内的可执行文件与已知恶意包进行比较,得到检测结果。
54.可以理解的是,注册表中包括npm包的注册信息,注册信息包括npm包的哈希值,本
申请实施例可以对待检测npm包内的源代码进行重构以得到重构文件,计算重构文件的哈希值,若该哈希值与注册表中该npm包的哈希值不一致,则判定该包是恶意包,否则为正常包。并且,对所述待检测npm包内的可执行文件与已知恶意包进行比较,具体过程可以为:计算可执行文件对应的md5散列,与已知恶意包的md5散列表比对,若该md5散列表中存在一致的md5散列,则判定该npm包为恶意包,否则判定该包为正常包。这样,能够避免分类器将恶意包误分类为正常包,提升检测准确度。
55.可见,本技术实施例先提取待检测npm包的特征数据,之后将所述特征数据输入分类模型,得到所述待检测npm包的分类结果,并且当所述分类结果为正常包,则基于预设的检测逻辑对所述待检测npm包进行检测,得到检测结果。也即,本技术实施例先利用分类器基于待检测npm包的特征数据输出待检测npm包的分类结果,当分类结果为正常包时,调用预设的检测逻辑对待检测npm包进行二次检测,这样,实现了npm包的自动化监测,并避免了将恶意包标记为正常包,能够提升恶意npm包检测的效率和准确率。
56.参见图2所示,图2为本技术实施例公开的一种具体的恶意npm包检测方法流程图。分类器即分类模型,为用标记的训练数据进行机器学习分类器的训练得到的。训练数据包括apis特征和用轻量语义扫描获得的元数据。重构器用于使用源代码进行包的重构,从源代码重新构建生成软件包,并与其在注册表中发布的版本进行比较。克隆检测器,用于利用已知恶意包的对npm进行检查,具体计算包tarball内容的md散列,并将其与已知恶意包的散列列表进行比较,并且在计算哈希时,忽略package.json文件(配置文件)中指定的包名和版本。
57.在训练阶段,获取643个恶意包,在此基础上增加1147个同一日期发布的正常包,构成了一个总量为1790的带标签语料库。由于这个语料库的量对于在当时单版本就有170w个包的总数据量确实过少,为了解决样本的极度不平衡性可以使用如下算法:决策树、朴素贝叶斯分类器和一分类svm。其中,决策树能很好地说明特征重要性,朴素贝叶斯分类器、svm能够解决样本不平衡问题。使用python的sklearn库。对于决策树,使用信息增益作为分割标准。对于朴素贝叶斯分类器,使用了只能处理布尔特征的伯努利变体,因此省略了离散特征(熵平均值和标准差以及更新时间),如果该特征将其他特征折叠为1存在,否则为0。对于svm,选择一个线性核并仅在良性示例上进行训练,因为该分类器的任务是检测与良性明显不同的异常版本。通过对基本语料库进行留一法实验确定了svm的ν参数,该参数近似于预期异常值的数量。
58.进一步的,本技术实施例可以利用特征提取器提取npm包数据库中任一待检测npm包的特征数据集,将特征数据集输入训练后的分类器,得到预测结果,之后进行重构或与已知恶意包进行匹配检测,得到最终的预测结果。
59.其中,所述收集的npm包的特征数据集包含如下特征数据:1、获取终端用户个人敏感信息:账户、密码等;2、访问特定的一些系统资源,包括:2.1、文件操作:读取/写入,2.2、进程创建:创建新进程,2.3、网络请求:收发数据;3、使用特定的一些apis:3.1、加密功能,3.2、数据编码,3.3动态代码生成;4、安装时运行脚本;5、短代码(避免检测)或二进制文件(可执行文件),避免检测指通过代码压缩的方式,让代码可读性下降,使得常规的一些关键词检测恶意npm不适用,来逃避检测。6、多版本特征(即前述实施例中的版本特征数据)包括:1、版本发布的间隔时间;2、版本更新说明中描述的更新类型。进一步的,特征提取器通
过tree-sitte来解析包中的javascript和typescript文件以获取单包特征:对于获取终端用户个人敏感信息:账户、密码等的操作,使用字符串匹配来特征匹配;对于访问特定的一些系统资源、使用特定的一些apis,利用操作系统的api和其他api关键字进行匹配。对于动态代码生成特征匹配模板引擎,对引擎生成内容进行关键字匹配。对于安装时运行脚本),会调用eval和function(两个函数)来生成代码,匹配函数内容。对于短代码或二进制文件,通过shannon熵值进行提取。对于多版本特征则是利用npm view time获取版本发布时间间隔;利用语义分析获取更新类型也即语义特征。对于第一次上传到npm中心仓库的中的包,需要引入一个伪更新版本,设定版本发布之间的时间为0,更新类型则是单包中说明文件的描述的语义特征。
60.这样,可以有效防止被恶意攻击者攻击,解决npm包更新量、新增量过大无法有效识别恶意npm包的问题,实现恶意npm包检测的自动化,不使用人工审查,实时性强,可以跟上版本更迭速度,准确率高,避免错误标记正常包或是遗漏恶意包,本方案使得每个npm包通常只需几秒钟即可提取特征并运行分类器。重新训练分类器的代价也很低廉并且迅速,因此随着越来越多的结果被分类,可以进行持续改进。
61.需要说明的是,决策树提取npm包的主要特征点,即决策树可以将特征相近或拥有相同特征的npm包归为一类,在已知恶意npm包特征的情况下,可以快速将未知npm包依据特征进行归类(判断是否为恶意)。朴素贝叶斯分类器:朴素贝叶斯是使用贝叶斯的条件概率来做分类判断的一种算法,在解决分类问题上可以用来解决“逆概”问题。“正向概率”问题是指比如说,一个袋子中已知有2个白球,3个黑球,那么一次随机摸球活动,摸到黑球的概率是多少。但是现实中更常见的情况是,事先并不知道里面有多少个什么颜色的球,只知道摸出的某一个球的颜色,由此来猜测的袋中球色分布。这就是“逆概”问题。朴素贝叶斯分类是基于贝叶斯定理与特征条件独立假设的分类方法,发源于古典数学理论,拥有稳定的数学基础和分类效率。它是一种十分简单的分类算法。通过对给出的待分类项求解各项类别的出现概率大小,来判断此待分类项属于哪个类别,而在没有多余条件的情况下,朴素贝叶斯分类会选择在已知条件下,概率最大的类别。svm:svm分类是线性分类的高级版,也就是在线性分类的基础上,加入一个支持向量的概念,希望找出一个能最大间隔的分割出不同分类的分类线条,从而能避免验证数据。支持向量机是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析。支持向量机属于一般化线性分类器,它能够同时最小化经验误差与最大化几何边缘区,因此支持向量机也被称为最大边缘区分类器。同时支持向量机将向量映射到一个更高维的空间里,在这个空间里建立一个大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化。假定平行超平面间的距离或差距越大,分类器的总误差越小。
62.参见图3所示,本技术公开了一种恶意npm包检测装置,包括:
63.特征数据提取模块11,用于提取待检测npm包的特征数据;
64.分类结果获取模块12,用于将所述特征数据输入分类模型,得到所述待检测npm包的分类结果;
65.检测结果获取模块13,用于当所述分类结果为正常包,则基于预设的检测逻辑对所述待检测npm包进行检测,得到检测结果。
66.可见,本技术实施例先提取待检测npm包的特征数据,之后将所述特征数据输入分
类模型,得到所述待检测npm包的分类结果,并且当所述分类结果为正常包,则基于预设的检测逻辑对所述待检测npm包进行检测,得到检测结果。也即,本技术实施例先利用分类器基于待检测npm包的特征数据输出待检测npm包的分类结果,当分类结果为正常包时,调用预设的检测逻辑对待检测npm包进行二次检测,这样,实现了npm包的自动化监测,并避免了将恶意包标记为正常包,能够提升恶意npm包检测的效率和准确率。
67.其中,检测结果获取模块13,具体用于对所述待检测npm包内的源代码进行重构以得到重构文件,并基于所述重构文件以及所述待检测npm包在注册表中的信息判断所述待检测npm包是否为恶意包,得到检测结果;或,对所述待检测npm包内的可执行文件与已知恶意包进行比较,得到检测结果。
68.并且,特征数据提取模块11,具体可以包括:
69.第一特征提取单元,用于提取所述待检测npm包内的源代码或可执行文件的特征数据;
70.第二特征提取单元,用于提取所述待检测npm包内的安装时运行脚本的特征数据;
71.第三特征提取单元,用于基于所述待检测npm包内的说明文件提取所述待检测npm包的版本特征数据。
72.其中,第一特征提取单元,具体用于:
73.提取所述待检测npm包内的源代码或可执行文件中目标操作的特征数据;所述目标操作包括获取用户个人信息的操作、访问特定的系统资源的操作、调用特定的apis的操作;和/或,提取所述源代码或可执行文件的香农熵。
74.并且,所述调用特定的apis的操作包括调用动态代码生成的apis的操作,第一特征提取单元,具体用于:对所述待检测npm包内的源代码或可执行文件进行正则匹配,若匹配到模板引擎,则对所述模板引擎所生成的代码进行关键字匹配,得到调用动态代码生成的apis的操作的特征数据。
75.第二特征提取单元,用于匹配所述安装时运行脚本中用于生成代码的函数,并提取所述函数的函数内容,得到所述安装时运行脚本的特征数据。
76.第三特征提取单元,用于利用预设语义分析逻辑提取所述说明文件的语义特征,并获取所述待检测npm包与上一版本的版本发布间隔时间,得到所述待检测npm包的版本特征数据。
77.参见图4所示,本技术实施例公开了一种电子设备20,包括处理器21和存储器22;其中,所述存储器22,用于保存计算机程序;所述处理器21,用于执行所述计算机程序,前述实施例公开的恶意npm包检测方法。
78.关于上述恶意npm包检测方法的具体过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。
79.并且,所述存储器22作为资源存储的载体,可以是只读存储器、随机存储器、磁盘或者光盘等,存储方式可以是短暂存储或者永久存储。
80.另外,所述电子设备20还包括电源23、通信接口24、输入输出接口25和通信总线26;其中,所述电源23用于为所述电子设备20上的各硬件设备提供工作电压;所述通信接口24能够为所述电子设备20创建与外界设备之间的数据传输通道,其所遵循的通信协议是能够适用于本技术技术方案的任意通信协议,在此不对其进行具体限定;所述输入输出接口
25,用于获取外界输入数据或向外界输出数据,其具体的接口类型可以根据具体应用需要进行选取,在此不进行具体限定。
81.进一步的,本技术实施例还公开了一种计算机可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现前述实施例公开的恶意npm包检测方法。
82.关于上述恶意npm包检测方法的具体过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。
83.本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
84.结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(ram)、内存、只读存储器(rom)、电可编程rom、电可擦除可编程rom、寄存器、硬盘、可移动磁盘、cd-rom、或技术领域内所公知的任意其它形式的存储介质中。
85.以上对本技术所提供的一种恶意npm包检测方法、装置、设备及介质进行了详细介绍,本文中应用了具体个例对本技术的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本技术的方法及其核心思想;同时,对于本领域的一般技术人员,依据本技术的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本技术的限制。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1