Conference - TrustCom

会议名称:International Conference on Trust, Security and Privacy in Computing and Communications

笔记作者:outx

0x01 心得体会

这是第一次参加这种需要用全英文做汇报的会议,包括了对自己论文的介绍和现场听众的答疑。

对于自己论文的介绍这一部分来说,全英文汇报的难度并不大,首先是因为在写论文的时候大量的内容或者说这篇论文中涉及到的大部分英语词汇和短语都已经很熟悉,通过短期的朗读和背诵是能够达到铭记于心的效果的;其次就是在讲演时通常会有演讲者视图,如若没有也可以准备提词本,以达到良好的讲演效果。

对于现场听众的答疑这一部分来说,由于现场听众的英语水平不同(国人还是外国人)、听力/理解能力不同、对同一个事情的看法观点不同,提出的问题不尽相同。这就会出现哪怕提前准备了一些问题但是还是会被问到没有准备的地方,这个时候由于本身不是长期生活在英语交流的环境中,灵活的运用英语进行问答交流是一件特别困难的事。但这个情况也有应对之法,首先提前准备问题是很有必要的一件事,不论听众如何提问,可以适当的将其问题引至自己准备过的问题上,如果实在没有准备这方面的答案,可以适当的解释目前这个方面所做的工作,再表明在以后的实验中会加入相关考虑,最后表示对这个问题的感谢。

0x02 Malicious Packages Lurking in User-Friendly Python Package Index

本文主要是针对目前PyPI(所有Python组件包的索引)生态现状的一次调研,研究了针对pip安装工具的投毒攻击,这是一类供应链攻击问题,涉及开源软件库安全。

0x021 Intro

Python由于其在人工智能领域的火热,已经逐渐成为了世界第三受欢迎的开发语言。这很大程度上归功于开源组件索引PyPI及其安装工具PIP。但在我们探究PIP安装过程中,我们发现有许多攻击人员针对PIP这一安装过程展开了攻击。我们针对目前所有的独立检测方案进行了分析,找出了其各自的一些短板,最终打算将异常检测这一概念引入至PIP投毒攻击检测这一领域,设计并实现了一个用于检测PIP投毒的工具,PPD(pip poisoning detection)。

0x022 Method

image-20211025101137448

上图是整个PPD的结构图,主要分为三个部分:数据预处理,特征提取,模型训练及结果输出

数据预处理

所有实验用到的组件包均是从PyPI及其镜像站中下载的,在这部分流程中,我们主要是创新性提出了入口文件这个概念,并根据PIP的安装流程设计了一套用于提取入口文件的方案。具体来说,针对tar.gz的安装包,我们提取其setup.py,针对whl/zip的安装包,我们提取其__init__.py或是以组件包名字命名的py文件。当获取到了这个入口文件之后,我们将利用AST对其进行解析,获取Import节点和ImportFrom节点,这两个节点中包含有所有需要引入的额外文件。我们会遍历整个安装包,以找到那些存在于包内但又被入口文件所调用的py文件,然后合并以形成完整的安装时运行代码。

特征提取

我们将所有特征分为代码特征和组件包特征。

对于代码特征来说,我们主要设置了11种场景特征,包括代码执行、外连请求、目录遍历、文件操作、敏感文件读取、压缩与解压缩、引入其他文件、最长字符串、编码与解码、IP/URL、entry_points内容。我们首先会利用AST去解析整个代码,但是会存在AST解析不成功的情况,这时候便利用正则来处理,具体的可以阅读论文。

对于组件包特征来说,在前期的实验中我们加入了例如版本号,发布时间,作者人数等诸多维度的特征,但在实验结果中反馈并不好,于是我们最终选择了能够快速检测针对开发人员误拼写(最常见的一种攻击手段)的特征,即组件包名称的编辑距离

模型检测及结果输出

在选取模型的时候,我们主要需要解决三个问题:

  1. 特征维度较高时,需要一个很大数据集:由于PyPI体量很大并且在不断增长,我们是能够构建一个很大的数据集的
  2. 一些低密度区的样本容易被认定为异常样本:我们分析了所有代码长度小于100的组件包,分析其代码长度分布情况,最后我们发现长度小于等于10的组件包占了43%,这一些组件包我们可以很容易一眼看出其性质
  3. 预定义的样本分布情况会严重影响到模型输出:我们选择了孤立森林模型,主要是因为其利用切割的方式来分割样本而非通过描述正常样本来区分异常。

在做模型训练时,由于我们无法保证在训练样本中是否会混杂恶意样本,因此我们采用反向交叉验证的训练方式,以此来尽可能减轻由于错误引入恶意样本至训练样本中所引起的误差。同时,由于训练样本的减少,我们考虑分别使用3、5、10折反向交叉验证后去重输出的方式,尽可能保证输出可能性最大的异常样本集合。

在人工审查阶段,我们通过分析几十个以往披露的恶意python组件包,初步制定了一套用于判断组件包行为的规则,具体来说,

应当被认定是可疑组件包的行为包括:

  • 执行外部文件(.sh or .exe)
  • 包含编码后的字符串
  • 下载远程资源并解压
  • 读取文件并且执行
  • 修改系统配置文件或私自打开服务

应当被认定是恶意组件包的行为包括:

  • 下载远程文件并且执行
  • 创建反弹shell
  • 盗取敏感数据
  • 解码后执行
  • 明显的恶意代码或后门

0x023 Conclusion

简单来说,我们所做的工作主要是想要减轻针对整个PyPI生态进行检查的时候的工作量,目的在于发现那些在野的恶意组件包以说明此项工作的必要性,但这也存在着一些局限性,例如针对那些在安装的时候不触发,而在代码中import的时候触发的恶意组件包PPD并没有很好的检测效果,亦或是针对那一类功能单一但的确包含恶意代码的组件包我们的方案也暂时无能为力。

在未来的工作中,我们会总结并处理这一些细节上的东西,以进一步优化和提高我们的方案命中率。

0x03 一些想法

对于上台讲演这种事,还是需要很大的勇气的,尤其是这种需要脱离母语环境的讲演。这次会议还好是在国内,国人居多,老外也都是一些留学生,所以鄙人也没有特别紧张。但这并不意味着,做好讲演准备、上台做汇报、与听众交流讨论是一件易事,相反,这是一件费时费力且效果不明显的事。直到现在,鄙人的英语交流能力也不太行,中文语言逻辑和英文语言逻辑的区别还是太大了,需要后面多多练习才可。

同时,第一次学着做这种学术汇报PPT也踩了很多坑,不能全是图也不能全是文字,一页PPT不能太空也不能太拥挤,需要合理的布局,但是我特别喜欢我做的首页,在这次会议中看了一圈也没有比这个更符合我审美的了,嘻嘻嘻😁

image-20211025144127089

下次再接再厉,认真学习!