评估广泛使用的视觉模型安全状况:YOLOv7
摘要:我们在流行计算机视觉框架YOLOv7中发现11个安全漏洞,可导致远程代码执行(RCE)、拒绝服务和模型差异等攻击。开源ML框架快速发展但缺乏安全实践,这些风险影响模型机密性、完整性和可用性。
YOLOv7背景
YOLO(You Only Look Once)是最先进的实时目标检测系统,自2015年发布以来,其高精度和良好性能使其成为机器人、自动驾驶等关键应用的首选。YOLOv7由中科院开发,是YOLO的开源代码库实现,性能超越基于Transformer和卷积的目标检测器。
该代码库有超过3k分支,允许用户提供自定义预训练文件、模型架构和数据集。尽管是学术项目,YOLO已成为目标检测的事实标准,被Roboflow等商业和关键应用采用。
发现内容
评审发现5个高危和3个中危问题,源于以下不安全实践:
- 代码库缺乏防御性编写,无单元测试框架,输入验证不足
- 完全信任从外部获取的模型和配置文件
- 危险使用权限函数引入RCE向量
高危发现包括:
- 从PyTorch Hub等外部源下载数据集、模型pickle文件和YAML配置文件是常见做法。攻击者可通过污染这些文件危害目标机器。
威胁模型构建
采用Mozilla"快速风险评估"和NIST 800-154数据为中心威胁建模方法。评审YOLO学术论文、代码库和用户文档,识别数据类型、数据流、信任区域和威胁参与者。威胁模型考虑ML流水线独特架构,引入数据收集、模型训练和部署等新攻击面。
构建的数据流图显示三个主要威胁:数据集泄露、主机泄露和YOLO进程泄露(如向系统或依赖注入恶意代码)。
代码评审结果
通过手动和自动测试(包括自定义Semgrep规则、TorchScript跟踪检查工具和Python CodeQL查询),共发现12个安全问题(5个高危)和12个代码质量问题。所有发现表明系统缺乏防御性设计:
- 五个安全问题可单独导致RCE,主要源于不必要使用
subprocess.check_output、eval和os.system等权限函数 - 用户和外部数据输入验证不足,多个问题允许拒绝服务攻击(如TOB-YOLO-9,8,12)
- 代码库无单元测试框架(TOB-YOLO-11),缺乏防止问题复现和回归的机制
安全代码评审重点#1:YAML解析导致RCE
最显著发现是不安全YAML文件解析可能导致RCE。YOLO使用YAML文件指定模型架构,但parse_model函数通过调用eval解析未验证文件内容。攻击者操纵YAML文件可在解析时执行恶意代码,尤其危险的是这些文件常从第三方网站获取。
建议缓解措施:重写配置文件定义的架构为调用标准PyTorch模块的块类,消除eval漏洞,更好复制论文架构并提供可扩展基础。
安全代码评审重点#2:ML特定漏洞和改进
ML框架导致针对模型及相关资产机密性、完整性和可用性的新攻击途径增加:
- YOLOv7使用pickle文件存储模型和数据集,这些文件未验证且可能来自第三方。pickle文件允许任意代码执行,建议使用safetensors等更安全格式
- YOLOv7模型跟踪方式可能导致模型差异:部署的跟踪模型行为与原始模型不同。YOLO使用
torch.jit.trace将模型转换为TorchScript格式,但包含许多跟踪器边缘案例(如输入相关控制流)。攻击者可发布仅在跟踪时表现恶意行为的模型,增加检测难度
增强YOLOv7安全性
除代码问题外,需要一系列设计和操作更改确保足够安全状况:
- 实施包含全面单元测试和集成测试的测试框架
- 移除高权限函数使用
- 改进代码库开发流程
- 强制使用安全协议(如HTTPS和RMTPS)
- 持续更新依赖项应用上游安全修复
- 提供用户文档说明使用不可信训练数据或网络摄像流时的潜在威胁
尽管已存在使用案例,不建议在关键应用或领域使用YOLOv7。受影响终端用户应在设计维护完成推荐更改前,禁止用户提供数据集、模型文件、配置文件等外部输入。
协调披露时间线
尽管多次尝试,未能与维护者建立联系协调修复。截至博客发布,问题仍未修复。披露时间线如下:
- 2023年5月24日:通知维护者意图评审代码库
- 2023年6月9日:通知已开始审计
- 2023年7月10日:通知有多个安全发现请求讨论
- 2023年7月26日:告知官方安全披露通知发布日期8月21日
- 2023年11月15日:发布披露博客并向原始项目库提交问题