验证如何进行

在你的浏览器中检查。
密封到安全飞地。

你的浏览器检查什么,我们的中继能看到什么,以及你仍需信任我们的地方。

尚未经过独立评估

  • 先检查安全飞地

    我们如何知道

    在你发送第一条消息之前,Tinfoil 的开源验证器会在你的浏览器中检查由芯片签名的报告。报告无法验证,一切就会停止。

  • 在你的标签页中密封

    我们如何知道

    每个请求在发出之前,都会用 EHBP(HPKE、AES-256-GCM)加密至证明所指明的密钥。

  • 中继只看到字节

    我们如何知道

    我们的中继检查你的账户和额度,再把密文交给 Tinfoil 的主机。它能看到大小、时间和你的账户,不保留任何副本。

  • 每个回答一张收据

    我们如何知道

    在硬件允许的情况下,你的浏览器会检查给出回答的模型所在的安全飞地,并把结果与回答一起保存。

谁可能看到,又是什么阻止了他们。

  1. 网络

    剩余风险: 低
    能得到
    密封的字节、大小、时间
    阻止它的
    HTTPS,再密封至安全飞地
    仍未解决
    流量的大小和时间
  2. 我们的中继

    剩余风险: 中
    能得到
    你的账户、IP、大小、模型
    阻止它的
    在你的标签页中密封;它无法打开
    仍未解决
    它能看到的元数据
  3. 云主机

    剩余风险: 中
    能得到
    加密的安全飞地内存
    阻止它的
    AMD SEV-SNP 或 Intel TDX,已证明
    仍未解决
    硬件缺陷;Tinfoil 自己的声明
  4. 伪造的安全飞地

    剩余风险: 低
    能得到
    什么也得不到:标签页会拒绝它
    阻止它的
    证明,在你的浏览器中检查
    仍未解决
    验证过的代码不等于审查过的代码
  5. 被改动的网站代码

    剩余风险: 中
    能得到
    你在密封前输入的内容
    阻止它的
    构建清单、签名、你自己的构建
    仍未解决
    页面无法完全为自己担保
  6. 开发者 API

    剩余风险: 高
    能得到
    你的请求,在内存中
    阻止它的
    不存储、不记录,按我们的政策
    仍未解决
    你需要信任我们的网关

一台服务器的内部

安全飞地从哪里开始,到哪里结束。

滚动页面,拆开一台 GPU 服务器:哪些部分位于安全飞地边界之内,哪些留在边界之外。

  1. 散热盖覆盖在 GPU 芯片上的金属盖。
  2. GPU 裸片模型在这里运行。Tinfoil 的文档称,其 NVIDIA GPU(H100、H200 和 B200)在机密计算模式下运行。
  3. 高带宽内存存放模型的权重,以及正在作答时的你的请求。
  4. 机密虚拟机运行在服务器的处理器上(AMD SEV-SNP 或 Intel TDX):Tinfoil 的路由器和模型服务器,位于主机无法读取的内存中。它的芯片会为你的浏览器所检查的报告签名。
  5. 安全飞地边界硬件将主机隔绝在外的范围,也是证明所描述的范围。你的请求只在其中被打开。
  6. 主机主板、其虚拟机管理程序和驱动程序,以及运营它的人:都在边界之外。它只负责将密封的字节传进传出。

这是 Tinfoil 所运行机器类型的示意图,并非某一台具体机器的照片。Tinfoil 签名的版本记录列出了每个安全飞地的 CPU、内存和 GPU;工作区的“已验证”面板会显示它们。

阅读全文收起全文约 12 分钟,六张图

简而言之

Undergrove 在 Tinfoil 运营的硬件安全飞地中运行开放权重模型。这意味着的事情中,有些由你的浏览器自行检查;有些是 Tinfoil 的声明;还有些取决于我们。下面说明哪些属于哪一类。

你的浏览器检查

  • 安全飞地是真实的硬件,并运行着 Tinfoil 发布的代码。
  • 每个请求在离开你的标签页之前,都已密封到该安全飞地的密钥。
  • 对于每个回答的回执,在硬件允许的情况下,检查回答所用模型的安全飞地。

Tinfoil 声明

  • 它无法访问自己的安全飞地,并且安全飞地中的任何内容都不会在重启之间保留。
  • 它支持的 GPU 运行在机密计算模式下。

你需要信任我们的方面

  • 本站发送给你浏览器的代码,你可以将其与构建进行比对。
  • 中继如何处理它能看到的信息:大小、时间和你的账户。
  • 开发者 API 的网关,它会在内存中读取请求。

这些都尚未经过独立评估。

01 · 证明

芯片为代码作证。

硬件安全飞地是服务器中连其宿主都无法查看的部分:处理器会加密安全飞地的内存,并将宿主的软件挡在外面。仅凭这一点,它只是一个承诺。让它变得可检查的是证明。安全飞地启动时,处理器会度量它加载的代码,并用芯片制造商担保的密钥签署一份关于该度量值的报告。报告中还会指明安全飞地用于解密的公钥。

