如何安全使用Python软件包?

165 阅读7分钟

在你的脑海中,你知道当你导入一个包的时候,你无一例外地导入了它的漏洞 -- 以及它的依赖性的漏洞,也 是如此。传统上, 开发 环境 中的 非关键性 漏洞 很少被关注。但是,随着对开发和测试环境的网络攻击率越来越高 ,企业开始 像 重视生产 环境 一样 重视其非生产 环境的 安全 。

Python的流行意味着越来越多地 使用 Python,这反过来又意味着越来越多的 错误和漏洞被发现。简单地说,使用量的增加导致了更多问题的出现。 尽管许多Python包和工具的编码和维护都很好,而且很少或没有问题,但其他的包和工具就不那么强大了。

例如, SafetyDB 引用了以下已知的漏洞数量:

  • Django。119
  • Pillow:46
  • Plone:38
  • TensorFlow和TensorFlow-directml。301
  • 辅导员。21
  • OpenSSL:仅今年就发现了7个漏洞

虽然这些漏洞中的大多数往往只是错误/糟糕的编码实践的结果,但考虑到 Python供应链攻击的增加 ,有些 也可能是由于恶意行为者插入被破坏的代码

作为一个Python开发者,你不可能总是避免使用一些软件包--即使你知道它们有漏洞。例如,也许你想为一个分类任务训练一个深度学习模型。如果没有TensorFlow,你必须从头开始创建你的算法,浪费的时间不如用来改进你的模型。

尽管这些漏洞的威胁越来越大,但为了使你的项目不那么容易受到影响,开发人员应该采取一些措施,包括:

  • 使用最新的软件包版本
  • 评估已知漏洞的严重性,并了解它们如何影响你的产品
  • 采用软件包管理工具来快速解决漏洞问题。

让我们来分析一下这些最佳实践,看看你如何能够在不破坏你的冲刺成果的情况下更安全地工作。

从一个安全的Python开发环境开始

从一个安全的环境开始是最佳实践。只要有可能,创建一个包含最新稳定版本的Python和所需软件包的环境应该是你的第一步。

对于Python,如果最新的版本是一个次要的版本,那么它应该可以使用。而主要版本则是另一回事,因为出现严重错误的几率更高,而且漏洞也将是未知的。由于这些原因,一些组织宁愿在采用最新版本之前等待。你也应该意识到其中的利弊:从最新版本中获得潜在的改进的安全和功能意味着放弃旧版本带来的相对确定性。

当涉及到软件包时,最好的做法是使用来自合法来源的签名组件。直接从公共资源库中安装组件可能会有风险,因为它们是预先构建的,但没有签名,这意味着它们可能包含被破坏的代码。在任何情况下,总是确保你从安全链接下载外部代码。

如果可能的话,选择经常更新的软件包也是比较安全的,这些软件包可以提供快速的错误修复,因为你的项目不太可能长期暴露在一个漏洞中。当然,这也意味着要围绕你升级软件包的频率实施最佳实践。考虑建立一个围绕你愿意等待新版本的时间与打补丁的政策。

说到打补丁,如果你需要使用一个有未打补丁漏洞的旧版本的软件包,可以考虑部署一个虚拟补丁。随着你的开发进展,确保你删除你不使用的包和文件。

评估已知漏洞的严重性

漏洞 通常根据通用漏洞评分系统(CVSS)进行评分,分为以下两种:

  • 低(得分=0.1-3.9)
  • 中(分值=4.0-6.9)
  • 高(得分=7.0-8.9)
  • 关键(得分=9.0-10)

但是,被打分相同的漏洞并不总是构成相同的威胁。有些 漏洞 是影响运行时的代码错误造成的,而有些漏洞 ,如隐藏的后门,会损害你项目的完整性。你应该了解你面对的是哪种类型的漏洞。

为了弄清楚如何以及你的项目受到多大的影响,你需要单独调查每个漏洞,而不是仅仅根据常见漏洞和暴露(CVE)的数量来做出判断。像Django和TensorFlow这样大量使用的软件包往往有很高的漏洞数量,因为它们被大量的用户用于众多的使用案例中,他们会很快注意到并报告问题。这里的启示是,仅仅 因为不那么流行的软件包 有较少的CVE数量,就用它们 来替代 ,并不一定能 使你的产品变得不那么脆弱。

一旦你知道了影响你的软件包的漏洞,并确定 它们 是否 会影响你的产品,你就需要确定如何最好地处理它们。你的 组织 可能 已经有了补救漏洞的政策, 通常是 根据CVSS的严重程度和 产品 风险来制定的。

但是,即使你无法想象已知的漏洞会如何影响你的用例,你仍然应该谨慎行事。

使用工具来管理你的 Python 漏洞

当涉及 到漏洞时,有几十个第三方 工具可以帮助一个组织及时了解新出现的威胁,提供及时的警告,甚至建议安全 升级 选项。一般来说,它们提供的能力是

  • CVE详情国家漏洞数据库 (NVD)等平台上得到报告漏洞的通知 。
  • 了解你的Python依赖性的威胁程度。
    • 你必须对你使用的每一个软件包和工具以及它们的依赖关系保持一个持续的最新清单。这些信息应该包括你的客户端和服务器端的组件以及横向的依赖关系。
  • 了解是否存在解决威胁的补丁或升级版本。

但是,这些工具都没有提供补救漏洞的能力,重建你的环境,测试和重新部署。这些都是 必要的 步骤,但它们是非常耗费时间和资源的,这就是为什么大多数组织只解决 关键 漏洞。

ActiveState提供了一个基于云的一体化软件包管理解决方案,可以帮助你获得对项目漏洞的总体可见性,同时创新地管理你的Python项目的软件包和依赖性。

ActiveState平台从源代码中自动构建Python运行环境, 包括 链接的C和Fortran库(从而提供 比 安装 预构建包更高的 安全性 ),然后检查所有的依赖关系(包括传递和共享的依赖关系)是否存在漏洞。如果发现漏洞,ActiveState平台将在产品中标记它们并通过电子邮件通知你。

但更重要的是,它可以帮助你 快速 、轻松地修复漏洞,并 在几分钟内 自动 重建一个安全的 环境 版本 。然后,你可以 用一个命令在开发、测试和你的CI/CD管道中 更新每个受影响的 环境 。

结论:自动修复漏洞以保持安全而不放弃速度

随着 越来越 多的恶意行为者以非生产环境为目标,开发人员必须学会保持其开发环境的安全。但是, 如果不 实现漏洞修复的自动化,生产成本就会太高。

幸运的是,你可以采用一些快速而简单的解决方案来保持你的项目安全 :

  • 使用最新版本的 Python 和你需要的软件包
  • 了解运行环境中的漏洞,以及它们如何影响你的项目
  • 使用像ActiveState Platform这样的软件包管理工具, 自动 补救、重建和重新部署安全的运行时到你的开发、测试和CI/CD环境。