Gradio 5安全审计:揭秘Hugging Face ML框架的漏洞与加固

本文详细介绍了Trail of Bits对Hugging Face Gradio 5框架的安全审计过程,发现包括SSRF、XSS、任意文件泄露等8个高危漏洞,并探讨了安全加固方案及SDLC集成建议。

Auditing Gradio 5, Hugging Face’s ML GUI framework

The Trail of Bits Blog
October 10, 2024
machine-learning

这是与Hugging Face Gradio团队的联合发文;请在此处阅读他们的公告!您可以在此处找到我们针对Gradio 5安全审计的完整报告,包含所有详细发现。

Hugging Face聘请Trail of Bits对Gradio 5进行审计,这是一个流行的开源库,提供Web界面,让机器学习(ML)开发者快速展示他们的模型。基于审计发现和建议,Gradio在所有部署场景中增强了应用程序的安全默认设置。最终用户现在可以依赖增强的内置安全措施,无论他们是在本地运行应用、部署在Hugging Face Spaces或其他服务器上,还是使用内置分享链接。

Gradio团队对我们的工作质量和速度给予了高度评价:

Trail of Bits安全团队非常出色,审查在速度和深度上超出了我们的期望。在两周内,他们不仅熟悉了我们相对较大的代码库(涵盖Python、JavaScript和Go),还识别了许多安全漏洞,这些漏洞需要深入理解Gradio和Hugging Face在实际中如何用于构建机器学习应用。最重要的是,他们与我们迭代开发了缓解策略,解决了安全问题,同时不牺牲对许多Gradio开发者至关重要的易用性。

我们的审查在Gradio 5发布前发现了八个高危问题,包括支持分享机器学习模型和界面到世界的Gradio部署基础设施中的漏洞。我们还发现了特定Gradio服务器配置中的SSRF、XSS和任意文件泄露等漏洞。我们不仅止于发现漏洞;还提供了预防未来漏洞的建议,例如将静态和动态分析集成到SDLC中,并为关键函数创建模糊测试。

经过审计后的修复审查,我们确信所有报告的问题都已充分解决,不会对2024年10月9日发布的最新版本Gradio 5构成风险。如果您运行的是旧版本Gradio,请在命令行中运行pip install --upgrade gradio来更新您的应用程序。

本博客文章将涵盖Gradio的功能、我们的审计过程以及审计期间的一些发现。您也可以阅读完整报告

Gradio

Gradio是一个框架,为构建基于Web的机器学习应用程序提供简单易用的界面。它使开发者能够仅用几行代码创建交互式和可分享的演示,无需任何先前的Web开发经验。Gradio在机器学习从业者中非常流行,在PyPi上每月有超过610万次下载,作为非常流行项目的引擎,如Stable-diffusion-webui(在GitHub上有141k星)和text-generation-webui(在GitHub上有40k星)。

让我们看看如何实现最简单的Gradio界面。

1
2
3
4
5
6
7
import gradio as gr

def greet(name):
    return "Hello " + name + "!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch()

这段代码指定一个文本组件作为输入,一个名为greet的函数来转换输入,另一个文本组件作为输出。运行它会创建以下网站。

Gradio界面基于输入组件、用户定义的Python函数(转换输入)和输出组件(渲染这些转换)构建。每个输入组件都有一个预处理函数,负责将用户输入转换为用户定义Python函数接收的类型(例如,将Image转换为numpy数组),每个输出组件都有一个后处理函数,执行反向操作(例如,将numpy数组转换为Image组件)。下图直观地展示了这个过程。

Gradio包含许多预构建组件,如TextBox、Image、FileExplorer,甚至完整的Chatbot,这使得它开箱即用非常容易。

另一个让Gradio脱颖而出的特性是您可以轻松地与同事或全世界分享您的演示。用户可以通过简单地调用launch函数并设置share=True来在线暴露他们的Gradio演示,这会创建一个隧道到他们的机器,并使用frp外部暴露Gradio服务器。我们将在下一节中看到更多关于如何工作的细节。

我们的审计和发现

保护Gradio需要深入思考用户体验(UX)。鉴于其简单性,不能期望Gradio用户设置CORS和CSP策略或cookie属性。此外,Gradio不是一个具有具体任务和明确定义威胁模型的“简单”后端服务器;Gradio是一个灵活的框架,支持许多用例(例如,认证与非认证服务器、本地与共享服务器、将演示嵌入其他网站的能力等)。这些原因使得实现适用于每个用例的安全默认设置更加困难。因此,我们与Gradio团队紧密合作,找到了不影响开发者体验的解决方案和安全默认设置。

在审计开始时,我们将其分为两个主要任务:审查Gradio服务器实现和分享基础设施。

Gradio服务器

考虑到服务器可能外部暴露,从用户机器任意文件泄露等漏洞可能具有严重后果。

在审查Gradio服务器时,我们旨在回答以下非详尽列表问题:

  • 攻击者能否从用户的Gradio服务器外泄任意文件?
  • 攻击者能否将文件上传到用户Gradio服务器上的任意位置?
  • 攻击者能否在用户的内部网络上发出任意请求?
  • 任何Gradio API端点、组件的预处理和后处理函数或组件的@server函数是否容易受到注入攻击,可能导致远程代码执行或任意文件外泄?
  • 攻击者能否绕过Gradio的服务器认证机制?

