开源软件中 5 种常见的网络安全攻击

在此处访问本次网络研讨会的录音here。
主持人:我们非常高兴欢迎 Frank Yang 参加今天的网络研讨会。Frank 是 Anaconda 的首席解决方案架构师。凭借为世界一些最大的金融机构设计和实施解决方案的丰富经验,Frank 帮助组织利用开源软件执行高价值计划,同时不牺牲安全性和治理。现在,事不宜迟,我将把时间交给 Frank,让他开始今天的分享。
Frank Yang:大家好,欢迎各位。
在本次会议中,我们将讨论如何保障您的 AI、机器学习和数据科学软件供应链的安全。首先,让我们来审视一下现状。Python 无处不在,应用于各个领域。在过去的十年中,我们看到了 Python 的稳步崛起,并且在过去的 6 年里,Python 一直是机器学习的事实标准语言。Python 也被广泛应用于许多行业和角色。以下是我们《数据科学现状报告》中的一些发现。
我们看到 Python 几乎应用于所有行业领域,并且被从业务分析师到数据科学家、运营人员等各种角色的人员使用。Python 也用于端到端的工作流程。过去,Python 可能被看不起,仅仅被认为是一种脚本语言,你们中的一些人可能还记得在部署到生产环境之前,必须用 C++ 或 Java 等语言重写代码。但如今,Python 已被接受,甚至被认为是首选的主要语言。企业将其用于整个工作流程,从数据采集和探索,一直到部署和监控。
这些工作流程可以在任何地方找到:在台式机和服务器、容器和虚拟机上。Python 也被用作其他产品的嵌入式语言。随着 PyScript 的引入,它甚至可以在浏览器中运行。
那么,Anaconda 在 Python 世界中扮演什么角色呢?我们既是一家公司,也是一个社区。Anaconda 在绝大多数财富 500 强企业中都有应用。我们还拥有数千万用户的活跃社区。
社区对我们至关重要,因为创新就来源于此。甚至下一代数据科学专家也在他们的课程中使用 Anaconda 进行培训。我们还拥有数十亿次的下载量,这使我们成为世界上最受欢迎的数据科学平台。世界一流的组织信任 Anaconda,将其作为企业级开源 Python 的首选供应商。
那么 Anaconda 是做什么的呢?简而言之,从数据科学软件的安装开始,我们简化了数据科学流程。Python 拥有丰富的软件包生态系统,软件构建在软件之上。这就是我们获得日益复杂功能的方式。但如图所示,这也创建了软件包之间复杂的依赖关系集。
您可以想象,不得不手动解决这些依赖关系约束将非常耗时且容易出错。因此,我们使用 conda(我们的软件包管理器)自动找出要引入哪些依赖项,并确保所有这些软件包及其版本都是相互兼容的。这样,您就不必花时间与依赖项作斗争,而可以专注于您的核心数据科学任务。
[5 分钟] 现在,当软件安装完成后,我们还会促进数据科学工作流程。正如我们之前看到的,此工作流程中包含多个活动。这些活动中的每一个都可能带来挑战。在 Anaconda,我们提供解决方案来帮助您克服这些障碍。我们还支持大规模部署。我们刚才看到的上一个图实际上只是一个数据科学家的工作流程。
但数据科学是一项团队运动,并且对于在当今竞争激烈的环境中保持竞争力至关重要。因此,Python 被部署在您的整个基础设施中,用于各种用例,并跨越许多部门和人员。
这种部署规模确实带来了安全挑战。例如,在没有合适的工具的情况下,您如何知道谁在下载什么软件包?以及从哪里下载?此外,大规模部署为潜在的攻击创造了很大的攻击面。因此,安全绝对是一个令人担忧的问题。
事实上,正是因为 Python 的部署如此普遍,所以它才对攻击者具有吸引力——因为攻击者的回报与努力比率非常高。从左到右(见上图),我们看到开源得到了巨大的采用。但与此同时,开源网络攻击的数量也在令人担忧地增加。事实上,在 2022 年,平均每天报告 72 个 CVE。CVE 是通用漏洞披露——或安全漏洞。现在,如果我们用 72 除以 24 小时,那就是每小时 3 个 CVE,或者每 20 分钟就出现一个新的安全漏洞。
谁会受到网络攻击的影响?根据 FBI 的互联网犯罪报告,排名前列的行业是医疗保健、制造业、政府、信息技术和金融服务。
让我们来看看软件包的来源以及社区仓库的挑战。社区仓库是一个很好的资源,但有一些注意事项。
首先,它的优点。它们具有较低的准入门槛,这很好,因为它鼓励参与和创新。这就是为什么我们在 PyPI 和 conda-forge 上找到了大量软件包的原因。
现在,如果您正在运行业务或任务关键型工作负载,则需要牢记一些重要问题。社区仓库的质量控制极低,因为没有中央审查流程。发布也完全由作者驱动。坦率地说,任何人都可以上传他们想要的任何东西。这实际上是社区仓库的本质。
这就是为什么代码和元数据质量参差不齐,包括软件包之间潜在的互操作性冲突。因为志愿者开发者倾向于专注于使他们自己的软件包工作,而不是一定与生态系统的其余部分集成。支持也是志愿的,因此如果您遇到事件并且需要紧急帮助,那么这种帮助可能会或可能不会及时到来。
在 PyPI 的情况下,实际上没有构建系统。因此,有人可能坐在家里,使用一台装满恶意软件的旧台式机构建软件包。并且没有任何东西可以阻止他们上传这些软件包。社区仓库——这些免费仓库——也没有实施企业级安全。
这就是为什么我们看到生态系统中发生了许多安全事件。这里实际上只是您在新闻中会发现的一小部分示例。但是,从这几篇文章中,我们可以了解到,攻击正在增加,因为它们有效。即使是非常注重安全的组织也受到了破坏。而且不仅仅是小型、默默无闻的项目。PyTorch 是主要的深度学习框架之一,甚至他们也受到了攻击。
随着事态发展,攻击者变得越来越有创意。最后一篇文章谈到了如何使用特殊的 Unicode 字符伪装恶意代码。事实上,恶意活动的数量已经增加到如此之多,以至于 PyPI 实际上暂停了新用户和项目的注册,因为他们不堪重负于如此大量的攻击。
另一个主要的社区仓库是 conda-forge,这是他们的核心开发团队发布的警告:“我们不建议您在包含敏感信息的环境中使用 conda-forge。conda-forge 的软件由我们的用户构建,核心开发团队无法验证或保证该软件不是恶意的或未被篡改。如果您在非常敏感的环境中使用 conda-forge(我们不建议这样做),请从您的系统中删除这些工件。”
重要的是要注意,此警告来自 conda-forge 本身。
接下来,让我们考虑市场动态。2021 年,[美国政府]白宫发布了一项旨在提高我们国家网络安全水平的行政命令。这促成了 SSDF(安全软件开发框架)的创建。关于此框架有很多页的文档。
但问题的关键是:如果我们正在公共部门运营或与[政府]开展业务,那么我们将被要求遵守安全标准。
[10 分钟] 在私营部门,正在使用的市场力量是责任。更具体地说,责任将落在使用开源构建产品和服务的组织身上——而不是那些产品的志愿者开发者或最终消费者。这是因为这些组织,这些公司,是拥有资源并且[能够]为网络安全做些什么的机构。
这就是现状。我们想要利用开源的创新。并且我们也想要遵守,或者更确切地说,我们必须遵守安全标准。然而,社区仓库本身已经声明它们是不安全的。社区志愿者在努力解决安全问题方面做出了非常值得称赞的努力,但是社区仓库的本质——对所有人开放——使得它们难以保护且容易受到攻击。恶意行为者利用了这一点。
那么我们该怎么办?我们如何才能同时获得创新和安全,从而在当今竞争激烈的环境中保持竞争力?这就是 Anaconda 的[专业]仓库的用武之地。[这个]Anaconda 仓库是由专业人士为专业人士构建的。我们研究了社区仓库中的风险,并解决了这些问题。
因此,您得到的不是质量控制极低且存在互操作性冲突的软件包,而是使用最佳实践工程设计并使用一致的控制构建的可靠软件包。这对您实际意味着,这些软件包是相互兼容的。因此,您可以混合和匹配它们来构建您自己独特的 AI 模型和应用程序。
您得到的不是任何人都可以上传任何东西,而是精选的软件包,并附带 SBOM。SBOM 是软件物料清单,它是新安全框架中的关键组成部分。您还可以获得经过验证的许可证,这在您以商业身份运营时尤其重要。
您将获得带有 SLA 的企业支持。这意味着您可以获得单一的联系点来获得支持,而不是试图联系您没有正式接触甚至很可能从未见过面的志愿者。S3C 是我们的安全软件供应链,您还可以获得我们独特的漏洞洞察。
接下来,让我们更仔细地看看供应链。
在 Anaconda,我们采用整体方法来保障供应链的安全。此图表显示,软件包的生命周期中存在多个阶段。此幻灯片的关键要点是,这些阶段中的每一个阶段都可能是网络攻击的潜在入口点。这就是为什么确保链条中每个环节的安全至关重要的原因。
现在,让我们仔细看看并进行更深入的探讨。借助 Anaconda 技术栈,我们从我们在开源世界的专业知识开始。Python、AI、机器学习和数据科学是我们的核心业务。从第一天起就是这样,所以这已成为我们 DNA 的一部分。我们是 Anaconda、Bokeh、conda、Dask、Jupyter 等项目的维护者和贡献者。这种专业知识使我们能够充分进行尽职调查和审查。在这里,您可以抵御诸如废弃软件、域名抢注和星标劫持之类的问题。
我们的软件包是从源代码构建的,这一点非常重要,因为源代码是一个可验证的起点。我们使用最佳实践构建软件包,这由专业的工程师完成。我们的构建系统实施纵深防御。这意味着我们有多层防御:硬件、软件和多个人员。这使得攻击者更难入侵我们。
我们的二进制文件在发布前会进行暂存和签名。当它们发布时,会被发布到由 Anaconda 管理的存储库中。换句话说,不是任何人都可以随意上传任何东西。从那里,您可以镜像到您的私有存储库,该存储库可以驻留在云端或本地。
您还可以应用自定义筛选,例如使用 CVE 阈值和许可证过滤器。这就是纯 Anaconda 堆栈的样子。
[15 分钟] 接下来,让我们看一下第三方供应商工具以进行比较。第三方供应商工具的问题在于,它们实际上只在供应链的末端才介入。这就是为什么我们看到所有这些红色的“不适用”,因为它们对早期的环节没有任何作用。
典型的起点将是存储库。但关于存储库的问题是,它们的好坏取决于它们提供的软件包。因此,如果您从社区存储库镜像软件包,而这些社区存储库本身已声明它们不安全,那么这不会创建安全的供应链。更复杂的是,软件在其生命周期的这个阶段是二进制形式,难以进行软件成分分析;很难检查。因此,我们从“脏”的状态开始,然后尝试使用 CVE 扫描器等工具进行“清洁”筛选。
但正如我们在接下来的幻灯片中将看到的,第三方 CVE 扫描器是不可靠的。因此,这种从“脏”的状态开始,然后尝试“清洁”筛选的通用方法不会产生良好的结果。
那么这是否意味着您不应该使用第三方工具?如果您已经在使用第三方工具,这是否意味着您需要重新设计整个架构?
不;这是一个您可以使用的混合解决方案。您可以获得 Anaconda 所有安全环节的优势,如果您从我们的公共存储库镜像到您的私有第三方存储库,并从那里使用软件包,那么您就拥有了一个安全的供应链。
因此,Anaconda 在确保每个环节的安全方面都非常谨慎。我们还希望对链条中的最后一个环节应用同样的谨慎,即软件实际安装到您的系统上时。这就是 conda 签名验证的用武之地。
因此,conda 签名验证是我们对内容信任的实现,这是一种确保软件是防篡改的,并且与在我们安全的网络上构建时完全一致的机制——无论传输介质如何。那么什么是传输介质呢?在大多数情况下,这将是互联网或 HTTPS。
但是对于对安全性极其敏感且不信任互联网的客户,我们可以给您寄送一个驱动器。具体而言,当您执行 conda 安装时,会有一个清晰的消息指示软件包和元数据已由 Anaconda 签名,并且可以信任。
我们已经确保了链条中每个环节的安全。即便如此,软件仍然可能存在错误,其中一些错误将是安全漏洞。这就是 CVE 的意义所在。CVE 是 Common Vulnerabilities and Exposures(通用漏洞和披露)的缩写,它是一种识别和编目安全漏洞的方式。我们从美国国家标准与技术研究院的国家漏洞数据库 (NVD) 开始,并执行我们内部的管理流程。
此流程的目的是改进 CVE 数据,以便我们可以为您提供准确的 CVE 报告。此流程的关键组成部分是人工管理。Anaconda 工程师会在其中审查软件包及其相关的 CVE。
您可能想知道,为什么是人工管理?为什么不将整个过程自动化?为了回答这个问题,让我们看几个例子。
在左侧,我们看到来自 NIST NVD 的数据,事实证明这些数据是完全错误的。换句话说,存在数据质量问题。
Anaconda 在右侧所做的是,首先,我们清除了 Python,因为它不受 CVE 的影响。我们添加了评论,解释了我们是如何得出这个结论的。我们还包括参考文献来支持我们的结论。
此信息非常有用,因为如果您需要做出安全例外来引入 Python——您将需要这样做,因为 Python 本身就是核心语言——那么拥有此信息将有助于您正确记录和证明您的安全覆盖是合理的。
在下一个示例中,NIST NVD 没有错。但它们也不是完全正确。这是因为 Anaconda 反向移植了一个补丁。换句话说,您从 Anaconda 获得的 libxml2 版本实际上并未暴露于 CVE。这是一个例子,说明了我们如何能够提供独特的见解,因为我们实际上是在构建软件包。
[20 分钟] 我们刚刚看到的两个例子都是相当详细的例子,但它们是误报如何发生的例子。误报是虚假警报。这些可能看起来只是令人讨厌的噪音,但实际上,它们确实会产生现实世界的影响。在我们与客户存储库合作的经验中,我们发现审查误报会花费大量时间,很容易达到 33 周左右。这超过了半年的生产力损失。
此外,我们还必须考虑心理学和用户行为。如果我们不断发出虚假警报,人们会产生警报疲劳并忽略我们。正如伊索在他关于狼来了的寓言中警告我们的那样,当真正发生坏事时,这将成为一个问题。好消息是,通过 Anaconda 的 CVE 管理,我们为您消除了这些负担。
您在 CVE 中会发现的另一类问题是误报。这是指安全扫描返回“清洁”,不是因为没有问题,而是因为未能检测到问题。这很危险,因为它会产生虚假的安全感。我们的研究发现,即使是最流行的第三方 CVE 工具也无法正确扫描编译后的软件包。
什么是编译后的软件包?这些是使用 C++ 和 Fortran 等语言构建的库。一些例子包括 NumPy、pandas、PyTorch 和 TensorFlow。此类软件包是 AI、机器学习和数据科学的重要组成部分。因此,未能正确扫描此类软件包是一个非常重要的安全盲点。
为什么二进制文件难以扫描?原因是,为了使源代码转换为可调用的库或可执行二进制文件,它必须经历一系列转换:编译、链接和剥离。而这一系列转换并非完全可逆。
例如,当您剥离符号名称时——符号名称可以是函数名称——这种删除是最终的。一旦它消失了,它就消失了。因此,转换并非完全可逆。这就是为什么很难确切地说出二进制文件包含什么。
直观地说,在左侧,源代码是人类可读的。但在右侧,这就是二进制文件的样子。您可以想象,检查这个并试图找出其中可能嵌入了哪种恶意软件或安全漏洞是具有挑战性的。
事实上,一些第三方 CVE 扫描器甚至懒得查看这些二进制文件内部,因此它们只进行浅层扫描。更高级的扫描器可能会使用启发式方法。启发式方法是一种有根据的猜测,但猜测仍然只是猜测。这就是为什么我们看到第三方 CVE 扫描器的性能不佳。
那么 Anaconda 如何处理这个问题呢?我们实际上是通过从供应链的更上游开始,并如我们所见,从源代码构建软件包来绕过这个逆向转换问题。换句话说,我们确切地知道使用哪个源代码来生成哪个二进制文件,因此可以明确地识别该二进制文件中的组件。
我们不必依赖启发式方法。我们不必猜测。然后,我们将组件列表与我们管理的 CVE 数据库进行交叉引用,并生成准确的 CVE 报告。这实际上是 Anaconda 的独特价值主张,因为我们从软件包生命周期的最开始就着手,确保每个环节的安全,并从最初到安装的每个环节进行追溯。这就是我们如何向您保证软件包的出处并为您提供独特的安全洞察力。
以上是 Anaconda 所做工作的概述。接下来,让我们谈谈您可以做什么。
[25 分钟] 这里有一些最佳实践。
1. 确保您的整个链条安全并左移。 此幻灯片上有两个成语。第一个是“链条的强度取决于其最薄弱的环节”。环节是不可替代的。这实际上是人们常犯的一个错误,他们认为强大的环节会在某种程度上弥补薄弱的环节。
一个具体的例子是存储库。您可以购买市面上最花哨、最昂贵的存储库,但存储库的好坏取决于它提供的软件包。因此,如果您使用您花哨的存储库从不受信任的来源镜像,那么这不会创建安全的供应链。它会让您容易受到攻击。因此,强大的环节确实不可能弥补薄弱的环节。这就是为什么确保链条中的每个环节都至关重要。
另一个成语是“预防胜于治疗”。您在右侧看到的是一个受损的系统,具有广泛的部署。清理受损系统既耗时又昂贵,更不用说违规本身的影响,这可能包括数据丢失和声誉损害。因此,我们想做的是进入供应链的早期环节并采取预防措施——换句话说,防止这种混乱首先发生。这就是我们所说的左移。
2. 用纵深防御来应对不完美。 现实情况是,安全工具存在漏洞。我们已经做了大量的研究,并且还在继续研究,我们还没有找到没有缺陷的 CVE 扫描器。那么您能做什么呢?一种策略是通过组装互补的工具来降低风险。
这有时被称为瑞士奶酪模型。那么您如何识别互补的工具呢?您将必须了解细微差别。例如,CVE 扫描器是通用的还是专业的?通用 CVE 扫描器的优点是它们为许多不同的工件类型提供广泛的覆盖范围。但它们的准确性也不是很高。
对于 Anaconda 的 CVE 解决方案,我们的专长和重点是 Python。这包括所有那些对 AI、机器学习和数据科学至关重要的复杂编译软件包。因此,您必须了解工具的不同优势和劣势,才能弄清楚它们如何互补。
还需要注意的一点是,供应链是一个非常热门的话题,并且有很多营销和炒作。因此,您必须成为一个有辨别力的消费者。例如,如果供应商正在推销一种声称可以保护您的供应链的工具,您将必须了解:供应商在供应链中的角色和有效范围是什么?例如,如果他们只提供 CVE 工具,但不构建软件包,他们如何知道软件包是否已被修补?
如果他们不知道软件包是否已被修补,他们将如何为您提供准确的 CVE 报告?同样,如果供应商不管理 CI/CD 系统(这是用于构建软件包的系统),那么他们将如何保护它?一个人如何保护他们甚至没有参与的过程?
因此,这些是您在评估各种工具并设计安全 AI 架构时需要知道答案的一些关键问题。
随着 AI 变得越来越重要,确保其供应链的安全也变得越来越重要。这不仅是因为 AI 的重要用例,而且还仅仅是因为随着 Python 部署的增长,潜在攻击的表面积也在增长。因此,确保 Python 组件的供应链安全变得更加重要。
世界一流的组织信任 Anaconda 作为最佳解决方案。因此,请利用 Anaconda,因为我们提供的是 AI 的可信构建模块——以便您可以专注于您的战略差异化因素。
就是这样。我们希望本次会议对您有所帮助。如果您想了解更多信息,请联系我们。感谢您的收听。