在你发送第一条消息之前,工作区会通过我们的服务器获取 Tinfoil 路由安全飞地的这份报告,并在你的浏览器中用 Tinfoil 的开源验证器对其进行检查。经由我们获取并不会改变什么:我们无法伪造芯片的签名,而一份未通过验证的报告会让一切停止。

Tinfoil 的安全飞地硬件报告处理器测量安全飞地启动时加载的代码,并用芯片制造商担保的密钥为其签署一份报告,报告中写明安全飞地的公钥。
GitHub 和 Sigstore已发布的版本Tinfoil 公开构建其开源代码,并将每个版本的度量值记录在 Sigstore 的公开透明度日志中。
你的浏览器Tinfoil 的开源验证工具对照芯片制造商的密钥检查报告的签名,检查该版本已签名的构建记录,并比对两个度量值。

两者匹配:请求会被密封到报告中写明的密钥。

任何一步失败:不会发送任何内容,工作区会说明原因。

图 1:你的浏览器会比对两样无需信任我们即可检查的东西:芯片对安全飞地中运行的代码所做的签名报告,以及 Tinfoil 为该代码发布的版本。只有两者匹配,它才会密封任何内容。

验证器的检查,按顺序

  1. 找到 Tinfoil 为这份代码发布的版本。
  2. 对照芯片制造商的签名密钥检查安全飞地的硬件证明报告。
  3. 检查该版本已签名的构建记录(Sigstore,来自 GitHub)。
  4. 比对:安全飞地中测得的代码必须与该版本完全一致。
  5. 检查加密密钥是否正是安全飞地的证明中写明的那一个。

通过验证的报告最多可重复使用十分钟,可在此标签页或本站的其他标签页中使用,而且只有在按 SHA-256 判断是完全同一份报告时才会重复使用。工作区会在“已验证”下显示每一项检查,架构页面展示了执行检查的代码。

02 · 密封

只有安全飞地能打开它。

安全飞地验证通过后,每个实时请求在离开之前都会在你的标签页中密封。它的正文使用 EHBP(Tinfoil 用于加密 HTTP 正文的协议)加密到证明所指明的密钥。EHBP 使用 HPKE,这是一种用对方公钥进行加密的标准:你的标签页为请求生成一个新的密钥对,将其与安全飞地的密钥组合成一个共享密钥,再用 AES-256-GCM 加密。

新生成的公钥部分作为封装密钥,与密文一起传输。只有安全飞地的私钥(它从不离开安全飞地)才能把它还原为共享密钥。回答也以同样的方式返回,装在密封的帧中,由你的标签页在流式传输时逐一打开。

你的标签页每个请求一个全新的密钥对它与安全飞地已验证的公钥结合,得出一个其他人无法推算出的密钥。
密文 + 封装密钥
Undergrove 中继原样转发不持有任何能打开它的密钥。
相同的字节
Tinfoil 的安全飞地打开它使用从不离开安全飞地的私钥。
图 2:EHBP 使用 HPKE 密封每个请求的正文:X25519、HKDF-SHA256 和 AES-256-GCM。回答也以密封形式流式返回,只在你的标签页中打开。亲手密封一条消息,观察每一步。

03 · 中继

它无法读取的字节。

密封的请求会发送到我们的中继(Vercel 上的一个函数),而不是直接发往 Tinfoil。中继检查是谁在请求、是否在其配额之内,并在请求上附加 Undergrove 的 Tinfoil 密钥,因此你不需要拥有 Tinfoil 账户。任何不是发往 Tinfoil 自有主机、或不带封装密钥的请求,它都会拒绝。

它无法统计你的字数,所以会根据密文的大小估算每个请求的费用,宁可估高。它不保留任何副本,其日志只记录路由名称、状态码和耗时。

外部:中继能看到的

  • 你的账户,以及你的 IP 地址(通过我们的托管服务商 Vercel)
  • 每个请求的大小、时间和路径
  • 由哪个模型作答,来自 Tinfoil 设置的一个请求头
  • 是否使用了网页搜索或图片(由你的浏览器声明),以便计费

密封在内:中继无法读取的

  • 你的消息和文件
  • 回答内容
  • 你的指令和记忆笔记
图 3:中继会拒绝任何未密封到 Tinfoil 自有主机的内容,换上我们的 Tinfoil 密钥后转发字节。由于无法统计字数,它按大小计费。看看中继眼中的一个请求。

04 · 回执

两个安全飞地,每个回答一份回执。

你的浏览器验证的路由安全飞地并不运行模型。它会打开你的请求,并将其传给模型连同 GPU 一起运行的那个安全飞地;路由器会依照其已发布的代码亲自验证该安全飞地,并在响应头中指明它。