在我们的审查中,我们发现了六个高危发现,可能在特定场景中危害用户的Gradio服务器,包括:

  • TOB-GRADIO-1和TOB-GRADIO-2:服务器CORS策略中的错误配置,在认证Gradio服务器上下文中,允许攻击者窃取访问令牌并在受害者访问恶意网站时接管其账户。
  • TOB-GRADIO-3:基于GET的完整读取SSRF,允许攻击者发出请求并读取来自任意端点(包括用户内部网络上的端点)的响应。
  • TOB-GRADIO-10:任意文件类型上传,允许攻击者在用户的Gradio服务器上托管HTML和XSS负载。在认证Gradio服务器上下文中,攻击者可以利用此漏洞在受害者访问恶意网站时接管用户账户。
  • TOB-GRADIO-13:竞争条件,允许攻击者重定向用户流量到他们的服务器,并窃取上传的文件或聊天机器人对话。
  • TOB-GRADIO-16:几个组件的后处理函数可能允许攻击者在非常简单的Gradio服务器配置中泄露任意文件。

分享功能

即使Gradio服务器完全安全,如果Gradio的分享架构存在缺陷,用户的数据仍可能被泄露。下图展示了分享功能如何架构:在步骤1中,Gradio从https://api.gradio.app/v3/tunnel-request获取frp服务器的主机和端口;然后,在步骤3中,它连接到Gradio拥有的frp服务器以建立隧道,使用户的演示可从互联网访问;最后,在步骤5中,其他用户可以连接到分享链接并访问演示。

在审查此分享功能时,我们旨在回答以下非详尽列表问题:

  • Gradio API和frp服务器是否配置正确且安全?
  • 分享链接是否足够随机,攻击者无法猜测?
  • frp服务器通信是否加密?

在我们的审查中,我们发现了两个可能危害整个分享基础设施的高危发现,以及其他可能危害用户数据机密性和完整性的发现,包括:

  • TOB-GRADIO-19:在Gradio API服务器上以root用户进行远程代码执行(RCE)。这允许攻击者在图的步骤2中提供恶意主机和端口,并将所有frp隧道重定向到记录所有用户流量(包括上传文件和聊天框对话)的恶意服务器。我们通过发现nginx错误配置获得了服务器root访问权限,该配置通过2376.gradio.app域暴露了对Docker API(在端口2376上服务)的访问。获取Docker API访问权限允许攻击者运行特权容器(--privileged),挂载主机文件系统(-v /:/host/),并完全危害主机。
  • TOB-GRADIO-11:frp客户端和frp服务器之间通信缺乏强加密,允许能够拦截请求(图中步骤6和7中的请求)的攻击者读取和修改往返frp服务器的数据。

Gradio API服务器代码库包含许多来自先前版本(不依赖frp)的遗留代码和配置。审计后,Gradio团队移除了所有遗留代码, resulting in a much smaller and cleaner codebase, reducing the risk of compromise. 此外,frp客户端和frp服务器之间的连接(图中连接6和7)现在已加密,防止攻击者嗅探和修改传输中的用户数据。

要点

Gradio团队通过完全实施我们的建议,展示了他们对安全的强烈承诺,包括系统性措施以防止整个类别的漏洞复发。

我们希望为Gradio提供一个坚实的基础来构建,而不是简单的漏洞修复列表。我们花费了大量时间咨询SDLC问题,以增加对软件开发过程的信任。Gradio团队实施了许多我们的建议,包括:

  • 在CI中集成安全测试工具,如Semgrep和CodeQL
  • 对关键函数实施模糊测试(我们在审计期间用此发现了真实问题)
  • 自动部署基础设施而非手动
  • 从代码库中移除未使用的代码、不必要的配置文件和冗余脚本,以增加其可维护性和可读性

我们感谢Gradio团队在整个审计过程中分享他们的广泛知识和专业知识。

我们对Gradio的审计强调了定期安全评估对于AI/ML领域快速发展的开源项目的重要性。这些系统通常面临与传统软件显著不同的独特漏洞,包括数据源和部署源问题。在开发过程早期识别和解决这些差异对于预防成本高昂、持久的缺陷和避免重复其他技术早期迭代中困扰的安全错误至关重要。

这次审查是我们与Hugging Face持续关系的一部分,此前我们审计了他们的AI SafeTensors库。在Trail of Bits,我们经常与客户合作,利用我们工程团队在多个项目中的专业知识。如果您有兴趣了解我们如何支持您的项目,请联系我们。

如果您喜欢这篇文章,请分享:
Twitter LinkedIn GitHub Mastodon Hacker News

页面内容
Gradio 我们的审计和发现 要点 近期文章
Trail of Bits’ Buttercup wins 2nd place in AIxCC Challenge
Buttercup is now open-source!
AIxCC finals: Tale of the tape
Prompt injection engineering for attackers: Exploiting GitHub Copilot
Uncovering memory corruption in NVIDIA Triton (as a new hire)
© 2025 Trail of Bits.
Generated with Hugo and Mainroad theme.

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计