提示词注入与数据外泄
English | 中文
概述
模型读到的任何文字都可能夹带指令:网页、仓库里的文件、issue、软件包的 README、工具的输出或另一个 chat。模型无法可靠地把这些指令与你自己的指令区分开,Delo 也不能。能把文字放到模型面前的攻击者,可以要求它找出私密数据,并把数据发送到攻击者能读取的地方。Delo 不阻止模型读取这类文字,而是让你拿走出去的路:每个工作区都有一个网络设置,open、allowlist 或 off,限制该工作区沙箱中的命令和 web_fetch 能到达哪里。本页说明每种设置关闭了什么、无论怎样选择仍然开放的途径,以及如何选择。
目录
三个条件
一次数据外泄需要同时具备以下三者。去掉任何一个,它就会失败。
- 模型能接触到的私密数据。 工作区中的文件、
.env文件、命令能读取的主目录下的密钥、chat 自身的历史。在 Linux 和 macOS 上,Delo 的沙箱让命令无法进入 Delo 的 home(~/.delorun),但命令可以读取你的用户能读取的磁盘其余部分;在 Windows 上,它们还能读取 Delo 的 home。 - 到达模型的不可信内容。
web_fetch返回的页面、不是你写的文件、依赖的源码、issue 或拉取请求、命令的输出、MCP 服务器的回复。 - 出去的路。 把数据放到攻击者能读取之处的途径:向攻击者服务器发送请求的命令、URL 中携带数据的
web_fetch、发送数据的插件或 MCP 服务器,或者被放进你之后会分享的内容里的数据。
在实际工作中,前两项通常都存在。网络设置针对的是第三项。
网络设置
每个工作区有三种设置之一。你尚未为其选择的工作区使用默认值,除非你的配置另有规定,默认值为 open。
| 设置 | 沙箱中的命令 | web_fetch |
|---|---|---|
open | 可到达任何主机,与原版 DeepSeek Harness 相同 | 抓取任何公共地址;抓取防护拒绝私有、回环和链路本地地址 |
allowlist | 只能通过 Delo 的出站代理到达你列出的主机 | 只抓取主机在列表中的 URL |
off | 没有网络 | 被拒绝 |
该设置适用于模型在沙箱中运行的每个命令,无论 read-only 还是 workspace-write,包括终端、后台任务和 run_code 程序。在完全访问下运行的命令位于沙箱之外,无论设置如何都能访问网络。
在 allowlist 下,命令只能通过 Delo 运行的 HTTP 代理访问网络。命令的 HTTP_PROXY、HTTPS_PROXY 和 ALL_PROXY 变量指向它,大多数工具都会使用这些变量:curl、基于 HTTPS 的 git、npm、pip、cargo 以及 Node 自带的 HTTP 客户端。忽略这些变量的工具完全没有网络。该代理:
- 先把主机名和端口与列表比对,因此未列出的名称从不会被解析,命令也无法通过 DNS 查询把数据发送出去;
- 拒绝解析到私有、回环、链路本地或其他被抓取防护拒绝的地址的已列出名称,因此已列出的名称无法被指向你的路由器或你电脑上的服务;
- 只连接它检查过的地址,并用它检查过的主机名发送明文 HTTP 请求;
- 每个列表最多同时保持一定数量的连接,并关闭空闲的连接,二者都在
delorun-permission-defaults行中设置; - 对每次拒绝都回答一句指明主机的话,模型会读到它,并把拒绝写入 harness 的日志。
命令自己也无法解析名称:在 allowlist 和 off 下,沙箱会隐藏替程序解析名称或发送流量的服务的套接字,即 systemd-resolved、nscd、avahi、snapd、打印服务 CUPS、系统 D-Bus 和 Tailscale 的守护进程。需要系统 D-Bus 的命令,例如 systemctl、timedatectl 或 nmcli,或需要打印的命令,在这样的工作区中会失败。
条目可以是主机名,例如 registry.npmjs.org;可以是通配符,例如 *.npmjs.org,它匹配 npmjs.org 之下的每个名称,但不匹配 npmjs.org 本身;也可以是公共 IP 地址。条目允许端口 80 和 443;要允许其他端口,就在冒号后写出,例如用于基于 SSH 的 Git 的 github.com:22,这样的条目只允许该端口。条目不含协议或路径。在任何人都能发布站点的域名上使用通配符,例如 *.github.io、*.workers.dev、*.vercel.app 或 *.herokuapp.com,会放行其他人控制的主机,命令因而可能把你的数据发送到攻击者在那里建立的站点;请改为列出确切的主机。
只有在沙箱能够强制执行的地方,该设置才会生效:Linux 上的 bubblewrap,因此也包括 WSL2。在仅用 Landlock 限制命令的 Linux 系统、Windows 和 macOS 上,设置为 allowlist 或 off 的工作区会完全拒绝运行命令,并给出原因,而不是让命令使用你的网络运行。把设置改回 open 后,命令即可再次运行。
每种设置关闭了什么
open什么也不关闭。命令可以把任何内容发送到任何地方。这是原版 DeepSeek Harness 的行为,也是 Delo 的默认值。allowlist关闭命令和web_fetch自己打开的所有连接,只保留到你列出的主机的连接。仍然开放的,是这些主机所接受的内容。能访问github.com的命令可以推送到你的 Git 凭据允许的任何仓库,或在那里创建 issue;能访问软件包仓库的命令可以用它找到的凭据向其发布。通配符让命令可以请代理解析该域名之下的任何名称,这些查询会到达该域名的 DNS 服务器。代理不读取 HTTPS 连接的内部:它检查的是命令请求连接的名称,而不是加密连接内部的名称,因此用同一地址提供许多站点的主机,例如内容分发网络,可能被请求提供不在你列表中的站点。只列出工作所需的最少主机。off关闭命令和web_fetch自己打开的所有网络连接。需要下载依赖的命令会失败;请在切换之前安装好依赖,或者用列出你的软件包仓库的allowlist。
这两种限制性设置能挡住自己打开网络的命令。对于请沙箱之外的程序替它打开网络的命令,它们只在沙箱隐藏了该程序的套接字时才有效。沙箱在所有设置下都会隐藏你的会话套接字,例如你的 D-Bus 会话总线,并在这两种设置下隐藏上述服务。你主目录中的套接字仍然可以访问,一些程序在那里监听,并为任何请求者建立连接:你用 ControlMaster 打开的 ssh 连接,命令可以通过它到达那台服务器;或在没有运行时目录的系统上的 gpg dirmngr,它会从密钥服务器获取密钥。请把 allowlist 和 off 理解为关闭命令自己打开的途径以及沙箱隐藏的服务,而不是所有途径。
任何设置都不关闭的途径
该设置管辖沙箱中的命令和 web_fetch。以下途径在任何设置下都保持开放:
- 完全访问。 在
danger-full-access下获批的命令,或预设为完全访问的工作区中的命令,在沙箱外以你的网络运行。 - 插件与 MCP 服务器。 它们在沙箱之外运行,位于 harness 内或作为独立进程,并拥有你的网络。能抓取 URL 或发送消息的 MCP 服务器,只要模型能带着你的数据调用它,就是一条出去的路。
- 模型编写的插件。 在 Web 的
cordispreset 下,模型编写 Cordis 插件并通过插件管理安装;它们在 harness 自己的进程中、沙箱之外运行,并拥有你的网络。 - harness 启动的 agent 与语言服务器。 Claude Code 和 ACP subagent 工具启动的 agent 进程,以及语言服务器工具启动的语言服务器,都在沙箱之外运行。
web_search。 查询在任何设置下都会发往你的 profile 配置的搜索提供商,只到达该提供商。- 模型的回复。 模型可以把数据写进它的回答。在你电脑上的 studio 中,回复所链接的图片会从其主机加载,因此图片的 URL 以及写入其中的任何内容都会到达该主机;在通过远程访问打开的手机上,它显示为占位符。你点击的链接也会以同样方式发送其 URL。
- 你之后分享的文件。 模型可以把数据写进工作区中的文件、提交信息或拉取请求描述。当你推送、发布或发送它们时,数据就会离开。
- 模型提供商。 chat 中的一切都会发送给运行模型的提供商;模型就是这样工作的,任何设置都不会改变这一点。
- 已在运行的命令。 终端或后台任务会保留它启动时的网络,直到结束。收紧设置之后,请重启该工作区的终端和任务;所用列表被移除的命令会失去其代理,不再有网络。
实用建议
- 不要把密钥放进工作区。使用位于工作区之外的环境文件,以及 harness 永远用不到的密钥。
- 对于存放密钥、或处理不是你写的代码、issue 或页面的工作区,选择只列出工作所需主机的
allowlist,或者选择off。 - 在推送、发布或分享之前,检查 chat 改动了什么。打开回复中的链接和图片之前先看清它们。
- 不要在读取不可信内容的工作区中授予完全访问。
- 像选择任何以你自己的权限运行的程序那样,选择 MCP 服务器和插件。
下面是常用软件包仓库和 Git 主机的起步列表。在你把它们加入某个工作区的列表之前,其中任何主机都不被允许,而你加入的每个主机都是命令可以发送数据的去处。
| 用途 | 主机 |
|---|---|
| npm | registry.npmjs.org |
| PyPI | pypi.org、files.pythonhosted.org |
| crates.io | crates.io、index.crates.io、static.crates.io |
| Go 模块 | proxy.golang.org、sum.golang.org |
| GitHub | github.com、codeload.github.com、objects.githubusercontent.com |
更改设置
在运行 Delo 的电脑上的 studio 中打开“设置”中的“网络”,为每个工作区选择设置。收紧会立即生效。让命令能到达更多地方的更改,例如从 off 改为 open,或在列表中加入新主机或端口,会先请你确认。该设置只能在那台电脑上读取和更改:通过远程访问打开的手机无法打开它,模型没有能更改它的工具,但它在 cordis preset 下编写的插件以 harness 自身的权限运行,受限命令也无法读写 ~/.delorun 下保存它的文件。如果该文件损坏或其他用户可以读取它,在你修复之前,每个工作区都按 off 处理。你尚未为其选择的工作区所用的默认值,是 profile 的 cordis.yml 中 delorun-permission-defaults 行的 network 与 allowedHosts 设置,chat 中的插件管理无法更改它。
delorun/docs/security/threat-model.zh.md完整列出了各项防护及其限制。
你使用 Delo 时信任什么
你使用 Delo 时信任什么:什么在你的电脑上运行,Delo Run 能看到和做到什么、不能做什么,每个远程访问选项向其提供方展示什么,默认离开你机器的内容与仅在你选择时才离开的内容,以及如何自行核查。
Reach the studio from your phone
Open your Delorun studio from your phone over your own Tailscale network: turn remote access on, approve a phone at your computer, what an approved phone can and cannot do, unlock sensitive actions for a while, remove a device and turn remote access off.