一条 curl 就能越狱:DeepSeek Harness 的 CVE-2026-82533 与 Agent 沙箱加固指南

·阅读约11分钟·Evergreen Tools Team

💡 工具推荐做这件事时,用 Evergreen Tools 的 Env 文件校验器密码强度检查器API Key 轮换工具 更省心!

2026 年最具教育意义的 AI Agent 安全事件,同时也是最简单的一个。OX Research 披露了 DeepSeek Harness 中的 CVE-2026-82533——DeepSeek 的开源、本地优先编码 Agent,在其 2026 年 8 月发布后数周内 GitHub 星标就突破 21.5 万。该漏洞评级 CVSS 9.4,让沙箱内的 Agent 在出厂默认配置下、无需网络暴露、无需任何凭证,用一条 shell 命令就关闭了自己的约束。同一个缺口还让未认证的远程攻击者劫持 Agent 并窃取存储的会话。它于 2026 年 8 月 24 日披露,8 月 27 日在 0.1.2-alpha.1 版本修复。本文拆解这个漏洞的构造,并给出可推广到你所有 Agent 沙箱的加固方式。

上锁的服务器设施

一扇有门的沙箱

一、先弄清自己是否暴露

修复从清点开始。DeepSeek Harness 在操作系统的沙箱内执行 Agent 发起的命令,按平台分别使用 bubblewrap、Landlock 或 Seatbelt,目的是阻止处理不可信素材的编码 Agent 越过工作区。这个沙箱是真实存在的,它也确实限制了文件写入,只是把回环网络留着了。代码示例 1 是无聊但重要的第一步:查版本、升级——低于 0.1.2-alpha.1 的都存在漏洞。给一个已知的 9.4 打补丁,比你在其之上做的任何聪明事都更重要。

# 1. Find out whether you are exposed, and upgrade
# DeepSeek Harness shipped the fix in 0.1.2-alpha.1 (August 27, 2026);
# CVE-2026-82533 was disclosed on August 24, 2026 (CVSS 9.4).
dsh --version            # anything below 0.1.2-alpha.1 is vulnerable
dsh self-update || pip install -U deepseek-harness
# The bug was not exotic: the agent-control API listened on a local
# HTTP port with no authentication, so a confined agent could simply
# ask the harness to remove its own confinement.

二、记住回环也是网络

这个漏洞之所以能用,是因为沙箱把本机当成了可信。如果文件写入被拦住,但 Agent 仍能触达 127.0.0.1,那么 Agent 就能和监管它的那个进程说话。代码示例 2 展示了沙箱层的修法:用隔离的网络命名空间运行 Agent,或在沙箱策略里拒绝出站网络。这条通用法则值得刻在石头上:够不到网络的 Agent,也够不到控制平面。回环不是你可以留着的后门。

# 2. Loopback is a network — deny it from inside the sandbox
# If the sandbox blocks file writes but leaves 127.0.0.1 reachable,
# the agent can still talk to its own supervisor. Cut that path.
# bubblewrap (Linux):
bwrap --unshare-net --die-with-parent --ro-bind /usr /usr \
     --tmpfs /tmp --dev /dev -- proc /proc /bin/bash
# macOS Seatbelt: deny network in the profile
# (deny network*)  (deny network-outbound)
# Rule of thumb: an agent that cannot reach the network cannot
# reach the control plane either.

三、永远不要用请求头做安全决策

根因有一个正式名字:CWE-807,在安全决策中依赖不可信输入。Agent 控制 API 监听在一个本地 HTTP 端口上且没有认证,它通过读取客户端提供的 Host 请求头来判断请求是否可信,而不是校验真实的对端地址。任何能打开 socket 的进程都能伪造请求头。代码示例 3 用「unix socket + 沙箱看不到的会话令牌」替换了这个脆弱模式。unix socket 根本无法从隔离的网络命名空间触达,而这正是你想要的属性。

# 3. Authenticate the control API and stop trusting the Host header
# CWE-807: the fix trusted a client-supplied "Host" header instead of
# the real peer address. Never do that. Bind to a unix socket and
# require a per-session token that the sandbox never sees.
import socket, secrets, os
SOCK = "/run/dsh/control.sock"
TOKEN = secrets.token_urlsafe(32)          # held by the supervisor only
def serve():
    os.makedirs(os.path.dirname(SOCK), exist_ok=True)
    srv = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    srv.bind(SOCK); os.chmod(SOCK, 0o600); srv.listen(1)
    conn, _ = srv.accept()
    if conn.recv(64).strip() != TOKEN.encode():
        conn.close(); return            # unauthenticated: drop immediately
