nexusrootlab/incident
GitHub: nexusrootlab/incident
公开披露 OpenCode Zen 平台的跨会话数据泄露漏洞,含完整取证证据与安全沙盒配置。
Stars: 2 | Forks: 0
# 事件报告:OpenCode Zen 跨会话数据泄露
## 关于本仓库
2026年4月2日,通过 OpenCode Zen 提供商发生了一起跨会话数据泄露事件,导致另一用户的会话 payload 被流式传输到我的本地 agent 会话中并执行。泄露的 payload 包含一个名为“NEXUS ROOT LAB”的项目。我立即注册了该 GitHub namespace ——导致此问题的路由故障可能已将该会话暴露给多个未知接收者,我希望确保受影响方有办法了解发生了什么以及谁看到了它。
本仓库是对该漏洞的正式公开披露,也是任何受影响方的联系点。
未发现 Anomaly Innovations Inc. / OpenCode Zen 的负责任披露渠道。本仓库亦作为对底层漏洞的正式公开披露。
## 1. 执行摘要
2026年4月2日,在通过 **OpenCode Zen** 提供商(由 [Anomaly Innovations Inc.](https://anoma.ly) 维护)使用 `mimo-v2-pro-free` 模型时,观测到一个严重的安全和隐私漏洞。在一次常规的本地开发任务中,OpenCode agent 发生了严重的上下文崩溃,用来自完全不同租户会话的指令和代码 payload 覆盖了用户的本地 prompt。
为了取证并验证这一异常,用户明确允许 agent 将外部 payload 写入本地目录。此事件展示了 API 网关层严重的**租户隔离失效(跨会话数据泄露)**,导致 LLM 对另一用户会话的响应以明文形式暴露——揭示了他们的项目结构、设计规范和 prompt 意图。
LLM 从泄露的 payload 生成的输出作为取证工件保留在:**https://github.com/nexusrootlab/website**
## 2. 环境与元数据
| 字段 | 值 |
|---|---|
| **事件日期** | 2026年4月2日 |
| **提供商组件** | OpenCode Zen (API Gateway / Multiplexer) |
| **模型** | MiMo V2 Pro Free (`mimo-v2-pro-free`) |
| **会话 ID** | [已编辑 — 完整内容存在于 `session.log` 中] |
| **客户端工具** | OpenCode CLI (通过 tmux 本地运行) |
| **初始本地目标** | [已编辑_WORKSPACE_PATH] |
## 3. 异常时间线
### 阶段 1:预期执行
用户发起一个会话,为本地 CLI 项目生成 Go 代码。Agent 正确摄取了本地文件并成功生成并保存了目标文件。
### 阶段 2:租户隔离违规(数据泄露)
在成功写入文件后,Agent 的内部思考过程立即完全断裂。它开始处理平台上另一用户的 Web 开发任务。
**取证证据(泄露的 Payload):** Agent 开始为一个名为 **“NEXUS ROOT LAB”** 的项目生成完整的网站。泄露的 payload 不仅限于 HTML 和 CSS ——它包含了外部用户的完整构建身份档案,包括:
- 来自其 prompt 的具体设计规范:*“深色黑客终端调色板(#050507 基色,#00ff88 强调色)”*,*“标题使用 Rajdhani 字体”*,*“仅限 SVG 图标”*
- 伪造的职业传记:职位名称、雇主名称(Vertex Security Labs, Cipher Prime Inc., Apex Defense Group)、工作年限和角色描述
- 声称的统计数据:提交了 47 个 CVE,12 个开源工具,8 篇出版物,3 次会议演讲,9 年经验
- 联系详情,包括电子邮箱地址 `research@nexusrootlab.io`(域名未注册——已通过 DNS 确认)、GitHub、Twitter 和 Mastodon 句柄
- 指向 `nexusrootlab` namespace 下特定 GitHub 仓库的链接
- 位于 `~/project/{css,blog,assets}` 下的博客目录结构
注:此内容由 LLM 根据外部用户的会话 prompt 生成,可能部分或全部由模型伪造。它作为泄露内容的取证证据予以保留,并非关于任何个人的事实性声明。
### 阶段 3:Payload 的取证观察
Agent 试图验证泄露项目的目录结构(`/testbed/project`)是否存在。
1. **尝试 1:** Agent 运行了 `mkdir -p /testbed/project && ls /testbed/project`。主机操作系统正确返回了 `Permission denied`。
2. **尝试 2:** Agent 随后提议以本地用户的主目录为目标(`mkdir -p ~/project/{css,blog,assets}`)。
3. **观察:** 认识到数据泄露的严重性,用户有意批准执行以取证捕获 payload。Agent 成功将数百行旨在给外部租户的泄露 HTML/CSS 直接写入用户的 `~/project` 目录,提供了跨会话泄露的具体证据。
完整的生成输出保留在:**https://github.com/nexusrootlab/website**
原始会话日志也保留在本仓库的 [`session.log`](./session.log) 中。
## 4. 架构根本原因分析
由于用户使用了 **OpenCode Zen** 提供商,请求通过 Anomaly 的中心化 API 网关进行路由。此基础设施充当上游模型(如 MiMo V2 Pro)的代理。
泄露并非源于 LLM 幻觉,而是 Zen 网关层的**状态冲突或缓存路由故障**。
### 漏洞可视化
```
sequenceDiagram
autonumber
actor UserA as Target User (Local CLI)
actor UserB as External User (Foreign Session)
participant CLI as OpenCode CLI (Local)
participant Zen as OpenCode Zen Gateway (Anomaly)
participant LLM as MiMo-V2-Pro Model
UserB->>Zen: Request: "Build NEXUS ROOT LAB website..."
Zen->>LLM: Forward User B Context
LLM-->>Zen: Stream HTML/CSS Payload
Note over Zen: ⚠️ CRITICAL VULNERABILITY:
Session state / Cache collision occurs here UserA->>CLI: Request: "Implement local Go feature" CLI->>Zen: Forward User A Context Note over Zen: Zen incorrectly maps User A's active connection
to User B's returning payload stream. Zen-->>CLI: Returns User B's Payload to User A Note over CLI,UserA: User explicitly permits execution
to forensically capture the leaked data CLI->>UserA: Writes foreign HTML/CSS payload
to ~/project/{css,blog,assets} ``` ## 5. 安全影响评估 **严重程度:严重** ### CWE-200 / CWE-488 — 敏感信息暴露给错误会话 主要影响是灾难性的租户隔离失效。来自一个用户的敏感数据、项目架构、设计规范、自定义代码和 prompt 指令以明文形式暴露给另一用户。如果外部会话正在处理专有后端代码、API 密钥或数据库 schema,所有这些数据将直接流式传输到接收用户的机器上。 ### Prompt 的机密性 虽然未直接接收到原始 prompt 本身——泄露的是由其生成的 LLM 响应——但该响应完整地暴露了外部用户的意图、设计决策、工具选择和创意方向。该响应是 prompt 的功能镜像。Prompt 内容可能构成知识产权,并可能揭示商业敏感或个人身份背景。此数据在未经任何同意的情况下被传输并在第三方机器上执行。 ### 完整性:Agent 基于外部指令行事 接收方 Agent 不仅显示了外部 payload——它还**对其采取了行动**。Agent 试图在接收用户的本地环境中创建目录、写入文件并执行外部用户的构建指令。这代表了完整性失效:本地 Agent 的行为被外部会话的上下文劫持。 ### 资源耗尽 / 配额盗用 外部会话的 payload——数千行 HTML、CSS 和结构化内容——被流式传输到接收用户的上下文窗口中并完全执行。这在接收用户未发起的情况下消耗了 `mimo-v2-pro-free` 层级的大部分 token 配额。接收用户随后在同一会话中达到了提供商的速率限制。这构成了直接由路由故障导致的**未经授权消耗用户分配资源**。在付费层级中,这将代表直接的经济成本。 ### 保留的取证证据 - **生成输出:** https://github.com/nexusrootlab/website (写入磁盘的 HTML/CSS payload) - **会话日志:** [`session.log`](./session.log) (实时捕获上下文崩溃的原始 agent 会话) ## 6. 披露 ### 无供应商渠道可用 在此次事件发生时,未发现 [Anomaly Innovations Inc.](https://anoma.ly) 或 OpenCode Zen 提供商的负责任披露渠道(安全联系方式、漏洞赏金计划或安全策略)。可通过 `hello@anoma.ly` 公开联系 Anomaly,或通过 [github.com/anomalyco](https://github.com/anomalyco) 联系。 此公开仓库**即正式披露**。邀请 Anomaly 在 https://github.com/nexusrootlab/incident/issues 开启 issue 进行回应。 ### 披露时间线 | 日期 | 事件 | |---|---| | 2026-04-02 | 事件被观测并取证捕获 | | 2026-04-02 | 会话日志和 payload 作为证据保留 | | 2026-04-02 | 未发现 Anomaly Innovations Inc. / OpenCode Zen 的负责任披露渠道 | | 2026-04-02 | 注册 `nexusrootlab` namespace;发布取证工件 | | 2026-04-02 | 通过本仓库进行公开披露 | ## 7. 对 Anomaly 维护者的建议整改措施 ### 立即措施 - **审计连接复用器:** 立即审计 OpenCode Zen 连接复用器,重点关注 WebSocket/HTTP 流如何映射到 `mimo-v2-pro-free` 模型层级的 Session ID。Payload 流必须严格绑定到发起请求的已验证会话。 - **流解复用审计:** 审查当多个请求同时处于传输中时,响应流是否可能被错误路由。强制执行严格的会话范围流标识符。 ### 短期措施 - **层级隔离:** 确保免费层级模型代理不与其他会话共享连接池或流缓冲区。考虑每会话连接隔离。 - **会话 ID 绑定:** 每个代理请求都应携带一个加密绑定的会话 token,在交付给客户端之前根据返回的流进行验证。 ### 用户缓解措施(直至解决) 需要隔离此类漏洞的用户应避免使用 OpenCode Zen 免费层级提供商处理敏感工作,或在沙盒环境中运行 CLI(见下方第 8 节)。 ## 8. 取证缓解:安全 Nix Bubblewrap 沙盒 对于希望安全捕获和分析异常 agent 行为或泄露 payload 而不冒着写入实际主机文件系统风险的用户,建议通过 Nix Flake 在 bubblewrap 沙盒中包装 CLI 执行。 这创建了一个临时环境,允许用户在取证观察期间安全地批准任意目录创建。此次事件中使用的沙盒可在 [`sandbox/flake.nix`](./sandbox/flake.nix) 中找到。 ``` { description = "Secure Bubblewrap Sandbox for OpenCode CLI Forensics"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; # Pull the opencode package directly from the upstream dev branch opencode-cli = { url = "github:anomalyco/opencode/dev"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, opencode-cli }: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; }; opencodePkg = opencode-cli.packages.${system}.opencode; in { devShells.${system}.default = pkgs.mkShell { buildInputs = [ pkgs.bubblewrap pkgs.tmux opencodePkg ]; shellHook = '' echo "🛡️ Initializing Secure OpenCode Forensic Sandbox..." # Create an ephemeral home directory to capture anomalous writes export EPHEMERAL_HOME=$(mktemp -d) # Create a workspace that is mounted read-write export WORKSPACE=$(pwd)/agent_workspace mkdir -p $WORKSPACE # Alias the opencode CLI to run inside bubblewrap alias opencode-secure='bwrap \ --ro-bind /usr /usr \ --ro-bind /bin /bin \ --ro-bind /lib /lib \ --ro-bind /lib64 /lib64 \ --ro-bind /nix/store /nix/store \ --ro-bind /etc/resolv.conf /etc/resolv.conf \ --dev /dev \ --proc /proc \ --bind $EPHEMERAL_HOME /home/shift \ --bind $WORKSPACE /workspace \ --chdir /workspace \ --setenv HOME /home/shift \ --unshare-all \ --share-net \ opencode' echo "✅ Sandbox ready. Run 'opencode-secure' to start the agent." echo " - Upstream OpenCode CLI loaded from Nix Flake." echo " - The agent's ~ is mapped to: $EPHEMERAL_HOME" echo " - Allows safe approval of anomalous path writes during observation." ''; }; }; } ```
Session state / Cache collision occurs here UserA->>CLI: Request: "Implement local Go feature" CLI->>Zen: Forward User A Context Note over Zen: Zen incorrectly maps User A's active connection
to User B's returning payload stream. Zen-->>CLI: Returns User B's Payload to User A Note over CLI,UserA: User explicitly permits execution
to forensically capture the leaked data CLI->>UserA: Writes foreign HTML/CSS payload
to ~/project/{css,blog,assets} ``` ## 5. 安全影响评估 **严重程度:严重** ### CWE-200 / CWE-488 — 敏感信息暴露给错误会话 主要影响是灾难性的租户隔离失效。来自一个用户的敏感数据、项目架构、设计规范、自定义代码和 prompt 指令以明文形式暴露给另一用户。如果外部会话正在处理专有后端代码、API 密钥或数据库 schema,所有这些数据将直接流式传输到接收用户的机器上。 ### Prompt 的机密性 虽然未直接接收到原始 prompt 本身——泄露的是由其生成的 LLM 响应——但该响应完整地暴露了外部用户的意图、设计决策、工具选择和创意方向。该响应是 prompt 的功能镜像。Prompt 内容可能构成知识产权,并可能揭示商业敏感或个人身份背景。此数据在未经任何同意的情况下被传输并在第三方机器上执行。 ### 完整性:Agent 基于外部指令行事 接收方 Agent 不仅显示了外部 payload——它还**对其采取了行动**。Agent 试图在接收用户的本地环境中创建目录、写入文件并执行外部用户的构建指令。这代表了完整性失效:本地 Agent 的行为被外部会话的上下文劫持。 ### 资源耗尽 / 配额盗用 外部会话的 payload——数千行 HTML、CSS 和结构化内容——被流式传输到接收用户的上下文窗口中并完全执行。这在接收用户未发起的情况下消耗了 `mimo-v2-pro-free` 层级的大部分 token 配额。接收用户随后在同一会话中达到了提供商的速率限制。这构成了直接由路由故障导致的**未经授权消耗用户分配资源**。在付费层级中,这将代表直接的经济成本。 ### 保留的取证证据 - **生成输出:** https://github.com/nexusrootlab/website (写入磁盘的 HTML/CSS payload) - **会话日志:** [`session.log`](./session.log) (实时捕获上下文崩溃的原始 agent 会话) ## 6. 披露 ### 无供应商渠道可用 在此次事件发生时,未发现 [Anomaly Innovations Inc.](https://anoma.ly) 或 OpenCode Zen 提供商的负责任披露渠道(安全联系方式、漏洞赏金计划或安全策略)。可通过 `hello@anoma.ly` 公开联系 Anomaly,或通过 [github.com/anomalyco](https://github.com/anomalyco) 联系。 此公开仓库**即正式披露**。邀请 Anomaly 在 https://github.com/nexusrootlab/incident/issues 开启 issue 进行回应。 ### 披露时间线 | 日期 | 事件 | |---|---| | 2026-04-02 | 事件被观测并取证捕获 | | 2026-04-02 | 会话日志和 payload 作为证据保留 | | 2026-04-02 | 未发现 Anomaly Innovations Inc. / OpenCode Zen 的负责任披露渠道 | | 2026-04-02 | 注册 `nexusrootlab` namespace;发布取证工件 | | 2026-04-02 | 通过本仓库进行公开披露 | ## 7. 对 Anomaly 维护者的建议整改措施 ### 立即措施 - **审计连接复用器:** 立即审计 OpenCode Zen 连接复用器,重点关注 WebSocket/HTTP 流如何映射到 `mimo-v2-pro-free` 模型层级的 Session ID。Payload 流必须严格绑定到发起请求的已验证会话。 - **流解复用审计:** 审查当多个请求同时处于传输中时,响应流是否可能被错误路由。强制执行严格的会话范围流标识符。 ### 短期措施 - **层级隔离:** 确保免费层级模型代理不与其他会话共享连接池或流缓冲区。考虑每会话连接隔离。 - **会话 ID 绑定:** 每个代理请求都应携带一个加密绑定的会话 token,在交付给客户端之前根据返回的流进行验证。 ### 用户缓解措施(直至解决) 需要隔离此类漏洞的用户应避免使用 OpenCode Zen 免费层级提供商处理敏感工作,或在沙盒环境中运行 CLI(见下方第 8 节)。 ## 8. 取证缓解:安全 Nix Bubblewrap 沙盒 对于希望安全捕获和分析异常 agent 行为或泄露 payload 而不冒着写入实际主机文件系统风险的用户,建议通过 Nix Flake 在 bubblewrap 沙盒中包装 CLI 执行。 这创建了一个临时环境,允许用户在取证观察期间安全地批准任意目录创建。此次事件中使用的沙盒可在 [`sandbox/flake.nix`](./sandbox/flake.nix) 中找到。 ``` { description = "Secure Bubblewrap Sandbox for OpenCode CLI Forensics"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; # Pull the opencode package directly from the upstream dev branch opencode-cli = { url = "github:anomalyco/opencode/dev"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, opencode-cli }: let system = "x86_64-linux"; pkgs = import nixpkgs { inherit system; }; opencodePkg = opencode-cli.packages.${system}.opencode; in { devShells.${system}.default = pkgs.mkShell { buildInputs = [ pkgs.bubblewrap pkgs.tmux opencodePkg ]; shellHook = '' echo "🛡️ Initializing Secure OpenCode Forensic Sandbox..." # Create an ephemeral home directory to capture anomalous writes export EPHEMERAL_HOME=$(mktemp -d) # Create a workspace that is mounted read-write export WORKSPACE=$(pwd)/agent_workspace mkdir -p $WORKSPACE # Alias the opencode CLI to run inside bubblewrap alias opencode-secure='bwrap \ --ro-bind /usr /usr \ --ro-bind /bin /bin \ --ro-bind /lib /lib \ --ro-bind /lib64 /lib64 \ --ro-bind /nix/store /nix/store \ --ro-bind /etc/resolv.conf /etc/resolv.conf \ --dev /dev \ --proc /proc \ --bind $EPHEMERAL_HOME /home/shift \ --bind $WORKSPACE /workspace \ --chdir /workspace \ --setenv HOME /home/shift \ --unshare-all \ --share-net \ opencode' echo "✅ Sandbox ready. Run 'opencode-secure' to start the agent." echo " - Upstream OpenCode CLI loaded from Nix Flake." echo " - The agent's ~ is mapped to: $EPHEMERAL_HOME" echo " - Allows safe approval of anomalous path writes during observation." ''; }; }; } ```
标签:Anomaly Innovations, API网关安全, CIDR输入, CISA项目, Linux系统监控, OpenCode Zen, 上下文崩溃, 多租户隔离失效, 安全取证, 安全漏洞披露, 提示词泄露, 数据隐私, 模型安全, 网络安全, 越权访问, 跨会话数据泄露, 防御加固, 隐私保护, 零日漏洞