评估广泛使用的视觉模型安全状况:YOLOv7 - Trail of Bits博客
Alvin Crighton, Anusha Ghosh, Suha Hussain, Heidy Khlaaf, JimMiller
2023年11月15日
机器学习
TL;DR: 我们在流行计算机视觉框架YOLOv7中发现了11个安全漏洞,这些漏洞可能导致远程代码执行(RCE)、拒绝服务和模型差异(攻击者可在不同场景下触发模型产生不同行为)等攻击。
开源软件为许多广泛使用的ML系统提供了基础。然而,这些框架开发速度过快,往往以牺牲安全性和稳健性为代价。此外,这些开源模型和框架并非专门为关键应用设计,却因势头或流行度而被大规模采用。这些软件项目中很少经过严格审查,导致潜在风险增加,出现未识别的供应链攻击面,影响模型及其相关资产的机密性、完整性和可用性。例如,ML生态中广泛使用的pickle文件可被利用实现任意代码执行。
鉴于这些风险,我们决定评估流行且成熟的视觉模型YOLOv7的安全性。本文分享并讨论了我们的审查结果,包括轻量级威胁模型和安全代码审查,我们的结论是YOLOv7代码库不适用于关键任务应用或需要高可用性的应用。完整公开报告链接见此处。
免责声明: YOLOv7是学术成果。学术原型并非为生产环境准备,也不具备适当的安全卫生,我们的审查并非批评作者或其开发选择。然而,与许多ML原型一样,它们已被生产系统采用(例如YOLOv7被Roboflow推广,拥有3.5k分叉)。我们的审查仅旨在揭示使用此类原型而未经进一步安全审查的风险。
根据我们的负责任披露政策,我们联系了YOLOv7仓库的作者,告知他们我们发现的问题。未收到回复,但我们提出了具体解决方案和更改以缓解已识别的安全漏洞。
什么是YOLOv7?
You Only Look Once (YOLO)是最先进的实时物体检测系统,其高精度和良好性能的结合使其成为嵌入关键任务应用(如机器人、自动驾驶汽车和制造)中的视觉系统的热门选择。YOLOv1最初于2015年开发;其最新版本YOLOv7是由Academia Sinica开发的YOLO开源代码库修订版,实现了相应的学术论文,概述了YOLOv7如何优于基于transformer和基于卷积的物体检测器(包括YOLOv5)。
该代码库拥有超过3k分叉,允许用户提供自己的预训练文件、模型架构和数据集来训练自定义模型。尽管YOLOv7是学术项目,YOLO是物体检测的事实算法,常被商业和关键任务应用使用(例如由Roboflow使用)。
我们的发现
我们的审查识别了五个高严重性和三个中严重性发现,我们将其归因于以下不安全实践:
- 代码库未以防御性方式编写;没有单元测试或测试框架,输入验证和清理不足。
- 完全信任可从外部源获取的模型和配置文件。
- 代码库危险且不必要地依赖宽松函数,引入了RCE向量。
下表总结了我们的高严重性发现:
问题描述 | 影响 |
---|---|
YAML解析导致RCE | 远程代码执行 |
Pickle文件使用 | 任意代码执行 |
输入验证不足 | 拒绝服务 |
缺乏测试框架 | 代码质量低下 |
依赖过时协议 | 安全风险 |
常见做法是从外部源(如PyTorch Hub)下载数据集、模型pickle文件和YAML配置文件。为在目标机器上破坏这些文件,攻击者可将恶意文件上传到这些公共源之一。
构建威胁模型
对于我们的审查,我们首先进行了轻量级威胁模型以识别威胁场景和最关键的组件,进而指导我们的代码审查。我们的方法借鉴了Mozilla的“快速风险评估”方法和NIST的以数据为中心的威胁建模指南(NIST 800-154)。我们审查了YOLO学术论文、YOLOv7代码库和用户文档,以识别所有数据类型、数据流、信任区(及其连接)和威胁参与者。然后使用这些工件开发全面的威胁场景列表,记录系统中存在的每个可能威胁和风险。
威胁模型考虑了ML流水线的独特架构(相对于传统软件系统),由于ML生命周期和流水线中的新攻击面(如数据收集、模型训练和模型推理与部署)而引入了新颖的威胁和风险。相应的威胁和失败可能导致模型性能下降、数据收集和处理被利用以及输出被操纵。例如,从不可靠或不安全源下载数据集可能导致数据集中毒和模型性能下降。
因此,我们的威胁模型旨在检查ML特定的入口区域,并概述YOLOv7代码库的重要子组件。基于对YOLOv7工件的评估,我们构建了以下数据流图。
图1:轻量级威胁模型中生成的数据流图
请注意,此图和我们的威胁模型不针对特定应用或部署环境。我们识别的场景旨在聚焦于开发人员在其生态系统中部署YOLOv7之前应考虑的一般ML威胁。我们总共识别了十二个威胁场景,涉及三个主要威胁:数据集泄露、主机泄露和YOLO进程泄露(例如将恶意代码注入YOLO系统或其依赖项之一)。
代码审查结果
接下来,我们对YOLOv7代码库进行了安全代码审查,重点关注威胁模型威胁场景中识别的最关键组件。我们使用了手动和自动化测试方法;我们的自动化测试工具包括Trail of Bits的自定义Semgrep规则仓库,这些规则针对PyTorch等ML框架的误用,并在YoloV7代码库中识别了一个安全问题和一个代码质量问题。我们还使用了TorchScript自动跟踪检查工具来自动检测跟踪模型中的潜在错误。最后,我们在代码库中使用了公共Python CodeQL查询,并识别了多个代码质量问题。
总共,我们的代码审查发现了十二个安全问题,其中五个为高严重性。审查还发现了十二个代码质量发现,作为增强代码库质量和可读性以及防止未来漏洞引入的建议。
所有这些发现都表明系统未以防御性视角编写或设计:
- 五个安全问题可能单独导致RCE,大多数由不必要且危险地使用宽松函数(如subprocess.check_output、eval和os.system)引起。参见以下示例亮点。
- 用户和外部数据输入验证和清理不足。多个问题允许拒绝服务攻击,如果最终用户可以控制某些输入,如模型文件、数据集文件或配置文件(TOB-YOLO-9、TOB-YOLO-8、TOB-YOLO-12)。例如,代码库允许工程师提供自己的配置文件,无论它们代表不同的模型架构还是预训练文件(鉴于YOLO模型架构的不同应用)。这些文件和数据集被加载到训练网络中,使用PyTorch训练模型。为了更安全的设计,需要大幅减少对外部输入的信任,并仔细清理和验证这些值。
- 代码库中目前没有单元测试或任何测试框架(TOB-YOLO-11)。适当的测试框架本可以防止我们发现的一些问题,而没有这个框架,代码库中可能存在其他实现缺陷和错误。此外,随着系统继续发展,没有任何测试,代码回归很可能发生。
以下,我们重点介绍一些高严重性发现的细节,并讨论它们对基于ML的系统的影响。
安全代码审查亮点 #1:YAML解析如何导致RCE
我们最显著的发现是关于YAML文件的不安全解析可能导致RCE。与许多ML系统一样,YOLO使用YAML文件指定模型架构。不幸的是,YAML解析函数parse_model通过调用eval对文件的未验证内容进行解析,如以下代码片段所示:
图2:models/yolo.py中parse_model的片段
如果攻击者能够操纵目标用户使用的这些YAML文件之一,他们可以注入恶意代码,在解析期间执行。这尤其令人担忧,因为这些YAML文件通常从第三方网站获取,这些网站托管这些文件以及其他模型文件和数据集。复杂攻击者可以破坏这些第三方服务或托管资产之一。然而,如果仔细且经常检查这些YAML文件,可以检测到这个问题。
鉴于这个发现的潜在严重性,我们提出了一个替代实现作为缓解措施:通过将配置文件中定义的给定架构重写为调用标准PyTorch模块的不同块类,完全消除对parse_model函数的需求。此重写有几个目的:
- 消除了对未清理输入调用eval的固有漏洞。
- 块类结构更有效地复制了实现论文中提出的架构,允许更容易复制给定架构和定义类似结构的后续迭代。
- 提供了一个更可扩展的基础来继续定义配置,因为这些类很容易根据用户设置的不同参数进行修改。
我们提议的修复可以在此跟踪。
安全代码审查亮点 #2:ML特定漏洞和改进
如前所述,ML框架正在导致针对模型及其相关资产的机密性、完整性和可用性的新颖攻击途径增加。我们在安全评估期间发现的ML特定问题亮点包括:
- YOLOv7代码库使用pickle文件存储模型和数据集;这些文件未经验证,可能从第三方源获取。我们先前发现,pickle文件在ML生态中的广泛使用是一个安全风险,因为pickle文件允许任意代码执行。为了反序列化pickle文件,一个称为Pickle Machine (PM)的虚拟机将文件解释为一系列操作码。PM中包含的两个操作码GLOBAL和REDUCE可以在PM之外执行任意Python代码,从而实现任意代码执行。我们构建并发布了fickling,一个用于逆向工程和分析pickle文件的工具;然而,我们进一步建议ML实现使用更安全的文件格式,如safetensors。
- YOLOv7跟踪其模型的方式可能导致模型差异——即,正在部署的跟踪模型的行为与原始未跟踪模型不同。特别是,YOLO使用PyTorch的torch.jit.trace将其模型转换为TorchScript格式进行部署。然而,YOLOv7模型包含许多跟踪器边缘情况:跟踪未准确捕获的模型元素。最显著的发生是包含输入依赖控制流。我们使用TorchScript的自动跟踪检查器通过生成一个输入来确认这种分歧,该输入根据模型是否被跟踪而产生不同输出,这可能导致后门。攻击者可以发布一个模型,仅在跟踪时表现出特定的恶意行为,使其更难被发现。
具体建议和缓解措施在我们的报告中概述。
增强YOLOv7的安全性
除了识别的代码审查问题外,需要一系列设计和操作更改以确保足够的安全状况。我们报告中提供的战略建议列表亮点包括:
- 实施适当的测试框架,包括全面的单元测试和集成测试
- 移除高度宽松函数的使用,如subprocess.check_output、eval和os.system
- 改进代码库的开发过程
- 强制使用安全协议,如HTTPS和RMTPS,当可用时
- 持续更新依赖项以确保应用上游安全修复
- 向用户提供文档,说明使用来自不可靠训练数据或网络摄像头流数据时的潜在威胁
尽管识别的安全漏洞对于学术原型可能可接受,我们不建议在关键任务应用或领域中使用YOLOv7,尽管存在现有用例。对于已经使用和部署YOLOv7的受影响最终用户,我们强烈建议在对YOLOv7的设计和维护进行推荐更改之前,不允许最终用户提供数据集、模型文件、配置文件
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码