然后,你的浏览器也会用同一个验证器检查这个被指明的安全飞地,依据的是 Tinfoil 路由器为该模型固定的代码仓库。检查结果会作为回执与回答一起保存:安全飞地、其中度量的代码、匹配的版本,以及请求密封所用的密钥。回执是你的浏览器自己的记录,并没有经过我们或 Tinfoil 的签名;但它背后的证明由 AMD 和 GitHub 签名,因此任何人都可以再次检查。

安全飞地 1Tinfoil 的路由器发送前已验证。打开请求。
安全飞地到安全飞地
安全飞地 2模型及其 GPU写在 tinfoil-enclave 响应头中。
再次检查
你的浏览器回答的回执随回答保留:安全飞地、测得的代码、版本和密钥。
已验证
真实的硬件,运行着 Tinfoil 的路由器为该模型固定的代码仓库的已发布版本。
未检查
浏览器验证工具暂时无法读取的硬件:它读取 AMD SEV-SNP 报告,因此运行在 Intel TDX 上的安全飞地会被记录为未检查。
未确认
检查已运行,但某一步失败了,例如某个安全飞地已经运行比 Tinfoil 服务所配对版本更新的版本。
图 4:Tinfoil 的路由器在其已发布代码的约束下自行验证模型的安全飞地,并在响应头中写明该安全飞地。你的浏览器会为回答的回执再次检查该安全飞地。该响应头不在加密范围内,因此这只能说明所写明的安全飞地是真实的,不能说明这个请求确实去了那里;这一跳依赖于路由器的已发布代码。

05 · 开发者 API

另一条路径,坦白说明。

调用开发者 API 的代码会通过 HTTPS 将请求发送到我们的网关,网关会读取它:用于检查、施加限额和运行工具。它在内存中读取请求,从不存储或记录。然后,网关会做你的浏览器在工作区中所做的事:用 Tinfoil 的 SDK 验证安全飞地,并将请求密封给它。

因此,在这条路径上,网关持有请求期间你需要信任我们。你仍然可以检查的是安全飞地:来自 Tinfoil 路由的每个回答都带有请求头,指明网关验证过的证明包,供你再次验证。开发者文档说明了具体方法。

工作区
你的浏览器先验证,再密封
中继无法读取
安全飞地打开它
开发者 API
你的服务器通过 HTTPS 发送
我们的网关在内存中读取以进行检查;从不存储或记录
安全飞地先由网关验证
图 5:通往同一批安全飞地的两条路径。在工作区中由你的浏览器密封;通过 API 时则由我们的网关密封,网关会先在内存中读取请求进行检查。来自 Tinfoil 安全飞地的每个 API 回答都会写明网关验证过的证明包,你可以通过 GET /v1/attestation?sha256= 获取它并再次检查。

06 · 本页面

检查执行检查的代码。

以上一切都运行在本站发送给你浏览器的代码中,所以这些代码同样重要。每次构建都会生成一份清单:本站提供的每个文件的 SHA-256,以及构建所用的提交。

页面无法完全为自己担保:在页面中运行的检查,诚实程度只能和页面本身一样。更有力的检查完全不需要我们参与:在固定的环境中亲自重新构建该提交,并比对清单。

构建一份清单网站提供的每个文件的 SHA-256,以及它们来自的提交。
随网站一同发布
你的浏览器对已加载的内容计算哈希任何不同的文件都会被列出。
或者,在你自己的机器上
任何人重新构建该提交并比对两份清单。
图 6:验证此页面会对你的浏览器加载的文件计算哈希,并与该构建及其提交的清单进行比对。在固定的环境中重新构建该提交(npm run rebuild:site)应当得到逐字节相同的清单;任何人都可以运行并比对,无需询问我们。

07 · 局限

这些不能证明什么。

  • Tinfoil 的声明仍然只是 Tinfoil 的声明。 它无法访问自己的安全飞地、安全飞地中的任何内容都不会在重启之间保留、它的 GPU 运行在机密计算模式下,这些都是 Tinfoil 的说法。你的浏览器检查的是硬件是否真实,以及是否运行着已发布的代码。
  • 硬件也是你所信任的一部分。 保护的强度取决于处理器、其固件和芯片制造商的密钥,而硬件安全飞地过去也曾被公开披露过漏洞。
  • 有一段路程依赖已发布的代码。 你的请求从路由器到达模型的安全飞地,这一点依赖于路由器已发布的代码。你的浏览器只能检查运行在 AMD SEV-SNP 上的模型安全飞地;在 Intel TDX 上则记录为未检查。
  • 中继能看到外部信息。 你的账户、你的 IP 地址、大小、时间,以及是哪个模型回答的。
  • 已发布不等于已审查。 验证器能说明运行的是哪份代码,但不能说明代码没有缺陷。
  • 尚无独立评估。 到目前为止,还没有审计方审查过这一设计或其代码。

要逐一了解每个观察者能看到什么,请阅读威胁模型。

08 · 更进一步

看看每个部分如何运作。