PR - Supporting the Detection of Software Supply Chain Attacks through Unsupervised Signature Generation

原文作者:M Ohm, L Kempf, F Boes, M Meier

原文标题:Supporting the Detection of Software Supply Chain Attacks through Unsupervised Signature Generation

原文链接:https://arxiv.org/pdf/2011.02235.pdf

原文来源:PREPRINT

笔记作者:outx

0x01 Intro

现代软件开发是站在大量第三方工具、库和软件包的基础上的一项工作。通常来说,由官方维护的注册表(npm、PyPI)在整个软件包生态中扮演着最为核心的角色。那么站在攻击者的角度来看,针对开源软件包仓库进行投毒(发布恶意包)是一项既有效也十分节省成本的攻击方法。作者给出了三个主要场景例子:

  1. 开源软件包常用于构成各种软件项目,但软件包的代码库不太可能由软件包用户进行审查;
  2. 大多数软件包存储库没有使用有效的恶意软件包检测方法,大多恶意包需要200天左右的时候才能被识别和删除;
  3. 由于缺乏有效的恶意软件包检测方法,恶意软件包作者可以重新发布略微修改过的恶意代码片段,以此绕过检测。

按照传统的上报、比对、归类的方式处理恶意软件包难以应对每次都需要手动查询已有恶意家族,同时需要维护一份相对干净的家族特征表的问题。作者于本文中提供了一个工具,使安全分析师最耗时、最繁琐的任务变成一项自动化的任务

0x02 Method

作者Ohm在其之前的文章中观察到,恶意软件包通常具有共同的一些特征代码片段,这也于读者在研究时发现的内容一致。一般来说,恶意软件包出现不会是单独一个发布到注册表中,而是会以一种批量的方式进行广撒网式的攻击。如Intro中描述的,现在急需一个自动化的方法来识别和搜索所述特征代码片段。为此,作者提供并评估了几种自动化方法,以(1)使用特征代码片段自动集群(潜在恶意软件包);(2)利用结果检测当前未识别的已知恶意包克隆包。

作者设计了一种自动化标记方法,如上图所示。首先,将每个包嵌入到度量空间中,即将每一个软件包用一个点(多个点构成的点云)进行表示,每对点之间都有精确的距离。然后,利用点与点之间的距离计算集群。在此基础上,根据专家手动集群(在带标记的数据集上)对各种嵌入和集群软件包的方法进行评估。使用集群代表一组共享特征恶意代码片段的恶意软件包,然后从每个集群中提取一组特征代码片段,用于生产集群签名。

0x021 Syntactic Clones

Walker等人定义了四种不同成都相关的克隆类型。Type-1克隆共享两个相同的代码片段,但不涉及空格、空白或注释。Type-2克隆指的是代码结构相同,但一些函数、类或变量被重命名。Type-3克隆在命名不同的基础上,存在着结构性的差异,即代码片段可能被修改。Type-4克隆则是指的无法观察到语法相似性,但函数相同。

0x022 Embedding of Packages

为了识别代码克隆、比较代码片段,作者通过字符串相似性,程序依赖图和抽象语法树来计算相似性。作者提取了软件包所有功能代码片段,定义两个软件包相似性是两个软件包的两个代码片段之间最小的编辑距离。在实际实现过程中,作者放弃了利用PDG进行进一步实验,主要因为性能瓶颈。而字符串相似性由于其准确度不足等问题也同样被放弃了。通过将源代码转为AST可以忽略命名标识符混淆带来的影响,从而专注于结构表示上的区别。具体来说,两个AST的相似性表现为树的编辑距离。当软件包A所有函数的AST与软件包B所有函数的AST进行比较时,AB两个软件包的相似性是其中最小的AST树的编辑距离。(这里会不会有排列组合爆炸问题?

0x023 Clustering of Packages

作者使用Markov Cluster Algorithm(MCL)进行聚类,与K-Means等方法不同,MCL不需要对基础数据进行先验假设(不需要预先设定数据集)。具体算法实现可以参考 "A cluster algorithm for graphs." 对比实验结果表如下所示。

0x024 Derivation of Signatures

作者使用了Chilowicz提出的指纹识别方法,考虑从AST表示的每个函数中导出一个指纹。但与之不同的是,作者构建的关联子图专注于代码片段的结构,丢弃运算符等非结构信息例如a+b和a*b有着相同指纹,而a+(a+a)和(a+a)+a有着不同的指纹。

0x03 Conclusion

作者为了解决现有大部分方案到最后需要人工审查分类恶意包的情况,研究一种自动化标记归类的方法。基于AST考虑恶意代码家族克隆(相似性),这里主要还是针对Type-1和Type-2,结合MCL进行聚类,同时结合人工手动聚类,实现了一个能够模拟人工审查分类的框架。读者在读完整篇文章后存在这样几个问题:一是相似度计算时的两个软件包之间函数AST的比较,这里存在排列组合爆炸问题;二是聚类时还是需要人工介入,对于新的类型是没有办法识别的,这里做的工作更像是简化已有流程,对于未知类型的恶意软件包还是难以检测到。