# A unix socket plus a token is not reachable from a network namespace.

四、校验对端,并删掉那个逃生舱

如果你必须保留 TCP 控制监听,那么就依据连接本身来判定信任,绝不依据调用方可控的声明。代码示例 4 在处理任何命令之前,先把真实的远端地址与白名单比对。然后是这个故事值得单独立规的另一半:有漏洞的构建可以把会话提升到一个名为 danger-full-access、并关闭审批提示的模式。一个让 Agent 能关掉自身审批的出厂默认,不是功能,而是一把上了膛的枪。要么移除它,要么用物理访问来门控。

// 4. Verify the actual peer, not the claim
// Even on a TCP listener, decide trust from the connection, never
// from a header the caller controls.
import net from "node:net";
const TRUSTED = new Set(["127.0.0.1", "::1"]);
net.createServer((sock) => {
  const peer = sock.remoteAddress ?? "";
  if (!TRUSTED.has(peer)) {
    sock.destroy();
    return;
  }
  handleControlConnection(sock);       // only now accept commands
}).listen({ host: "127.0.0.1", port: 0 });
// Also: never expose a "danger-full-access" mode that disables
// approval prompts. It should not exist on shipped defaults.

五、把不变量变成 CI 门禁

这类漏洞反复出现的原因,是沙箱策略通常设一次之后就被悄悄放宽。代码示例 5 把不变量变成 CI 里可测的东西:如果代码库重新引入全权限逃逸模式就让构建失败,如果本地监听未带认证就失败,锁定已修复版本,并在旁边记录安全公告。这与 Anthropic 从自己那次沙箱逃逸事件里得到的教训是同一个,只是这次更具体。沙箱会因疏忽而退化,所以要有意地断言它。

# 5. Assert sandbox invariants in CI so this cannot regress
set -euo pipefail
# Refuse to ship a harness that can widen its own permissions.
! grep -rq "danger-full-access" ./src --exclude-dir=test
# Refuse to ship an unauthenticated local listener.
! grep -rq "listen(.*127.0.0.1" ./src | grep -v "auth"
# Pin the patched version and record the advisory.
echo "deepseek-harness>=0.1.2-alpha.1  # CVE-2026-82533, CVSS 9.4" >> SECURITY.md
schannel() { :; }
echo "sandbox invariants OK"

六、带走什么

一个 CVE 能提炼出三条可迁移的教训。第一,约束必须覆盖网络,因为只挡文件系统的沙箱会把控制平面暴露在外。第二,认证决策必须基于被验证过的事实,而不是像 Host 请求头那样由调用方控制的声明。第三,任何关闭审批的模式都不应出现在出厂默认里。DeepSeek 很快发布了修复,披露处理也算合理;只要你升级,8 月 27 日修掉的漏洞就已经关闭。但它揭示的这个模式,如今已是你在 2026 年运行的每一个 Agent 的检查清单条目。

终端与代码特写

一条命令就够了

网络隔离概念

回环也是网络

📌 常见问题 FAQ

CVE-2026-82533 是什么?

DeepSeek Harness(DeepSeek 的开源本地优先编码 Agent)中的一个严重漏洞(CVSS 9.4,CWE-807)。它让沙箱内的 Agent 用一条 shell 命令关闭自身沙箱,并让未认证的远程攻击者劫持 Agent、窃取存储的会话。

它何时披露、何时修复?

OX Research 于 2026 年 8 月 24 日披露,修复于 2026 年 8 月 27 日在 DeepSeek Harness 0.1.2-alpha.1 中发布。低于该版本的所有版本都受影响。

根因是什么?

Agent 控制 API 监听在本地 HTTP 端口且无认证,并依据客户端提供的 Host 请求头、而非真实对端地址来判定信任。操作系统沙箱拦住了文件写入,却留下了回环网络,于是 Agent 能调用该 API 并自我提权。

为什么回环网络是沙箱问题?

如果 Agent 能触达 127.0.0.1,它就能触达控制它的监管进程。只挡文件系统却放行回环的沙箱,等于把控制平面暴露在外。应在沙箱内拒绝网络访问,或用网络命名空间隔离。

如何加固我自己的 Agent 沙箱?

把网络与文件一视同仁地约束;对控制 API 做认证(最好用 unix socket 加会话令牌);校验真实对端地址而非请求头;移除任何关闭审批的模式;并在 CI 中断言这些不变量。