深度解析Gradio 5安全审计:从SSRF漏洞到加密加固

本文详细记录了Trail of Bits对Hugging Face的Gradio 5框架的安全审计过程,发现包括SSRF、XSS、任意文件泄露等8个高危漏洞,并推动团队实施SDLC集成、模糊测试等系统性修复方案。

审计Gradio 5:Hugging Face的机器学习GUI框架

Trail of Bits与Hugging Face联合发布
2024年10月10日
机器学习

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

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服务器时,我们旨在回答以下非 exhaustive 问题列表:

  • 攻击者能否从用户的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中,其他用户可以连接到共享链接并访问演示。

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

  • 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领域快速发展的开源项目中进行定期安全评估的重要性。这些系统通常面临与传统软件显著不同的独特漏洞,包括数据 born 和部署 born 问题。在开发过程早期识别和解决这些差异对于预防昂贵、持久的缺陷和避免重复其他技术早期迭代中困扰的安全错误至关重要。

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

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

页面内容
Gradio | 我们的审计和发现 | 要点 | 最近帖子
构建安全消息传递很难:对Bitchat安全辩论的 nuanced 看法
用Deptective调查您的依赖项
系好安全带,Buttercup,AIxCC的评分回合正在进行中!
使您的智能合约超越私钥风险成熟
Go解析器中意外的安全 footguns
© 2025 Trail of Bits.
使用Hugo和Mainroad主题生成。

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