# 漏洞分层详解：InkBlade 十层攻击面 / Per-Layer Vulnerability Deep Dive

> 规模：286 个模板、152 条可利用性核验、39 条零日储备
>
> 本文回答三个问题：训练与推理集群的漏洞为什么不能只按 Kubernetes 分类；每一层的根因、代码锚点与危害是什么；每一类问题怎么演示、怎么修。
>
> 阅读顺序：先读十层正文。每层先看「名词与架构前置」，再看「逐条攻击面与演示」。所有条目都放在对应层的正文里；附录只保留索引，不承载代码。

## 0. 阅读说明

- **层是什么**：每层先用 2–3 句交代前置知识，说明这层在 ML 集群里为什么成立；其中六层另有「名词与架构前置」。
- **漏洞类别**：只列类别，不把类别当发现；具体条目都落在层内的 `L<层>-<序号>` 锚点上。
- **代表漏洞**：正文挑 3–5 条可复核的代表，完整的 152 条在每层的「逐条攻击面与演示」里。框架层按框架列 2–5 条，避免“看完一张大表还是不知道怎么打”。
- **逐条六段**：每条固定给「打了哪里 → 攻击代码 → 攻击效果 → 复现环境 → 清理 → 危害」。`打了哪里` 表包含组件、版本、入口、根因 file:line、可控参数、认证前置与网络位置。
- **攻击代码**：3–20 行可执行片段，目标只允许 `127.0.0.1:<port>`；脚本放在 `demos/<id>/`，文档里的代码块由生成器从 `poc.py` 抽取，两者一致。N/A 只用于硬件、纯配置或 static，而且要写明原因。
- **检测方法**：写清探针、模板与证据怎么取，不写请求构造。模板是数据，由 Pod 内的 Rust 探针执行。
- **危害评级**：`C/I/A` 是机密性/完整性/可用性，`H/M/L` 是高/中/低；另外列训练有效性、租户隔离与合规三项。H 表示“成立时的上限”，不是“必然发生”。
- **不写什么**：真实目标、公网地址、真实凭据、破坏性 payload、持久化或完整生产利用步骤都不写。关键代码只保留 sink、路由、权限判断与加载点；演示代码只用 benign marker、127.0.0.1 回环与最小请求字段，方便防守方定位、复现和写规则。

**范围**：152 条 registry 条目、286 个模板、39 条零日储备、29 条攻击链。正文按十层逐条展开 152 条，附录 A 给索引，附录 B/C 给正文锚点，附录 D 给原因索引。

**边界**：152 条 registry 描述的是“有代码锚点、能按版本或配置核验”的子集，不是 ML 集群的全部漏洞。正文的十层是产品检测模型，逐条条目是可对账的技术参考。

## 1. 架构层：万卡拓扑、PD 分离与 KV 生命周期

**层是什么**：万卡集群不是“更大的 Kubernetes”。GPU 与网卡按 rail 固定布线，训练按 DP/TP/PP/EP/CP 切分，推理用 PD 分离把 prefill 与 decode 放到不同节点，再用 KV 通道搬运中间状态。架构层的信任边界由“通信域”决定，而不是 namespace：能加入同一个集合通信组、能映射同一段显存、能读同一个 KV 块，就已经越过了租户边界。

### 1.1 名词与架构前置：长上下文：窗口、prefill 与 KV 增长

长上下文不是“把 max_tokens 调大”。窗口决定准入与 KV 预留，prefill 决定首 token 成本，decode 决定持续显存；三者任一没按实际 token 计数，就会把长度变成 DoS 或泄露面。

**类比**：像电影院按票面座位卖票，却不数实际进场人数；一张“全场通票”能把整厅占满。

```text
prompt (128K..1M tokens)
      │
      ▼
[ tokenizer ] -> token 数 -> [ admission: window / quota ]
      │
      ▼
[ prefill: attention over prompt ] ──> KV blocks (O(n) 显存)
      │                                   │
      ▼                                   ▼
[ first token / TTFT ]             [ decode: 逐 token 追加 KV ]
                                          │
                                          ▼
                              [ prefix cache / PD transfer / eviction ]
```

**术语速查（14 条）**

| 术语 | 白话解释 |
|---|---|
| context window | 模型单次可处理的最大 token 数（128K/1M）；准入必须按实际 token，不是声明值。 |
| token | 模型的最小输入单位；字节数≠token 数，按字符估算会给超窗留下空间。 |
| prefill | 一次性计算整段 prompt 的阶段；算力密集、决定 TTFT，也是 KV 分配的起点。 |
| decode | 逐 token 生成阶段；每步追加 KV，长输出把显存占用线性拉长。 |
| attention 复杂度 | 标准 attention 对序列长度是 O(n²)；FlashAttention/稀疏化降低常数但不改变增长趋势。 |
| RoPE | 旋转位置编码；把位置写进 Q/K 的旋转角，外推能力决定超长窗口是否还可信。 |
| 位置外推 | YaRN/NTK/线性缩放等把训练窗口拉长的方法；外推过头会输出退化而非直接报错。 |
| KV 增长 | KV 字节随层数×头数×维度×token 数增长；1M 窗口下单请求可达 GB 级。 |
| context flooding | 用大量超长请求占满 prefill 队列/KV 配额；单请求成本低，集群影响大。 |
| attention sink | 模型把大量注意力放在首 token 的现象；滑窗/截断会改变 sink，导致行为漂移。 |
| 滑窗 / 截断 | 只保留最近 N 个 token 或截断超长输入；静默截断会让模型“看不见”关键指令。 |
| cache 复用 | 长上下文与 prefix cache 叠加时，前缀命中既省算力也放大跨租户泄露面。 |
| ring attention | Context Parallel 下 KV 沿 ring 逐跳传递；环成员就是信任边界。 |
| context limit bypass | 声明窗口与实际 token 不一致仍被接受；后果是队列 DoS 与 KV 放大。 |

**前置知识 × 危害细化**

| 漏洞 | 前置知识（要懂什么） | 危害细化（训练/推理/合规） | 正文 |
|---|---|---|---|
| 超窗请求被接受 | 懂 token 计数、准入与 prefill 队列 | prefill DoS、GPU 饥饿、SLA 违约 | 第 1 层逐条 |
| KV 内存放大 | 懂按声明窗口预留与按实际 token 预留的差别 | 单请求 GB 级 KV、OOM、邻居受影响 | 第 1 层逐条 |
| 长上下文训练通信面 | 懂 TP/PP/EP/CP/SP 与 ring attention | 梯度/KV 泄露、训练静默变慢 | 第 1 层逐条 |
| 静默截断 | 懂滑窗、attention sink 与位置外推 | 指令丢失、评测失真、合规风险 | 第 1 层逐条 |


**概念详解：IMEX 域越权**

- **一句话定义**：IMEX 是 NVIDIA 在多节点 NVLink 系统上把不同节点的 GPU 显存映射进同一进程地址空间的服务；ComputeDomain 是 Kubernetes 侧把一组 Pod 划进同一 IMEX 域的 CRD；DRA 负责把 GPU/IMEX 设备作为 ResourceClaim 分配给 Pod。
- **类比**：把几栋楼的仓库打通成一条内部传送带。门禁只查“是不是这栋楼的人”，不查“进的是哪个仓格”；ComputeDomain 是门禁名单，DRA 是钥匙，IMEX 是传送带。名单写宽一格，钥匙多配一把，传送带就把别人的货送到你手里。
- **三类越权**：其一，域成员越权——`allowedHosts` 或域选择器过宽，任意 Pod 可以加入不该加入的域；其二，设备挂载过宽——DRA deviceClass/ResourceClaim 把整卡或 IMEX channel 发给不该拿的 Pod；其三，控制面 RBAC 过权——compute-domain-controller 或 GPU network operator 的 ClusterRole 可以改域、读所有节点配置。
- **攻击链**：已有 Pod → 枚举 ComputeDomain/IMEX channel（CRD、operator 日志、节点配置）→ 加入域或拿到 channel 设备 → map 对端显存 → 读权重/KV → 写激活或优化器状态导致静默损坏。全程不要求 root，只要有 device 挂载或 operator SA 即可。
- **前置**：Pod 落在 GPU 节点；能读或改 IMEX 配置/CRD；fabric 可达；目标域未按租户隔离。四个条件缺一个，链路就退化为配置暴露而不是内存越权。
- **危害**：模型权重与 KV 泄露（机密性）；训练静默损坏，loss 曲线看起来正常但收敛偏移（完整性 + 训练有效性）；推理操纵，改 KV/激活即可改变输出（完整性）；绕过 NetworkPolicy 与 MIG，因为内存语义不走网络策略，MIG 只切分单卡（租户隔离）。合规上属于跨租户数据边界失效。
- **检测**：`nvlink-imex-isolation`（research-only，默认关闭）做域成员/权限快照；`fabric-topology-isolation` 读 IB/NVLink 域与分区；`gpu-network-operator-posture` 查 ComputeDomain controller 的特权与 RBAC；链 `imex-computedomain-gpu-memory-crossing` 把“域存在”与“operator 过权”两段证据串起来。证据是域成员、`allowedHosts`、channel 权限、device claim 与 operator ClusterRole。
- **边界**：仓库没有 GB200/NVL72 真机，结论只到配置/权限级；不执行 map、不读真实显存、不写对端内存。IMEX 的真实语义必须用厂商导出或现场只读快照复核。


**漏洞类别**

- 跨节点 GPU 内存共享越权：IMEX 域成员、ComputeDomain 选择器、DRA deviceClass 三者任一过宽，都会把远端显存映射进不该拿的 Pod。
- rail / 多平面错配：调度器不校验 GPU-NIC-leaf 三元组，NCCL 环境变量或 SR-IOV VF 指错轨，集合通信被静默挤到错误平面。
- PD KV 通道未鉴权：prefill 与 decode 之间的 KV 传输缺少 mTLS/token，块 ID 可枚举，读写都不校验租户。
- MoE / EP 集合通信默认信任：加入 EP 组不需要身份，专家分片与 all-to-all 端口暴露在平网。
- 长上下文 KV 生命周期：窗口越长驻留越久，声明窗口与实际 token 不一致会放大预留，逐出策略决定泄露窗口。
- 多集群联邦信任传递：Karmada 风格的 propagation 与共享 kubeconfig 把身份和权重信任带到集群边界之外。

**代表漏洞**

| # | 组件 / 版本区间 | 根因锚点（file:line 或配置面） | 前置 → 影响 | 模板键 |
|---|---|---|---|---|
| 1 | IMEX 域越权（GB200 NVL72 / IMEX，2026-10 文档版本） | `nodes_config.cfg` 的 `allowedHosts` 通配；channel 全局 RW；DRA claim 未绑定租户 | 同 fabric 的已有 Pod + 可读域配置 → 跨节点显存读写、训练静默损坏 | `nvlink-imex-isolation`、`gpu-network-operator-posture` |
| 2 | rail 错配（rail-optimized fabric，无版本上限） | `NCCL_IB_HCA` / `GID_INDEX` 可写；调度器不校验 GPU-NIC-leaf；SR-IOV VF 与 PF 不同轨 | 能写 rail 绑定或控制 NCCL 环境 → 跨轨拥塞、PFC 风暴、straggler | `rail-mismatch-forcing`、`fabric-topology-isolation` |
| 3 | PD KV 通道未鉴权（llm-d / vLLM PD + NIXL 风格） | KV transfer API 无 mTLS/token；block ID 可枚举；跨租户写入不校验 | prefill/decode 网络可达 → KV 读、写、推理操纵 | `prefill-decode-kv-channel-unauth`、`kv-cache-integrity-poison` |
| 4 | 长上下文窗口耗尽（128K–1M） | 只校验声明 `context_window`，不校验实际 prompt token；KV 按声明窗口预留 | 补全端点可达 → prefill 队列 DoS、GB 级 KV 预留 | `long-context-window-exhaustion`、`long-context-memory-amplification` |
| 5 | 多集群联邦信任通配（Karmada 风格） | propagation 通配到全部集群；共享 kubeconfig 无审批；命名空间未隔离 | federation 控制面可达 → 跨集群权重/身份信任 | `multi-cluster-federation`、`federated-learning-surface` |

**检测方法**

先用拓扑快照回答“谁和谁在一个域”：`fabric-topology-isolation` 读 IB Partition、NVLink/NVSwitch 域与 IMEX 成员；`gpu-network-operator-posture` 读 ComputeDomain controller 的特权、hostPath 与 ClusterRole；`nvlink-imex-isolation` 是 research-only 的域成员/权限快照，默认关闭。PD 侧用 `prefill-decode-kv-channel-unauth` 做读握手与池计数器差分，写类验证走 `kv-cache-integrity-poison` 的备份校验。长上下文用 `long-context-window-exhaustion` 看 `prefill_tokens > context_window` 与 `queue_depth`，用 `long-context-memory-amplification` 看 `kv_cache_bytes` 放大比（阈值 64×）。证据只取状态码、计数器差分、读回 sha256 与拓扑映射，不取“感觉变慢”。

**修复建议**

IMEX：`allowedHosts` 收敛到节点级 allowlist，channel 按租户授权，ComputeDomain 选择器绑定 namespace/SA，DRA claim 校验租户标签；已分配设备禁止在线改域。rail：rail 绑定只读，由调度器按 GPU-NIC-leaf 三元组校验，`NCCL_IB_HCA`/`GID_INDEX` 下发前做一致性检查，SR-IOV VF 与 PF 同轨。PD：KV 通道 mTLS + 每租户 token，块 ID 不可枚举，写入校验块归属。长上下文：按实际 token 计数准入，声明值只做上限提示，给每租户 KV 配额。联邦：propagation 白名单 + 每集群独立凭据 + 变更审批。

**边界**

没有 GB200/NVL72 真机，IMEX 只到配置/权限级，不执行 map、不读真实显存；rail 结论来自配置判定与 `lab/fabric_dos_sim.py` 的计数器仿真，没有真实 IB/RoCE ASIC；PD KV 是 HTTP 语义同构，不覆盖 NIXL/RDMA 二进制协议与 GPU 显存语义。A1–A8 假设必须用客户集群只读快照逐条核验。

**本节引用条目**：`NCCL-NCCLPLUGIN-HW`、`UCX-UCT-HW`、`ucxpy-server-py-pickle-loads-l42-regex`、`CVE-2025-47277`、`CVE-2025-32444`、`CVE-2026-92972`、`CVE-2026-3060`。根因、代码片段、危害与修复见附录 A 对应行；重点条目另见附录 B/C。

### 1.2 逐条攻击面与演示（10 条）

#### L1-001 · `CVE-2025-29783` · vLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| vLLM | 0.8.4 | TCP: Mooncake/PyNccl KV pipe | `vllm/v0.8.4/vllm/distributed/kv_transfer/kv_pipe/mooncake_pipe.py:195`；Mooncake ZMQ/TCP 不安全反序列化 | recv_pyobj payload | 无（无（KV 通道可达）） | Pod 内/ClusterIP |

**根因片段**

```text
vllm/v0.8.4/vllm/distributed/kv_transfer/kv_pipe/mooncake_pipe.py:195
193:     def recv_bytes(self) -> bytes:
194:         """Receive bytes from the remote process."""
195:         src_ptr, length = self.receiver_socket.recv_pyobj()
196:         dst_ptr = self.allocate_managed_buffer(length)
197:         self.transfer_sync(dst_ptr, src_ptr, length)
198:         ret = self.read_bytes_from_buffer(dst_ptr, length)
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2025-29783"
SPEC = {'id': 'CVE-2025-29783', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2025-29783`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2025-29783/poc.py`；上游 pin: `vllm/v0.8.4/vllm/distributed/kv_transfer/kv_pipe/mooncake_pipe.py:195`

**清理**

`python demos/CVE-2025-29783/poc.py --cleanup`；删除 `demos/.work/CVE-2025-29783/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2025-29783/poc.py`（sha256 `0324dc6fcd6978f9ad991d49852b4eb9e6addd103b3d5766f48d61a7b085abb6`）

- **检测/修复/证据**：`vllm-pickle-pipe-rce` / `inkblade/modules/vllm-pickle-pipe-rce/template.json`；pickle 改安全序列化；KV 通道 mTLS；反序列化类型白名单；`lab/upstream_verify/cases/vllm/CVE-2025-29783/result.json`

#### L1-002 · `CVE-2025-32444` · vLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| vLLM | 0.8.4 | TCP: Mooncake/PyNccl KV pipe | `vllm/v0.8.4/vllm/distributed/kv_transfer/kv_pipe/mooncake_pipe.py:195`；Mooncake KV 管道 pickle 反序列化 RCE | recv_pyobj payload | 无（无（KV 通道可达）） | Pod 内/ClusterIP |

**根因片段**

```text
vllm/v0.8.4/vllm/distributed/kv_transfer/kv_pipe/mooncake_pipe.py:195
193:     def recv_bytes(self) -> bytes:
194:         """Receive bytes from the remote process."""
195:         src_ptr, length = self.receiver_socket.recv_pyobj()
196:         dst_ptr = self.allocate_managed_buffer(length)
197:         self.transfer_sync(dst_ptr, src_ptr, length)
198:         ret = self.read_bytes_from_buffer(dst_ptr, length)
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2025-32444"
SPEC = {'id': 'CVE-2025-32444', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2025-32444`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2025-32444/poc.py`；上游 pin: `vllm/v0.8.4/vllm/distributed/kv_transfer/kv_pipe/mooncake_pipe.py:195`

**清理**

`python demos/CVE-2025-32444/poc.py --cleanup`；删除 `demos/.work/CVE-2025-32444/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2025-32444/poc.py`（sha256 `d7d963157b72645f6800c7612eb0da5038838303498276a3dee7555bff986026`）

- **检测/修复/证据**：`vllm-pickle-pipe-rce` / `inkblade/modules/vllm-pickle-pipe-rce/template.json`；pickle 改安全序列化；KV 通道 mTLS；反序列化类型白名单；`lab/upstream_verify/cases/vllm/CVE-2025-32444/result.json`

#### L1-003 · `CVE-2025-47277` · vLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| vLLM | 0.8.4 | TCP: Mooncake/PyNccl KV pipe | `vllm/v0.8.4/vllm/distributed/utils.py:170`；PyNcclPipe KV 传输 RCE | recv_pyobj payload | 无（无（KV 通道可达）） | Pod 内/ClusterIP |

**根因片段**

```text
vllm/v0.8.4/vllm/distributed/utils.py:170
168:     def recv_obj(self, src: int) -> Any:
169:         """Receive an object from a source rank."""
170:         obj = pickle.loads(
171:             self.store.get(
172:                 f"send_to/{self.rank}/{self.recv_src_counter[src]}"))
173:         self.recv_src_counter[src] += 1
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2025-47277"
SPEC = {'id': 'CVE-2025-47277', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2025-47277`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2025-47277/poc.py`；上游 pin: `vllm/v0.8.4/vllm/distributed/utils.py:170`

**清理**

`python demos/CVE-2025-47277/poc.py --cleanup`；删除 `demos/.work/CVE-2025-47277/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2025-47277/poc.py`（sha256 `bdc98ee154820ef928a3182e0ba96f830a25132c74df3fe936f65f75ee25a294`）

- **检测/修复/证据**：`vllm-pickle-pipe-rce` / `inkblade/modules/vllm-pickle-pipe-rce/template.json`；pickle 改安全序列化；KV 通道 mTLS；反序列化类型白名单；`lab/upstream_verify/cases/vllm/CVE-2025-47277/result.json`

#### L1-004 · `CVE-2026-3059` · SGLang

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| SGLang | 0.5.10 | TCP: ZMQ/PD receiver | `sglang/v0.5.10/python/sglang/multimodal_gen/runtime/scheduler_client.py:28`；多模态 ZMQ broker pickle RCE | pickle payload | 无（无（通道可达）） | Pod 内/ClusterIP |

**根因片段**

```text
sglang/v0.5.10/python/sglang/multimodal_gen/runtime/scheduler_client.py:28
26:             # 1. Receive a request from an offline client
27:             payload = await socket.recv()
28:             request_batch = pickle.loads(payload)
29:             logger.info("Broker received an offline job from a client.")
30:
31:             # 2. Forward the request to the main Scheduler via the shared client
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2026-3059"
SPEC = {'id': 'CVE-2026-3059', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2026-3059`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2026-3059/poc.py`；上游 pin: `sglang/v0.5.10/python/sglang/multimodal_gen/runtime/scheduler_client.py:28`

**清理**

`python demos/CVE-2026-3059/poc.py --cleanup`；删除 `demos/.work/CVE-2026-3059/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2026-3059/poc.py`（sha256 `66f55003e9e2c37f65120687b15b27cf747bf68081f74587edc5bcc089def96f`）

- **检测/修复/证据**：`sglang-zmq-pickle-rce` / `inkblade/modules/sglang-zmq-pickle-rce/template.json`；ZMQ 改安全序列化 + mTLS；解码端类型白名单；`lab/upstream_verify/cases/sglang/CVE-2026-3059/result.json`

#### L1-005 · `CVE-2026-3060` · SGLang

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| SGLang | 0.5.10 | TCP: ZMQ/PD receiver | `sglang/v0.5.10/python/sglang/srt/disaggregation/encode_receiver.py:497`；Encoder PD 分离模块 pickle RCE | pickle payload | 无（无（通道可达）） | Pod 内/ClusterIP |

**根因片段**

```text
sglang/v0.5.10/python/sglang/srt/disaggregation/encode_receiver.py:497
495:                 # No data available yet, wait a bit and retry
496:                 return
497:             recv_obj: EmbeddingData = pickle.loads(parts[0])
498:             if getattr(recv_obj, "error_msg", None) is not None:
499:                 logger.warning(
500:                     f"Received error signal from encoder for {self.rid}: {recv_obj.error_msg} {recv_obj.error_code = }"
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2026-3060"
SPEC = {'id': 'CVE-2026-3060', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2026-3060`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2026-3060/poc.py`；上游 pin: `sglang/v0.5.10/python/sglang/srt/disaggregation/encode_receiver.py:497`

**清理**

`python demos/CVE-2026-3060/poc.py --cleanup`；删除 `demos/.work/CVE-2026-3060/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2026-3060/poc.py`（sha256 `9eb3649fa8c757ed49168e81065fb7b21805ab865cb30e317cd4b87e19a39488`）

- **检测/修复/证据**：`sglang-zmq-pickle-rce` / `inkblade/modules/sglang-zmq-pickle-rce/template.json`；ZMQ 改安全序列化 + mTLS；解码端类型白名单；`lab/upstream_verify/cases/sglang/CVE-2026-3060/result.json`

#### L1-006 · `CVE-2026-92972` · SGLang

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| SGLang | <= 0.5.19 | PUT /route (30000/tcp) | `sglang/v0.5.10/python/sglang/srt/disaggregation/common/conn.py:738`；PD 分离 PUT /route 路由表投毒 | prefill_port_table | 无 | ClusterIP |

**根因片段**

```text
sglang/v0.5.10/python/sglang/srt/disaggregation/common/conn.py:738
736:
737:     def _setup_routes(self):
738:         self.app.router.add_route("*", "/route", self._handle_route)
739:         self.app.router.add_post("/register_dp_rank", self._handle_register_dp_rank)
740:         self.app.router.add_post("/query_dp_ranks", self._handle_query_dp_ranks)
741:         self.app.router.add_get("/health", self._handle_health_check)
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2026-92972"
SPEC = {'id': 'CVE-2026-92972', 'kind': 'http', 'method': 'PUT', 'route': '/route', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'CVE-2026-92972'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 路由表 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2026-92972`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2026-92972/poc.py`；上游 pin: `sglang/srt/disaggregation/common/conn.py:738`

**清理**

`python demos/CVE-2026-92972/poc.py --cleanup`；删除 `demos/.work/CVE-2026-92972/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：`demos/CVE-2026-92972/poc.py`（sha256 `34b5e9c83c974234068e85a5dafe809332fed9492a4e4f84f36ca1155b075a23`）

- **检测/修复/证据**：`sglang-route-poison` / `inkblade/modules/sglang-route-poison/template.json`；管理面 fail-closed；profiler 路径白名单；ZMQ/PD pickle 安全化；权重导出鉴权；`lab/upstream_verify/cases/sglang/CVE-2026-92972/result.json`

#### L1-007 · `NCCL-NCCLPLUGIN-HW` · NCCL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| NCCL | v2.32.3-1 | 配置面/CLI: `n/a (vendor firmware / Linux runtime / hardware fabric)` | `n/a (vendor firmware / Linux runtime / hardware fabric)`；NCCL v2.32.3-1: pure C/CUDA; | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime / hardware fabric)
NCCL v2.32.3-1: pure C/CUDA; plugin .so loading (NCCL_IB_HCA / NCCL_PLUGIN) needs the hardware path. Marked unsupported; attack-surface conclusions live in the fabric modules (nccl-collective-join
ib-subnet-manager-hijack).
审计记录：厂商固件/运行时路径，无逐字上游源码
```

**攻击代码**

N/A — Linux runtime；NVIDIA GPU device；IB/RoCE or NVLink fabric

**攻击效果**

N/A（Linux runtime；NVIDIA GPU device；IB/RoCE or NVLink fabric）

**复现环境**

unsupported：Linux runtime；NVIDIA GPU device；IB/RoCE or NVLink fabric

**清理**

无写入；不需要清理

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：N/A — Linux runtime；NVIDIA GPU device；IB/RoCE or NVLink fabric

- **检测/修复/证据**：`nccl-collective-join` / `inkblade/modules/nccl-collective-join/template.json`；NCCL 通道 mTLS/令牌；IB Partition；bootstrap 端口配额；`lab/upstream_verify/cases/nccl/NCCL-NCCLPLUGIN-HW/result.json`

#### L1-008 · `UCX-UCT-HW` · UCX

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| UCX | v1.22.0 | 配置面/CLI: `n/a (vendor firmware / Linux runtime / hardware fabric)` | `n/a (vendor firmware / Linux runtime / hardware fabric)`；UCX v1.22.0: C transport library. The ucx-py binding was mined separately (see ucxpy cases); | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime / hardware fabric)
UCX v1.22.0: C transport library. The ucx-py binding was mined separately (see ucxpy cases); the core library is hardware-bound and marked unsupported.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — Linux runtime；IB/RoCE or CUDA/ROCm device

**攻击效果**

N/A（Linux runtime；IB/RoCE or CUDA/ROCm device）

**复现环境**

unsupported：Linux runtime；IB/RoCE or CUDA/ROCm device

**清理**

无写入；不需要清理

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：N/A — Linux runtime；IB/RoCE or CUDA/ROCm device

- **检测/修复/证据**：`collective-communication-surface` / `inkblade/modules/collective-communication-surface/template.json`；UCX 通道鉴权；RDMA 分区；`lab/upstream_verify/cases/ucx/UCX-UCT-HW/result.json`

#### L1-009 · `CVE-2026-7301` · SGLang

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| SGLang | 0.5.10 | 配置面/CLI: `sglang/v0.5.10/python/sglang/multimodal_gen/runtime/scheduler_client.py:20` | `sglang/v0.5.10/python/sglang/multimodal_gen/runtime/scheduler_client.py:20`；多模态 scheduler ROUTER 绑定 0.0.0.0 + pickle | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
sglang/v0.5.10/python/sglang/multimodal_gen/runtime/scheduler_client.py:20
26:             # 1. Receive a request from an offline client
27:             payload = await socket.recv()
28:             request_batch = pickle.loads(payload)
29:             logger.info("Broker received an offline job from a client.")
30:
31:             # 2. Forward the request to the main Scheduler via the shared client
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`sglang-zmq-pickle-rce` / `inkblade/modules/sglang-zmq-pickle-rce/template.json`；ZMQ 改安全序列化 + mTLS；解码端类型白名单；`lab/upstream_verify/cases/sglang/CVE-2026-7301/result.json`

#### L1-010 · `ucxpy-server-py-pickle-loads-l42-regex` · UCX-Py

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| UCX-Py | v0.45.00 | 配置面/CLI: `debug-tests/server.py:42` | `debug-tests/server.py:42`；对共享缓存或请求字节直接 pickle.loads，写者可在加载时执行代码 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
debug-tests/server.py:42
40:
41:             print("CREATING CUDA OBJECT IN SERVER...")
42:             cuda_obj_generator = cloudpickle.loads(func)
43:             cuda_obj = cuda_obj_generator()
44:             msg = {"data": to_serialize(cuda_obj)}
45:             frames = await to_frames(msg, serializers=("cuda", "dask", "pickle"))
```

**攻击代码**

N/A — ucx-py debug server running (debug-tests)；attacker can reach its UCX endpoint

**攻击效果**

N/A（ucx-py debug server running (debug-tests)；attacker can reach its UCX endpoint）

**复现环境**

static：ucx-py debug server running (debug-tests)；attacker can reach its UCX endpoint

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — ucx-py debug server running (debug-tests)；attacker can reach its UCX endpoint

- **检测/修复/证据**：`collective-communication-surface` / `inkblade/modules/collective-communication-surface/template.json`；调试 server 关闭；pickle 改安全序列化；`lab/upstream_verify/cases/ucxpy/ucxpy-server-py-pickle-loads-l42-regex/result.json`


## 2. 产品与框架层：十八个栈的默认面

**层是什么**：训练与推理栈的漏洞大多不是“Kubernetes 配错了”，而是框架自己的默认值：管理面没有 key、开发模式默认打开、权重同步用 pickle、模型加载信任仓库代码、网关把默认 master key 写进示例。每个栈都有自己的控制面、序列化方式与默认绑定地址，通用 K8s 扫描器看不到这些差异。

### 2.1 名词与架构前置：AI 网关：身份、路由与配额

AI 网关是模型流量的唯一入口：它同时持有上游 provider key、租户 key、模型别名、语义缓存与 guardrail。网关把“网络位置”当身份的那一刻，后面的资产都在同一信任链上。

**类比**：像小区大门保安只看你站在门里就放行；门禁卡、访客登记、快递柜都在同一道门后。

```text
tenant A key ─┐
tenant B key ─┼─> [ reverse proxy / auth ] ─> [ model router / alias ]
master key ───┘             │                         │
                           ▼                         ▼
                   [ quota / rate limit ]     [ provider key pool ]
                           │                         │
                           ▼                         ▼
                   [ semantic cache ] <──────> [ guardrail / logs ]
                           │
                           ▼
                    response / TTFT / billing
```

**术语速查（14 条）**

| 术语 | 白话解释 |
|---|---|
| 反向代理 | 网关站在模型前面转发请求；它看到的身份头不一定可信，除非入口剥离了外部同名头。 |
| 模型路由/别名 | 把公共模型名映射到具体后端；别名可写且无 allowlist 时，流量可被整体劫持。 |
| master key | 网关的最高权限密钥；示例默认值未轮换时，等于把管理面交给任何读到示例的人。 |
| virtual key | 按租户/项目签发的子密钥；必须绑定租户、额度、模型白名单，否则只是换名的 master key。 |
| 租户 | 计费、配额、缓存、日志的最小隔离单位；请求头里的 tenant 不能替代服务端身份。 |
| 配额/限流 | 按 key/租户/模型限制 QPS 与 token；按 X-Forwarded-For 分桶可被轮换伪造绕过。 |
| 语义缓存 | 网关侧按相似度复用响应；键不含租户/模型/策略版本时会跨租户命中。 |
| guardrail | 内容护栏；只检查首条消息、只识别 user 角色时可被多消息/角色分层绕过。 |
| InferencePool | Gateway API Inference Extension 的推理后端池；EPP 在其上做端点选择。 |
| EPP | Endpoint Picker；按 KV 利用率/队列深度选端点，指标过宽时泄露租户缓存状态。 |
| llm-d | Kubernetes 上的分布式推理编排；PD 分离、KV 感知路由与 InferencePool 常一起出现。 |
| FailOpen | 鉴权/策略组件故障时放行；可用性优先的默认值会把故障放大成全网越权。 |
| provider key | 上游模型厂商密钥；泄露等于计费面、模型清单与配额控制权一起丢失。 |
| X-Forwarded-For | 代理链客户端 IP 头；可伪造，不能作为配额或审计的唯一身份。 |

**前置知识 × 危害细化**

| 漏洞 | 前置知识（要懂什么） | 危害细化（训练/推理/合规） | 正文 |
|---|---|---|---|
| 默认 master key | 懂网关管理面与示例默认值 | 全租户管理权、上游 key 外泄、计费盗刷 | 第 2 层逐条 |
| 别名路由劫持 | 懂模型别名与后端 allowlist | 全量 prompt/响应中继、模型替换 | 第 2 层逐条 |
| 语义缓存跨租户 | 懂缓存键、相似度阈值与租户过滤顺序 | 商业数据/系统提示泄露 | 第 2 层逐条 |
| guardrail 多消息绕过 | 懂消息角色与护栏检查范围 | 注入指令直达模型、合规失效 | 第 2 层逐条 |
| 配额按 XFF 分桶 | 懂代理头伪造与令牌桶 | 成本型滥用、共享池饥饿 | 第 2 层逐条 |


**漏洞类别**

- 控制面 fail-open：SGLang、TRL、AReaL、SkyRL、OpenRLHF、LLaMA-Factory、Dify 都出现过“没配 key 就放行”或“默认 0.0.0.0”。
- 反序列化与代码执行：vLLM/SGLang 的 ZMQ/KV pickle、verl 的 checkpoint `recv_pyobj`、各框架的 `torch.load(weights_only=False)`、数据集 pickle。
- 模型加载供应链：`trust_remote_code` 默认/硬编码、revision 不固定、adapter/LoRA 路径可控。
- 网关与 Agent 平台：默认 master key、上游 key 明文、跨租户语义缓存、guardrail 只看首条消息、沙箱零前置 RCE。
- 推理状态泄露：前缀缓存时序、权重导出路径、dev 端点返回缓存/权重控制面。

**代表漏洞**

| 框架 | 2–5 个具体漏洞（名称） | 附录 A 条目 | 检测模板键 |
|---|---|---|---|
| vLLM | 插件路由绕过 api-key（`/plugins/*` 不在 GUARDED_PREFIX）；RL 控制路由挂 `/`；dev 端点无 key；前缀缓存时序 oracle；Mooncake/PyNccl KV pickle | `CVE-2025-32444`、`CVE-2025-47277`、`CVE-2025-59425` | `vllm-plugin-auth-bypass`、`vllm-timing-oracle`、`vllm-pickle-pipe-rce` |
| SGLang | 管理面 fail-open（无 key 即放行）；profiler `event_dir` 任意写；ZMQ/Encoder PD pickle；权重导出与 PD 路由投毒 | `CVE-2026-3059`、`CVE-2026-3060`、`CVE-2026-92972`、`CVE-2026-15978` | `sglang-admin-failopen`、`sglang-omni-profiler-write`、`sglang-zmq-pickle-rce`、`sglang-weight-exfil` |
| TRL | `vllm-serve` 强制 dev-mode；默认 0.0.0.0 且无 api-key；`trust_remote_code` 传播；数据集动态模板与缺 revision | `trl-sft-py-trust-remote-code-propagated-l78-regex`、`trl-data-utils-py-apply-chat-template-dynamic-l167-regex` | `trl-serve-dev-mode`、`sft-framework-surface` |
| verl | `prime_math` 对模型输出 eval；`prime_code` exec 生成代码；checkpoint `recv_pyobj`；HDFS 路径进 `os.system` | `CVE-2026-65110`、`CVE-2025-32434`（同族 checkpoint） | `verl-prime-code-exec`、`verl-checkpoint-pickle`、`verl-hdfs-command-injection` |
| AReaL | `/set_env` → `/create_engine` → `/call` 链式执行；`/load` 走 `weights_only=False`；`/awex` 任意保存 + NCCL 入组；data worker pickle | `CVE-2026-40217`（同类 exec 面）、`CVE-2025-32434`（同族反序列化） | `areal-setenv-engine-rce`、`areal-load-pickle`、`areal-awex-nccl-injection` |
| SkyRL | dev-mode `/update_weights` pickle；`/fetch_weights` 路径穿越；Tinker 控制面默认 0.0.0.0:8000 无鉴权 | `CVE-2025-32444`（同族 KV pickle）、`KUBERAY-ADV-2026-01`（同底座） | `skyrl-dev-pickle-rce`、`skyrl-fetch-weights-traversal`、`skyrl-tinker-hijack` |
| OpenRLHF | `serve_rm` 默认 0.0.0.0:5000 无鉴权；`vllm_engine` 强制不安全序列化 | `LITELLM-DEFAULT-KEY`（同类默认面）、`CVE-2025-32444`（同族 pickle） | `openrlhf-serve-rm`、`openrlhf-vllm-env-force` |
| slime | `/pull_weights` 补丁接受 `source_dir`/`local_checkpoint_dir`；debug/resume `torch.load(weights_only=False)` | `CVE-2025-32434`、`llamafactory-checkpoint-py-torch-load-unsafe-l136-ast`（同族 sink） | `slime-weight-pull-poison`、`python-dangerous-sinks` |
| LLaMA-Factory | checkpoint resume `torch.load(weights_only=False)`；WebUI/API 默认 fail-open；`trust_remote_code` 硬编码；SSRF 302 绕过 | `llamafactory-checkpoint-py-torch-load-unsafe-l136-ast`、`llamafactory-loader-py-missing-revision-l104-regex` | `llamafactory-checkpoint-rce`、`sft-framework-surface`、`outbound-ssrf` |
| ms-swift | `ModelLoader.default_trust_remote_code=True`；`device_groups` 受限 eval 逃逸；数据集 pickle；media 本地路径读 | `msswift-indexed-dataset-py-pickle-loads-l112-ast`、`msswift-indexed-dataset-py-pickle-loads-l129-ast` | `msswift-trust-remote-code`、`msswift-eval-escape`、`msswift-dataset-pickle-rce`、`msswift-media-local-read` |
| Megatron-LM | checkpoint `torch.load`；config 面暴露；optimizer 分片无签名加载 | `CVE-2026-65110`、`megatron-checkpointing-py-torch-load-any-l1739-regex`、`CVE-2025-23354` | `megatron-checkpoint-rce`、`megatron-deepspeed-config-surface`、`checkpoint-optimizer-state-poison` |
| DeepSpeed | stage3 `torch.load` 系列 sink；AutoEP 不安全转换；runner 命令拼接 | `deepspeed-stage3-py-torch-load-any-l3660-regex`、`CVE-2024-43497` | `deepspeed-checkpoint-rce`、`checkpoint-shard-poison` |
| transformers | `trust_remote_code` 动态模块导入；revision 漂移 | `transformers-dynamic-module-utils-py-dynamic-import-l248-ast`、`llamafactory-loader-py-missing-revision-l104-regex` | `trust-remote-code-supply-chain`、`supply-chain-pinning` |
| djev / vllm-jev | 默认无鉴权 + `/v1/*` 全量中继；GET 面无鉴权；插件端点绕过 api-key | `CVE-2026-35029`（同类管理面）、`CVE-2026-47102`（同类自提权） | `djev-open-proxy`、`vllm-plugin-auth-bypass` |
| Dify | dify-agent 鉴权 fail-open；默认 JWE 根密钥；快照跨租户；本地 shellctl 零前置 RCE | `CVE-2025-3466`、`CVE-2025-56520`、`CVE-2025-63387` | `dify-control-plane-failopen`、`dify-stub-token-forgery`、`dify-snapshot-cross-tenant-theft`、`dify-local-sandbox-unauth-rce` |
| Open WebUI | `/code/execute` 任意登录用户执行；`code_interpreter` 间接注入；文件覆盖与跨用户残留 | `CVE-2026-28788`、`CVE-2025-64496`、`CVE-2026-28786` | `open-webui-code-execute-rce`、`open-webui-indirect-injection-exec`、`open-webui-file-overwrite` |
| 网关（LiteLLM / Higress / Envoy AI） | 默认 master key；`/config/update` 缺管理员授权；上游 key 明文；跨租户语义缓存；guardrail 只看首条消息 | `LITELLM-DEFAULT-KEY`、`CVE-2026-35029`、`CVE-2026-40217`、`CVE-2026-42203` | `litellm-default-key-exfil`、`litellm-config-update-rce`、`aigateway-cache-cross-tenant`、`aigateway-guardrail-bypass` |

**检测方法**

每个框架至少两条证据：一条是“面”的证据（路由/绑定/版本/默认值），一条是“行为”的证据（无 key 200、写后读回 sha256、执行 marker、缓存命中计数）。模板键见上表；附录 A 给 152 条 registry 的逐条根因与片段。通用规则：先 `framework-port-matching` 指纹，再按框架选模板；不要在没确认版本/路由的情况下直接套 CVE。动态验证只证明检测逻辑在本地仿真或上游函数级成立，不证明目标一定是该版本。

**修复建议**

统一动作：管理面 fail-closed（无 key 即拒，不区分 GET/POST）；默认绑定回环，Service 暴露前加 NetworkPolicy；dev-mode 显式开关并只对 localhost 开放；pickle 改安全序列化，`torch.load` 固定 `weights_only=True`；checkpoint/权重目录只读 + 哈希/签名；`trust_remote_code` 默认 False，模型 revision 固定到 commit；网关移除默认 master key，上游 key 按租户隔离，缓存键加 tenant/salt。

**边界**

附录 A 的 152 条不是 18 个框架的全量漏洞库，而是有代码锚点、能按版本/配置核验的子集；AReaL、SkyRL、OpenRLHF、slime、djev/vllm-jev 的 registry 条目少，正文以模板键与上游 file:line 为准。多数条目只到函数级/静态级，真实利用需要目标版本、部署形态与授权窗口。框架默认值随版本漂移，修复建议不替代版本升级与回归。

**本节引用条目**：`CVE-2026-3059`、`CVE-2025-32434`、`CVE-2026-40217`、`CVE-2026-42203`、`LITELLM-DEFAULT-KEY`、`llamafactory-checkpoint-py-torch-load-unsafe-l136-ast`、`msswift-indexed-dataset-py-pickle-loads-l112-ast`、`CVE-2026-65110`、`CVE-2025-23354`、`CVE-2026-35029`、`CVE-2025-3466`、`CVE-2026-28788`。根因、代码片段、危害与修复见附录 A 对应行；重点条目另见附录 B/C。

### 2.2 逐条攻击面与演示（69 条）

#### L2-001 · `CVE-2023-48022` · Ray

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Ray | 2.8.0 | POST /api/jobs/ (8265/tcp) | `ray/dashboard/modules/job/job_head.py:273`；ShadowRay：Dashboard 未授权 Job 提交 RCE（Ray 2.8.0 实机复现） | entrypoint, runtime_env | 无 | ClusterIP/NodePort |

**根因片段**

```text
ray/dashboard/modules/job/job_head.py:273
271:         return Response(status=aiohttp.web.HTTPOk.status_code)
272:
273:     @routes.post("/api/jobs/")
274:     async def submit_job(self, req: Request) -> Response:
275:         result = await parse_and_validate_request(req, JobSubmitRequest)
276:         # Request parsing failed, returned with Response object.
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2023-48022"
SPEC = {'id': 'CVE-2023-48022', 'kind': 'http', 'method': 'POST', 'route': '/api/jobs/', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'CVE-2023-48022'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200/202 + job marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2023-48022`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2023-48022/poc.py`；上游 pin: `ray/dashboard/modules/job/job_head.py:273`

**清理**

`python demos/CVE-2023-48022/poc.py --cleanup`；删除 `demos/.work/CVE-2023-48022/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2023-48022/poc.py`（sha256 `15f080292e1c588e4183c81b51f8ec267ce8d4a0ba12103748a6e543baead6d9`）

- **检测/修复/证据**：`ray-job-marker-rce` / `inkblade/modules/ray-job-marker-rce/template.json`；dashboard token auth；8265 内网；RBAC 最小化；`lab/upstream_verify/cases/ray/CVE-2023-48022/result.json`

#### L2-002 · `CVE-2023-48023` · Ray

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Ray | 2.8.0 | GET /log_proxy (8265/tcp) | `ray/dashboard/modules/log/log_head.py:66`；Ray /log_proxy SSRF（Ray 2.8.0 实机复现） | url | 无 | ClusterIP |

**根因片段**

```text
ray/dashboard/modules/log/log_head.py:66
64:     @routes.get("/log_proxy")
65:     async def get_log_from_proxy(self, req) -> aiohttp.web.StreamResponse:
66:         url = req.query.get("url")
67:         if not url:
68:             raise Exception("url is None.")
69:         body = await req.read()
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2023-48023"
SPEC = {'id': 'CVE-2023-48023', 'kind': 'ssrf', 'route': '/log_proxy'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

SSRF 回环日志服务 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2023-48023`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2023-48023/poc.py`；上游 pin: `ray/dashboard/modules/log/log_head.py:66`

**清理**

`python demos/CVE-2023-48023/poc.py --cleanup`；删除 `demos/.work/CVE-2023-48023/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2023-48023/poc.py`（sha256 `19dd74917745379485fc4e9153a080923f8fe76c387ba2afa77339f200981bcd`）

- **检测/修复/证据**：`ray-job-marker-rce` / `inkblade/modules/ray-job-marker-rce/template.json`；dashboard token auth；8265 内网；RBAC 最小化；`lab/upstream_verify/cases/ray/CVE-2023-48023/result.json`

#### L2-003 · `CVE-2026-40217` · LiteLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LiteLLM | 1.82.0 | POST /guardrails/test_custom_code (4000/tcp) | `litellm/1.82.0/litellm/proxy/guardrails/guardrail_endpoints.py:1528`；/guardrails/test_custom_code 字节码改写 RCE | custom_code | 需 key（需 key（admin）） | ClusterIP |

**根因片段**

```text
litellm/1.82.0/litellm/proxy/guardrails/guardrail_endpoints.py:1528
1526:
1527:         try:
1528:             exec(compile(request.custom_code, "<guardrail>", "exec"), exec_globals)
1529:         except SyntaxError as e:
1530:             return TestCustomCodeGuardrailResponse(
1531:                 success=False,
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2026-40217"
SPEC = {'id': 'CVE-2026-40217', 'kind': 'http', 'method': 'POST', 'route': '/guardrails/test_custom_code', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'CVE-2026-40217'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 字节码执行 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2026-40217`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2026-40217/poc.py`；上游 pin: `litellm/proxy/guardrails/guardrail_endpoints.py:1528`

**清理**

`python demos/CVE-2026-40217/poc.py --cleanup`；删除 `demos/.work/CVE-2026-40217/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2026-40217/poc.py`（sha256 `cd2a9d52e7ce9db6cd56dcfa3ba1ff47e5bd2ffc7c46cc8e4014d5eaafb4680f`）

- **检测/修复/证据**：`litellm-config-update-rce` / `inkblade/modules/litellm-config-update-rce/template.json`；管理 API 管理员鉴权；配置更新审计；禁用自定义代码上传；`lab/upstream_verify/cases/litellm/CVE-2026-40217/result.json`

#### L2-004 · `CVE-2026-42203` · LiteLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LiteLLM | 1.82.0 | POST /prompts/test (4000/tcp) | `litellm/1.82.0/litellm/integrations/dotprompt/prompt_manager.py:62`；/prompts/test 模板注入 RCE | template | 需 key（需 key（virtual）） | ClusterIP |

**根因片段**

```text
litellm/1.82.0/litellm/integrations/dotprompt/prompt_manager.py:62
60:         self.prompts: Dict[str, PromptTemplate] = {}
61:         self.prompt_file = prompt_file
62:         self.jinja_env = Environment(
63:             loader=DictLoader({}),
64:             autoescape=select_autoescape(["html", "xml"]),
65:             # Use Handlebars-style delimiters to match Dotprompt spec
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2026-42203"
SPEC = {'id': 'CVE-2026-42203', 'kind': 'http', 'method': 'POST', 'route': '/prompts/test', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'CVE-2026-42203'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 模板注入 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2026-42203`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2026-42203/poc.py`；上游 pin: `litellm/integrations/dotprompt/prompt_manager.py:62`

**清理**

`python demos/CVE-2026-42203/poc.py --cleanup`；删除 `demos/.work/CVE-2026-42203/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2026-42203/poc.py`（sha256 `44edc6137ce1e8d4c49708d65a6820c28fa196359a7c2ddc84c3014437d0a8e5`）

- **检测/修复/证据**：`litellm-config-update-rce` / `inkblade/modules/litellm-config-update-rce/template.json`；管理 API 管理员鉴权；配置更新审计；禁用自定义代码上传；`lab/upstream_verify/cases/litellm/CVE-2026-42203/result.json`

#### L2-005 · `CVE-2026-53995` · MLflow

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| MLflow | 3.17.1 | HTTP POST /ajax-api/2.0/mlflow/traces (5000/tcp) | `mlflow/3.17.1/mlflow/store/tracking/file_store.py:1773`；FileStore trace ID 路径穿越任意写 | trace_id | 无（无/需 token） | ClusterIP |

**根因片段**

```text
mlflow/3.17.1/mlflow/store/tracking/file_store.py:1773
1771:         mkdir(experiment_dir, FileStore.TRACES_FOLDER_NAME)
1772:         traces_dir = os.path.join(experiment_dir, FileStore.TRACES_FOLDER_NAME)
1773:         mkdir(traces_dir, trace_info.trace_id)
1774:         trace_dir = os.path.join(traces_dir, trace_info.trace_id)
1775:
1776:         # Add artifact location to tags
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2026-53995"
SPEC = {'id': 'CVE-2026-53995', 'kind': 'path', 'payload': '../victim.txt'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

trace 目录任意写 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2026-53995`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2026-53995/poc.py`；上游 pin: `mlflow/3.17.1/mlflow/store/tracking/file_store.py:1773`

**清理**

`python demos/CVE-2026-53995/poc.py --cleanup`；删除 `demos/.work/CVE-2026-53995/`；仿真服务随脚本退出停止

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：`demos/CVE-2026-53995/poc.py`（sha256 `df8e6e9655db78d4c65375b0257b34a1988bea2a5724dcce7037db0663cda987`）

- **检测/修复/证据**：`mlflow-trace-write` / `inkblade/modules/mlflow-trace-write/template.json`；artifact 路径校验；tracking server 鉴权；MLproject 签名；`lab/upstream_verify/cases/mlflow/CVE-2026-53995/result.json`

#### L2-006 · `areal-awex` · areal

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| areal | 448de52 | POST /awex (9000/tcp) | `areal/sglang/awex（入口/函数级，无行号）`；AReaL SGLang /awex/* unauthenticated: arbitrary torch.save + join arbitrary NCCL group | save path, NCCL world/rank | 无 | ClusterIP |

**根因片段**

```text
areal/sglang/awex（入口/函数级，无行号）
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-areal-awex"
SPEC = {'id': 'areal-awex', 'kind': 'http', 'method': 'POST', 'route': '/awex', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'areal-awex'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + NCCL 入组 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-areal-awex`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/areal-awex/poc.py`；上游 pin: `n/a（advisory）`

**清理**

`python demos/areal-awex/poc.py --cleanup`；删除 `demos/.work/areal-awex/`；仿真服务随脚本退出停止

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：`demos/areal-awex/poc.py`（sha256 `2d6ba566c5a75d47c1157e95e3b4d48bec31d5e3be94df6fe3cee15cf01dbadf`）

- **检测/修复/证据**：`areal-awex-nccl-injection` / `inkblade/modules/areal-awex-nccl-injection/template.json`；/awex 路径白名单；NCCL 入组令牌；master_addr/port 不可请求控制；`projects/repro-2026-10/areal-awex-sglang/LATEST-RESULT.md`

#### L2-007 · `areal-dataservice-pickle` · areal

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| areal | 448de52 | 文件: data service payload | `areal/infra/data_service/worker/app.py:268`；AReaL data-service worker /run accepts pickle.load without auth | pickle payload | 无（无（服务可达）） | Pod 内 |

**根因片段**

```text
areal/infra/data_service/worker/app.py:268
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-areal-dataservice-pickle"
SPEC = {'id': 'areal-dataservice-pickle', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-areal-dataservice-pickle`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/areal-dataservice-pickle/poc.py`；上游 pin: `areal/infra/data_service/worker/app.py:268`

**清理**

`python demos/areal-dataservice-pickle/poc.py --cleanup`；删除 `demos/.work/areal-dataservice-pickle/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/areal-dataservice-pickle/poc.py`（sha256 `0977b15b262f6326f19465c00c7417af54381de9cfeaba3702c4c3afa340f028`）

- **检测/修复/证据**：`areal-load-pickle` / `inkblade/modules/areal-load-pickle/template.json`；/load 固定 weights_only=True；checkpoint 签名/哈希；`projects/repro-2026-10/areal-dataservice-pickle/LATEST-RESULT.md`

#### L2-008 · `areal-unauth-engine-control` · areal

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| areal | 448de52 | POST /set_env (9000/tcp) | `areal/experimental/proxy_rollout_server.py:445`；AReaL proxy rollout control plane: unauthenticated /set_env + /create_engine + /call | env | 无 | ClusterIP |

**根因片段**

```text
areal/experimental/proxy_rollout_server.py:445
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-areal-unauth-engine-control"
SPEC = {'id': 'areal-unauth-engine-control', 'kind': 'http', 'method': 'POST', 'route': '/set_env', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'areal-unauth-engine-control'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 环境变量写入 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-areal-unauth-engine-control`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/areal-unauth-engine-control/poc.py`；上游 pin: `areal/experimental/proxy_rollout_server.py:445`

**清理**

`python demos/areal-unauth-engine-control/poc.py --cleanup`；删除 `demos/.work/areal-unauth-engine-control/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/areal-unauth-engine-control/poc.py`（sha256 `afad46b694830e85dd3ea34fd039b30808d2aff6fbba6ba0dc1b9e9bcbd321ac`）

- **检测/修复/证据**：`areal-setenv-engine-rce` / `inkblade/modules/areal-setenv-engine-rce/template.json`；移除任意 import/getattr；引擎白名单 + 子类校验；控制面统一鉴权；`projects/repro-2026-10/PR1-areal-unauth-engine-control/RESULT.md`

#### L2-009 · `areal-v2-worker` · areal

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| areal | 448de52 | 文件: data worker payload | `areal/v2/engine/fsdp_engine.py:1965`；AReaL v2 worker /load -> torch.load(weights_only=False) without auth (+/save, /data, /awex) | pickle payload | 无（无（worker 可达）） | Pod 内 |

**根因片段**

```text
areal/v2/engine/fsdp_engine.py:1965
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-areal-v2-worker"
SPEC = {'id': 'areal-v2-worker', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-areal-v2-worker`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/areal-v2-worker/poc.py`；上游 pin: `areal/v2/engine/fsdp_engine.py:1965`

**清理**

`python demos/areal-v2-worker/poc.py --cleanup`；删除 `demos/.work/areal-v2-worker/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/areal-v2-worker/poc.py`（sha256 `938ae4b534d7824a9a8afa6835827813f4266f819c05341c4ca9457944fc4caf`）

- **检测/修复/证据**：`areal-load-pickle` / `inkblade/modules/areal-load-pickle/template.json`；/load 固定 weights_only=True；checkpoint 签名/哈希；`projects/repro-2026-10/areal-v2-worker/LATEST-RESULT.md`

#### L2-010 · `dify-agent-auth-failopen` · Dify

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Dify | v1.17.1 / bbfac7a | POST /agent-stub/v1/chat (8080/tcp) | `dify-agent/src/dify_agent/server/auth.py:17`；dify-agent backend auth fail-open (token None -> allow all) + public dev token in compose | token, messages | 无 | ClusterIP |

**根因片段**

```text
dify-agent/src/dify_agent/server/auth.py:17
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-dify-agent-auth-failopen"
SPEC = {'id': 'dify-agent-auth-failopen', 'kind': 'http', 'method': 'POST', 'route': '/agent-stub/v1/chat', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'dify-agent-auth-failopen'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 控制面 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-dify-agent-auth-failopen`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/dify-agent-auth-failopen/poc.py`；上游 pin: `dify-agent/src/dify_agent/server/auth.py:17`

**清理**

`python demos/dify-agent-auth-failopen/poc.py --cleanup`；删除 `demos/.work/dify-agent-auth-failopen/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/dify-agent-auth-failopen/poc.py`（sha256 `96358c86bff2dc00d8cdaa2f4af8ea6368e0c468a33d0a7d454d218ab312621e`）

- **检测/修复/证据**：`dify-control-plane-failopen` / `inkblade/modules/dify-control-plane-failopen/template.json`；dify-agent token 缺失即拒；仅回环；控制租约收窄；`projects/agent-2026-10/results/repro-dify/RESULT.md`

#### L2-011 · `dify-home-snapshot-cross-tenant` · Dify

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Dify | v1.17.1 | HTTP GET /console/api/workspaces/current/snapshot | `dify-agent/src/dify_agent/runtime_backend/local.py:240`；Dify local runtime: snapshot/control-lease root is common ancestor -> cross-tenant home snapshot theft | snapshot_id | 需 key（需 key） | ClusterIP |

**根因片段**

```text
dify-agent/src/dify_agent/runtime_backend/local.py:240
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-dify-home-snapshot-cross-tenant"
SPEC = {'id': 'dify-home-snapshot-cross-tenant', 'kind': 'path', 'payload': '../victim.txt'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

跨租户快照 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-dify-home-snapshot-cross-tenant`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/dify-home-snapshot-cross-tenant/poc.py`；上游 pin: `dify-agent/src/dify_agent/runtime_backend/local.py:240`

**清理**

`python demos/dify-home-snapshot-cross-tenant/poc.py --cleanup`；删除 `demos/.work/dify-home-snapshot-cross-tenant/`；仿真服务随脚本退出停止

**危害**

C:H / I:M / A:L / 训练:L / 租户:H / 合规:H（缓存/显存残留跨租户可读，命中率与时序还会泄露其他租户的请求模式）

- **演示脚本**：`demos/dify-home-snapshot-cross-tenant/poc.py`（sha256 `317065e9e59960120c1e7ac1502d0346f860fc7b13a65d473be77090c3190f80`）

- **检测/修复/证据**：`dify-snapshot-cross-tenant-theft` / `inkblade/modules/dify-snapshot-cross-tenant-theft/template.json`；快照按租户校验；控制租约根收窄；家目录隔离；`projects/agent-2026-10/results/repro-dify/RESULT.md`

#### L2-012 · `dify-shellctl-unauth-rce` · Dify

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Dify | v1.17.1 | HTTP POST /v1/execute (5004/tcp) | `dify-agent/docker/docker-compose.yaml:559`；Dify 1.17.1 shellctl sandbox daemon: no auth -> zero-precondition host RCE + all tenant homes | code | 无 | ClusterIP |

**根因片段**

```text
dify-agent/docker/docker-compose.yaml:559
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-dify-shellctl-unauth-rce"
SPEC = {'id': 'dify-shellctl-unauth-rce', 'kind': 'command', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

sandbox exec -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-dify-shellctl-unauth-rce`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/dify-shellctl-unauth-rce/poc.py`；上游 pin: `dify-agent/docker/docker-compose.yaml:559`

**清理**

`python demos/dify-shellctl-unauth-rce/poc.py --cleanup`；删除 `demos/.work/dify-shellctl-unauth-rce/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/dify-shellctl-unauth-rce/poc.py`（sha256 `282eb51515afbebf1f876e8a47e29957fac177723bc5bb04673f07ab5f738c61`）

- **检测/修复/证据**：`dify-local-sandbox-unauth-rce` / `inkblade/modules/dify-local-sandbox-unauth-rce/template.json`；shellctl 强制 token；沙箱独立容器；作业级配额；`projects/agent-2026-10/results/repro-dify/RESULT.md`

#### L2-013 · `dify-stub-jwe-default-key` · Dify

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Dify | v1.17.1 | HTTP POST /agent-stub/* | `dify/docker/docker-compose.yaml:689`；Dify Agent Stub JWE root key hardcoded public default -> offline token forgery | token | 无 | ClusterIP |

**根因片段**

```text
dify/docker/docker-compose.yaml:689
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-dify-stub-jwe-default-key"
SPEC = {'id': 'dify-stub-jwe-default-key', 'kind': 'jwt', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

默认 JWE 密钥伪造 token 通过

预期输出样例：`200` + marker `INKBLADE-BENIGN-dify-stub-jwe-default-key`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/dify-stub-jwe-default-key/poc.py`；上游 pin: `dify/docker/docker-compose.yaml:689`

**清理**

`python demos/dify-stub-jwe-default-key/poc.py --cleanup`；删除 `demos/.work/dify-stub-jwe-default-key/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：`demos/dify-stub-jwe-default-key/poc.py`（sha256 `c88540e3214f9043f65bb392526f7531cc801f2ffb78a1b09f8d9cc557468e04`）

- **检测/修复/证据**：`dify-stub-token-forgery` / `inkblade/modules/dify-stub-token-forgery/template.json`；移除默认 JWE 根密钥；首启强制生成；轮换；`projects/agent-2026-10/results/repro-dify/RESULT.md`

#### L2-014 · `djev-open-proxy` · djev

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| djev | e5841cf | POST /v1/chat/completions (8081/tcp) | `djev/structured_server.py:1990`；djev default-open proxy: no key + /v1/* relay + GET bypass when key configured | model, messages | 无 | ClusterIP |

**根因片段**

```text
djev/structured_server.py:1990
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-djev-open-proxy"
SPEC = {'id': 'djev-open-proxy', 'kind': 'http', 'method': 'POST', 'route': '/v1/chat/completions', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'djev-open-proxy'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 上游响应 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-djev-open-proxy`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/djev-open-proxy/poc.py`；上游 pin: `djev/structured_server.py:1990`

**清理**

`python demos/djev-open-proxy/poc.py --cleanup`；删除 `demos/.work/djev-open-proxy/`；仿真服务随脚本退出停止

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：`demos/djev-open-proxy/poc.py`（sha256 `e071ee4ca1896a5b3559adc9c1def07c5e11a1087136e45c01ca2c7d3ae5733b`）

- **检测/修复/证据**：`djev-open-proxy` / `inkblade/modules/djev-open-proxy/template.json`；按最小权限与 fail-closed 原则收窄入口；补鉴权、输入校验、只读挂载与审计告警；`projects/repro-2026-10/P2-djev-open-proxy/LATEST-RESULT.md`

#### L2-015 · `llm2jev-image-file` · llm2jev

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| llm2jev | f2bdad6 | HTTP POST /v1/chat/completions (image path) | `image_inputs.py:40`；LLM2Jev image_url accepts file://, local paths and arbitrary http(s) -> local file read + SSRF | image | 无 | ClusterIP |

**根因片段**

```text
image_inputs.py:40
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-llm2jev-image-file"
SPEC = {'id': 'llm2jev-image-file', 'kind': 'path', 'payload': '../victim.txt'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

本地文件 marker 读回

预期输出样例：`200` + marker `INKBLADE-BENIGN-llm2jev-image-file`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/llm2jev-image-file/poc.py`；上游 pin: `image_inputs.py:40`

**清理**

`python demos/llm2jev-image-file/poc.py --cleanup`；删除 `demos/.work/llm2jev-image-file/`；仿真服务随脚本退出停止

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：`demos/llm2jev-image-file/poc.py`（sha256 `58faf2615670836d99cd8d968808f6b1fbd7a4cc0e5cad75fd716435f5dcdeba`）

- **检测/修复/证据**：`llm2jev-file-read` / `inkblade/modules/llm2jev-file-read/template.json`；统一媒体/URL 连接器；拒绝私网与链路本地地址；逐跳校验重定向；IMDSv2 + hop limit 1；`projects/repro-2026-10/P6-llm2jev-image-file-ssrf/LATEST-RESULT.md`

#### L2-016 · `msswift-eval-escape` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | 4.5.3 / fbc61cf | 配置: device_groups eval | `swift/ray_utils/resource_manager.py:48`；ms-swift --device_groups ranks restricted eval() escape; WebUI more_params reachable | device_groups | 需本地（需配置/请求） | 服务进程 |

**根因片段**

```text
swift/ray_utils/resource_manager.py:48
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-msswift-eval-escape"
SPEC = {'id': 'msswift-eval-escape', 'kind': 'exec', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

eval 逃逸 -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-msswift-eval-escape`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/msswift-eval-escape/poc.py`；上游 pin: `swift/ray_utils/resource_manager.py:48`

**清理**

`python demos/msswift-eval-escape/poc.py --cleanup`；删除 `demos/.work/msswift-eval-escape/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/msswift-eval-escape/poc.py`（sha256 `27f5a3b892d09aa087974ce4662063e0ec90b64264c786f1473cdcfd0557f820`）

- **检测/修复/证据**：`msswift-eval-escape` / `inkblade/modules/msswift-eval-escape/template.json`；device_groups 解析器替代 eval；参数白名单；`projects/repro-2026-10/MSW-2-msswift-eval-escape/LATEST-RESULT.md`

#### L2-017 · `msswift-media-local-read` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | HTTP POST /v1/chat/completions (media path) | `swift/infer_engine/protocol.py:275`；ms-swift 4.6.0 deploy media path reads arbitrary host files by default | media path | 无 | ClusterIP |

**根因片段**

```text
swift/infer_engine/protocol.py:275
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-msswift-media-local-read"
SPEC = {'id': 'msswift-media-local-read', 'kind': 'path', 'payload': '../victim.txt'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

本地文件 marker 读回

预期输出样例：`200` + marker `INKBLADE-BENIGN-msswift-media-local-read`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/msswift-media-local-read/poc.py`；上游 pin: `swift/infer_engine/protocol.py:275`

**清理**

`python demos/msswift-media-local-read/poc.py --cleanup`；删除 `demos/.work/msswift-media-local-read/`；仿真服务随脚本退出停止

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：`demos/msswift-media-local-read/poc.py`（sha256 `bffbda175498547d86e002eb38b1d35f4a35240b4774b037f4a8ec713b19b670`）

- **检测/修复/证据**：`msswift-media-local-read` / `inkblade/modules/msswift-media-local-read/template.json`；media 路径白名单；拒绝 file:// 与本地路径；`lab/zeroday_reserve/cases/msswift-media-local-read/result.json`

#### L2-018 · `onejev-media-ssrf` · onejev

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| onejev | 6122519 | GET /media (8000/tcp) | `qev/media.py:101`；OneJev qev/media.py urlopen without policy -> SSRF | url | 无（无/需 key） | ClusterIP |

**根因片段**

```text
qev/media.py:101
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-onejev-media-ssrf"
SPEC = {'id': 'onejev-media-ssrf', 'kind': 'ssrf', 'route': '/media'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

回环内部服务 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-onejev-media-ssrf`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/onejev-media-ssrf/poc.py`；上游 pin: `qev/media.py:101`

**清理**

`python demos/onejev-media-ssrf/poc.py --cleanup`；删除 `demos/.work/onejev-media-ssrf/`；仿真服务随脚本退出停止

**危害**

C:H / I:L / A:L / 训练:L / 租户:M / 合规:H（出站请求或凭据泄露把集群边界延伸到云 IAM 与对象存储）

- **演示脚本**：`demos/onejev-media-ssrf/poc.py`（sha256 `e772788276c6d04244350fded06cd1976d9f09ce6603504e457076f47c996cbb`）

- **检测/修复/证据**：`onejev-ssrf` / `inkblade/modules/onejev-ssrf/template.json`；统一媒体/URL 连接器；拒绝私网与链路本地地址；逐跳校验重定向；IMDSv2 + hop limit 1；`projects/repro-2026-10/P7-onejev-media-ssrf/LATEST-RESULT.md`

#### L2-019 · `openjev-clef-release-module` · openjev

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| openjev | b4339c6 | 模型/插件: CLEF release module | `openjev/clef_vllm.py:40`；OpenJev Clef release_module() executes model-directory joint_schema_model.py; revision missing | module path | 需本地（需加载） | 服务进程 |

**根因片段**

```text
openjev/clef_vllm.py:40
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-openjev-clef-release-module"
SPEC = {'id': 'openjev-clef-release-module', 'kind': 'import', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

import-time marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-openjev-clef-release-module`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/openjev-clef-release-module/poc.py`；上游 pin: `openjev/clef_vllm.py:40`

**清理**

`python demos/openjev-clef-release-module/poc.py --cleanup`；删除 `demos/.work/openjev-clef-release-module/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/openjev-clef-release-module/poc.py`（sha256 `3601aa01e58a0f037c6a815b8cff3d627defb8e9c2e1ec3eec2edc5f4ff602cb`）

- **检测/修复/证据**：`openjev-clef-release-module` / `inkblade/modules/openjev-clef-release-module/template.json`；固定 commit/revision 与内容哈希；禁止浮动分支；升级走双人复核与回滚包；`projects/repro-2026-10/P4-openjev-clef-release-module/LATEST-RESULT.md`

#### L2-020 · `openrlhf-serve-rm` · openrlhf

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| openrlhf | 0.11.2 / dc2a7ad | POST /v1/score (5000/tcp) | `openrlhf/cli/serve_rm.py（入口/函数级，无行号）`；OpenRLHF serve_rm binds 0.0.0.0:5000 without authentication | messages | 无 | ClusterIP |

**根因片段**

```text
openrlhf/cli/serve_rm.py（入口/函数级，无行号）
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-openrlhf-serve-rm"
SPEC = {'id': 'openrlhf-serve-rm', 'kind': 'http', 'method': 'POST', 'route': '/v1/score', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'openrlhf-serve-rm'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 评分响应 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-openrlhf-serve-rm`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/openrlhf-serve-rm/poc.py`；上游 pin: `n/a（advisory）`

**清理**

`python demos/openrlhf-serve-rm/poc.py --cleanup`；删除 `demos/.work/openrlhf-serve-rm/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：`demos/openrlhf-serve-rm/poc.py`（sha256 `68bf7bf5bce11b991ac56b5759c7ebaf3857a380a7395b623253aec6c7594c8f`）

- **检测/修复/证据**：`openrlhf-serve-rm` / `inkblade/modules/openrlhf-serve-rm/template.json`；serve_rm 鉴权；默认回环；奖励分数签名/审计；`projects/repro-2026-10/openrlhf-serve-rm/RESULT.md`

#### L2-021 · `openrlhf-vllm-insecure` · openrlhf

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| openrlhf | 0.11.2 / dc2a7ad | 环境变量: VLLM_ALLOW_INSECURE_SERIALIZATION | `openrlhf/trainer/ray/vllm_engine.py:95`；OpenRLHF unconditionally sets VLLM_ALLOW_INSECURE_SERIALIZATION=1 | env, payload | 需本地（需进程环境） | 训练进程 |

**根因片段**

```text
openrlhf/trainer/ray/vllm_engine.py:95
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-openrlhf-vllm-insecure"
SPEC = {'id': 'openrlhf-vllm-insecure', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-openrlhf-vllm-insecure`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/openrlhf-vllm-insecure/poc.py`；上游 pin: `openrlhf/trainer/ray/vllm_engine.py:95`

**清理**

`python demos/openrlhf-vllm-insecure/poc.py --cleanup`；删除 `demos/.work/openrlhf-vllm-insecure/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/openrlhf-vllm-insecure/poc.py`（sha256 `84ddfb00f00655b2242b124e9595add98280f3435ce5969050fe2a65c15d10c0`）

- **检测/修复/证据**：`openrlhf-vllm-env-force` / `inkblade/modules/openrlhf-vllm-env-force/template.json`；移除 VLLM_ALLOW_INSECURE_SERIALIZATION；IPC 改安全序列化；`projects/repro-2026-10/openrlhf-vllm-env-force/RESULT.md`

#### L2-022 · `openwebui-code-interpreter-bypass` · Open WebUI

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Open WebUI | v0.12.3 / 91ea4e3 | HTTP POST /code/execute (8080/tcp) | `backend/open_webui/utils/middleware.py:6111`；Open WebUI code_interpreter guard: BLOCKED_MODULES empty + __import__ patch only top-level __main__ | code | 需本地（需登录） | ClusterIP |

**根因片段**

```text
backend/open_webui/utils/middleware.py:6111
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-openwebui-code-interpreter-bypass"
SPEC = {'id': 'openwebui-code-interpreter-bypass', 'kind': 'exec', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

exec -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-openwebui-code-interpreter-bypass`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/openwebui-code-interpreter-bypass/poc.py`；上游 pin: `backend/open_webui/utils/middleware.py:6111`

**清理**

`python demos/openwebui-code-interpreter-bypass/poc.py --cleanup`；删除 `demos/.work/openwebui-code-interpreter-bypass/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/openwebui-code-interpreter-bypass/poc.py`（sha256 `e94b27a105e671afa94b463b31781b8eb1cfa4f836cfd7a3f16cfc440af3fcdd`）

- **检测/修复/证据**：`open-webui-indirect-injection-exec` / `inkblade/modules/open-webui-indirect-injection-exec/template.json`；服务端 code_interpreter 容器化；模块白名单；`projects/agent-2026-10/results/repro-owui/RESULT.md`

#### L2-023 · `sglang-omni-admin-failopen` · sglang-omni

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| sglang-omni | HEAD 204ba29 | POST /api/v1/profile (30000/tcp) | `sglang_omni/http/admin_auth.py:28`；sglang-omni admin dependency is a no-op without SGLANG_OMNI_ADMIN_KEY; profiler event_dir is request-controlled | event_dir | 无 | ClusterIP |

**根因片段**

```text
sglang_omni/http/admin_auth.py:28
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-sglang-omni-admin-failopen"
SPEC = {'id': 'sglang-omni-admin-failopen', 'kind': 'http', 'method': 'POST', 'route': '/api/v1/profile', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'sglang-omni-admin-failopen'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + profiler 目录 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-sglang-omni-admin-failopen`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/sglang-omni-admin-failopen/poc.py`；上游 pin: `sglang_omni/http/admin_auth.py:28`

**清理**

`python demos/sglang-omni-admin-failopen/poc.py --cleanup`；删除 `demos/.work/sglang-omni-admin-failopen/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：`demos/sglang-omni-admin-failopen/poc.py`（sha256 `cde4eff95f2a1218affb2ee518b2b7899ae7b0b2fd51bde66e2157a887bb30f6`）

- **检测/修复/证据**：`sglang-omni-profiler-write` / `inkblade/modules/sglang-omni-profiler-write/template.json`；profiler event_dir 白名单；写入面只读挂载；管理面鉴权；`projects/repro-2026-10/P3-sglang-omni-admin-failopen/LATEST-RESULT.md`

#### L2-024 · `siliconlab-credential-exfil` · siliconlab

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| siliconlab | a08e969 | 配置面/CLI: `server/index.ts:40` | `server/index.ts:40`；OpenJev-SiliconLabAI request-controlled base_url/decider_url + server-side API key leakage | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
server/index.ts:40
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — 纯凭据/云账号面；按安全边界不使用真实凭据。

**攻击效果**

N/A（纯凭据/云账号面；按安全边界不使用真实凭据。）

**复现环境**

reserve：纯凭据/云账号面；按安全边界不使用真实凭据。

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — 纯凭据/云账号面；按安全边界不使用真实凭据。

- **检测/修复/证据**：`siliconlab-credential-exfil` / `inkblade/modules/siliconlab-credential-exfil/template.json`；移除 eval/exec/os.system；改解析器或参数化 API；把执行放进最小权限沙箱并记录审计；`projects/repro-2026-10/P8-siliconlab-openjev-ssrf/LATEST-RESULT.md`

#### L2-025 · `skyrl-fetch-weights` · skyrl

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| skyrl | a1e34db | HTTP GET /fetch_weights | `skyrl/weight_sync/delta/checkpoint.py:257`；SkyRL /fetch_weights payload_files path traversal write + weight poisoning | cache_dir, payload_file | 无 | ClusterIP |

**根因片段**

```text
skyrl/weight_sync/delta/checkpoint.py:257
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-skyrl-fetch-weights"
SPEC = {'id': 'skyrl-fetch-weights', 'kind': 'path', 'payload': '../victim.txt'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

任意写 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-skyrl-fetch-weights`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/skyrl-fetch-weights/poc.py`；上游 pin: `skyrl/weight_sync/delta/checkpoint.py:257`

**清理**

`python demos/skyrl-fetch-weights/poc.py --cleanup`；删除 `demos/.work/skyrl-fetch-weights/`；仿真服务随脚本退出停止

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：`demos/skyrl-fetch-weights/poc.py`（sha256 `736647e2ae583340c32536ab199fca320195f37f23bd11916f9c3d7935dfd6c7`）

- **检测/修复/证据**：`skyrl-fetch-weights-traversal` / `inkblade/modules/skyrl-fetch-weights-traversal/template.json`；payload_files realpath 校验；cache_dir 前缀白名单；`projects/repro-2026-10/PR2-skyrl-fetch-weights-traversal/RESULT.md`

#### L2-026 · `skyrl-tinker-api` · skyrl

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| skyrl | a1e34db | POST /api/v1/train (8000/tcp) | `skyrl/tinker/api.py（入口/函数级，无行号）`；SkyRL Tinker API binds 0.0.0.0:8000 and has no authentication on 8 endpoints | model, config | 无 | ClusterIP |

**根因片段**

```text
skyrl/tinker/api.py（入口/函数级，无行号）
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-skyrl-tinker-api"
SPEC = {'id': 'skyrl-tinker-api', 'kind': 'http', 'method': 'POST', 'route': '/api/v1/train', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'skyrl-tinker-api'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 训练控制 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-skyrl-tinker-api`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/skyrl-tinker-api/poc.py`；上游 pin: `n/a（advisory）`

**清理**

`python demos/skyrl-tinker-api/poc.py --cleanup`；删除 `demos/.work/skyrl-tinker-api/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：`demos/skyrl-tinker-api/poc.py`（sha256 `1da114c14659dbb7aa15cf9658f0e34e5e98623c9e1134680c1fac43160165e0`）

- **检测/修复/证据**：`skyrl-tinker-hijack` / `inkblade/modules/skyrl-tinker-hijack/template.json`；Tinker 控制面鉴权；默认回环；路由 RBAC；`projects/repro-2026-10/skyrl-tinker-api/LATEST-RESULT.md`

#### L2-027 · `skyrl-vllm-devmode` · skyrl

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| skyrl | a1e34db | HTTP POST /update_weights (dev mode) | `skyrl_train/workers/vllm_server_actor.py:216`；SkyRL forces vLLM 0.0.0.0 + dev-mode + insecure serialization + unauthenticated /fetch_weights | payload | 无（无（dev mode）） | ClusterIP |

**根因片段**

```text
skyrl_train/workers/vllm_server_actor.py:216
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-skyrl-vllm-devmode"
SPEC = {'id': 'skyrl-vllm-devmode', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-skyrl-vllm-devmode`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/skyrl-vllm-devmode/poc.py`；上游 pin: `skyrl_train/workers/vllm_server_actor.py:216`

**清理**

`python demos/skyrl-vllm-devmode/poc.py --cleanup`；删除 `demos/.work/skyrl-vllm-devmode/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/skyrl-vllm-devmode/poc.py`（sha256 `ac11ab8eb2058973f5f6d1d20040b74ad296abc6f621da6e420b4ffb472861ef`）

- **检测/修复/证据**：`skyrl-dev-pickle-rce` / `inkblade/modules/skyrl-dev-pickle-rce/template.json`；dev-mode 默认关；/update_weights 鉴权；pickle 安全化；`projects/repro-2026-10/skyrl-vllm-devmode/LATEST-RESULT.md`

#### L2-028 · `slime-pull-weights` · slime

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| slime | slime 05e3b01 / SGLang v0.5.15.post1 | HTTP POST /pull_weights | `docker/patch/latest/sglang-pull_weights.patch:17`；slime private /pull_weights patch: ADMIN_OPTIONAL + request-controlled source_dir/local_checkpoint_dir | source_dir, local_checkpoint_dir | 无 | ClusterIP |

**根因片段**

```text
docker/patch/latest/sglang-pull_weights.patch:17
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-slime-pull-weights"
SPEC = {'id': 'slime-pull-weights', 'kind': 'path', 'payload': '../victim.txt'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

权重目录 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-slime-pull-weights`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/slime-pull-weights/poc.py`；上游 pin: `docker/patch/latest/sglang-pull_weights.patch:17`

**清理**

`python demos/slime-pull-weights/poc.py --cleanup`；删除 `demos/.work/slime-pull-weights/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/slime-pull-weights/poc.py`（sha256 `050c01f3e032233a418fcfc0b970932d7feda13549f5df57bcef7d4db4fda952`）

- **检测/修复/证据**：`slime-weight-pull-poison` / `inkblade/modules/slime-weight-pull-poison/template.json`；/pull_weights 路径白名单；补丁代码审计；权重写入按租户隔离；`projects/repro-2026-10/PR3-slime-pull-weights/LATEST-RESULT.md`

#### L2-029 · `slime-torch-load` · slime

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| slime | 05e3b01 | 文件: torch.load checkpoint | `slime/backends/sglang_utils/load_debug_rollout_data.py（入口/函数级，无行号）`；slime debug/resume data torch.load(weights_only=False) in multiple sinks | checkpoint dir | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
slime/backends/sglang_utils/load_debug_rollout_data.py（入口/函数级，无行号）
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-slime-torch-load"
SPEC = {'id': 'slime-torch-load', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-slime-torch-load`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/slime-torch-load/poc.py`；上游 pin: `n/a（advisory）`

**清理**

`python demos/slime-torch-load/poc.py --cleanup`；删除 `demos/.work/slime-torch-load/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/slime-torch-load/poc.py`（sha256 `a826828d849b43fb92933f16494266ae4f48e0a33f57bb4e684391f7554d85ac`）

- **检测/修复/证据**：`slime-weight-pull-poison` / `inkblade/modules/slime-weight-pull-poison/template.json`；/pull_weights 路径白名单；补丁代码审计；权重写入按租户隔离；`projects/repro-2026-10/slime-torch-load/RESULT.md`

#### L2-030 · `trl-vllm-serve-devmode` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | 1.15.0 | POST /v1/chat/completions (8000/tcp) | `trl/scripts/vllm_serve.py:103`；trl vllm-serve defaults to 0.0.0.0 + VLLM_SERVER_DEV_MODE=1 + no api-key | model, messages | 无（无（dev mode）） | ClusterIP |

**根因片段**

```text
trl/scripts/vllm_serve.py:103
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-trl-vllm-serve-devmode"
SPEC = {'id': 'trl-vllm-serve-devmode', 'kind': 'http', 'method': 'POST', 'route': '/v1/chat/completions', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'trl-vllm-serve-devmode'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 推理响应 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-trl-vllm-serve-devmode`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/trl-vllm-serve-devmode/poc.py`；上游 pin: `trl/scripts/vllm_serve.py:103`

**清理**

`python demos/trl-vllm-serve-devmode/poc.py --cleanup`；删除 `demos/.work/trl-vllm-serve-devmode/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：`demos/trl-vllm-serve-devmode/poc.py`（sha256 `44f1c8632f261fad60d13ca1bb931a0327812d147f1534667510374692f83cb7`）

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`projects/repro-2026-10/PR5-trl-vllm-serve/LATEST-RESULT.md`

#### L2-031 · `verl-hdfs-command-injection` · verl

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| verl | 76e837e | CLI: HDFS path -> os.system | `verl/utils/checkpoint/checkpoint_handler.py:136`；verl HDFS path is interpolated into os.system (command injection) | hdfs path | 需本地（需调用） | 训练进程 |

**根因片段**

```text
verl/utils/checkpoint/checkpoint_handler.py:136
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-verl-hdfs-command-injection"
SPEC = {'id': 'verl-hdfs-command-injection', 'kind': 'command', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

命令执行 -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-verl-hdfs-command-injection`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/verl-hdfs-command-injection/poc.py`；上游 pin: `verl/utils/checkpoint/checkpoint_handler.py:136`

**清理**

`python demos/verl-hdfs-command-injection/poc.py --cleanup`；删除 `demos/.work/verl-hdfs-command-injection/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/verl-hdfs-command-injection/poc.py`（sha256 `0e394a8141f48396508b5f0d03dafbe84817f23a1194beb8c2bf5530377969c8`）

- **检测/修复/证据**：`verl-hdfs-command-injection` / `inkblade/modules/verl-hdfs-command-injection/template.json`；realpath 后做前缀白名单；禁止 .. 与符号链接；写入面按租户隔离并只读挂载；`projects/repro-2026-10/verl-hdfs-command-injection/RESULT.md`

#### L2-032 · `verl-prime-code-exec` · verl

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| verl | 76e837e | 训练: prime_code reward | `verl/utils/reward_score/prime_code/testing_util.py:616`；verl prime_code executes model-generated code with exec() and no sandbox | generated code | 需本地（需训练 rollout） | 训练进程 |

**根因片段**

```text
verl/utils/reward_score/prime_code/testing_util.py:616
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-verl-prime-code-exec"
SPEC = {'id': 'verl-prime-code-exec', 'kind': 'exec', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

exec -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-verl-prime-code-exec`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/verl-prime-code-exec/poc.py`；上游 pin: `verl/utils/reward_score/prime_code/testing_util.py:616`

**清理**

`python demos/verl-prime-code-exec/poc.py --cleanup`；删除 `demos/.work/verl-prime-code-exec/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/verl-prime-code-exec/poc.py`（sha256 `d9f7a00039a283bc116a7efd1b258ba8f67bee3e3504df0dccecd3fb1662690a`）

- **检测/修复/证据**：`verl-prime-code-exec` / `inkblade/modules/verl-prime-code-exec/template.json`；realpath 后做前缀白名单；禁止 .. 与符号链接；写入面按租户隔离并只读挂载；`projects/repro-2026-10/verl-prime-code-exec/LATEST-RESULT.md`

#### L2-033 · `vllm-jev-plugin-auth-bypass` · vllm-jev

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| vllm-jev | v0.31.0 + vllm-jev 57226d4 | POST /plugins/vllm-jev/choice (8000/tcp) | `vllm_jev/endpoint.py:530`；vLLM --api-key does not guard /plugins/vllm-jev/* (auth bypass) | choice | 无（无（/v1 需 key 对照）） | ClusterIP |

**根因片段**

```text
vllm_jev/endpoint.py:530
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-vllm-jev-plugin-auth-bypass"
SPEC = {'id': 'vllm-jev-plugin-auth-bypass', 'kind': 'http', 'method': 'POST', 'route': '/plugins/vllm-jev/choice', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'vllm-jev-plugin-auth-bypass'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 插件响应 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-vllm-jev-plugin-auth-bypass`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/vllm-jev-plugin-auth-bypass/poc.py`；上游 pin: `vllm_jev/endpoint.py:530`

**清理**

`python demos/vllm-jev-plugin-auth-bypass/poc.py --cleanup`；删除 `demos/.work/vllm-jev-plugin-auth-bypass/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：`demos/vllm-jev-plugin-auth-bypass/poc.py`（sha256 `5662ec3b0759aca43f6dea2174c5cbbc32645837eb8d3fd0bdae781fc296062e`）

- **检测/修复/证据**：`vllm-plugin-auth-bypass` / `inkblade/modules/vllm-plugin-auth-bypass/template.json`；插件路由纳入 API key 守卫；/plugins/* 默认拒绝；`projects/repro-2026-10/P1-vllm-jev-plugin-auth-bypass/LATEST-RESULT.md`

#### L2-034 · `vllm-rl-dev-auth-bypass` · vLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| vLLM | v0.32.0 | POST /v1/chat/completions (8000/tcp) | `vllm/entrypoints/rl/online/api_router.py:31`；vLLM 0.32.0 RL control router is mounted at / and bypasses --api-key | model, messages | 无（无（dev mode）） | ClusterIP |

**根因片段**

```text
vllm/entrypoints/rl/online/api_router.py:31
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-vllm-rl-dev-auth-bypass"
SPEC = {'id': 'vllm-rl-dev-auth-bypass', 'kind': 'http', 'method': 'POST', 'route': '/v1/chat/completions', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'vllm-rl-dev-auth-bypass'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + 推理响应 marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-vllm-rl-dev-auth-bypass`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/vllm-rl-dev-auth-bypass/poc.py`；上游 pin: `vllm/entrypoints/rl/online/api_router.py:31`

**清理**

`python demos/vllm-rl-dev-auth-bypass/poc.py --cleanup`；删除 `demos/.work/vllm-rl-dev-auth-bypass/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：`demos/vllm-rl-dev-auth-bypass/poc.py`（sha256 `cee7adfe4a1cd7dc471bc8e505a3fed2826d9af6e8c875fe992116762ab5758e`）

- **检测/修复/证据**：`vllm-plugin-auth-bypass` / `inkblade/modules/vllm-plugin-auth-bypass/template.json`；插件路由纳入 API key 守卫；/plugins/* 默认拒绝；`lab/zeroday_reserve/cases/vllm-rl-dev-auth-bypass/result.json`

#### L2-035 · `CVE-2024-10220` · Kubernetes

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Kubernetes | kubelet <=1.28.11 / 1.29.0-1.29.6 / 1.30.0-1.30.2 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；gitRepo volume 任意命令执行 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
kubelet gitRepo volume exec needs a Linux kubelet and API server; no cluster on Windows
static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`kubelet-gitrepo-exec-detect` / `inkblade/modules/kubelet-gitrepo-exec-detect/template.json`；PodSecurity restricted；禁用 gitRepo；secrets 准入；`lab/upstream_verify/cases/kubernetes/CVE-2024-10220/result.json`

#### L2-036 · `CVE-2024-3177` · Kubernetes

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Kubernetes | <=1.27.12 / 1.28.0-1.28.8 / 1.29.0-1.29.3 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；envFrom 绕过 mountable secrets 策略 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
envFrom mountable-secret bypass needs a Linux kubelet; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`kubelet-gitrepo-exec-detect` / `inkblade/modules/kubelet-gitrepo-exec-detect/template.json`；PodSecurity restricted；禁用 gitRepo；secrets 准入；`lab/upstream_verify/cases/kubernetes/CVE-2024-3177/result.json`

#### L2-037 · `CVE-2025-3466` · Dify

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Dify | 1.1.0 - 1.1.2 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；代码节点沙箱逃逸（parseInt 覆写） | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
Dify code-node sandbox escape needs the dify-sandbox service/Node runtime; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`dify-code-node-escape` / `inkblade/modules/dify-code-node-escape/template.json`；dify-agent fail-closed；移除默认 JWE；shellctl token；快照租户校验；`lab/upstream_verify/cases/dify/CVE-2025-3466/result.json`

#### L2-038 · `CVE-2025-56520` · Dify

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Dify | 1.6.0 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；RemoteFileUploadApi SSRF needs the Dify API stack; | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
RemoteFileUploadApi SSRF needs the Dify API stack; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`dify-code-node-escape` / `inkblade/modules/dify-code-node-escape/template.json`；dify-agent fail-closed；移除默认 JWE；shellctl token；快照租户校验；`lab/upstream_verify/cases/dify/CVE-2025-56520/result.json`

#### L2-039 · `CVE-2025-63387` · Dify

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Dify | 1.9.1 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；/console/api/system-features 未授权访问 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
System-features unauthenticated endpoint needs the Dify console/API stack; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`dify-code-node-escape` / `inkblade/modules/dify-code-node-escape/template.json`；dify-agent fail-closed；移除默认 JWE；shellctl token；快照租户校验；`lab/upstream_verify/cases/dify/CVE-2025-63387/result.json`

#### L2-040 · `CVE-2025-64496` · Open WebUI

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Open WebUI | <= 0.6.224 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；Direct Connections SSE 代码注入 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
Direct Connections SSE injection needs the Open WebUI frontend/service; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`open-webui-file-overwrite` / `inkblade/modules/open-webui-file-overwrite/template.json`；文件端点鉴权；路径 realpath 校验；批量检索限权；`lab/upstream_verify/cases/open-webui/CVE-2025-64496/result.json`

#### L2-041 · `CVE-2026-28786` · Open WebUI

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Open WebUI | < 0.8.6 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；语音转写文件名路径/错误信息泄露 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
Transcription filename/error leak needs the Open WebUI service; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`open-webui-file-overwrite` / `inkblade/modules/open-webui-file-overwrite/template.json`；文件端点鉴权；路径 realpath 校验；批量检索限权；`lab/upstream_verify/cases/open-webui/CVE-2026-28786/result.json`

#### L2-042 · `CVE-2026-28788` · Open WebUI

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Open WebUI | < 0.8.6 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；批量检索端点任意文件覆盖 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
Batch-retrieval overwrite needs Open WebUI API/DB; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`open-webui-file-overwrite` / `inkblade/modules/open-webui-file-overwrite/template.json`；文件端点鉴权；路径 realpath 校验；批量检索限权；`lab/upstream_verify/cases/open-webui/CVE-2026-28788/result.json`

#### L2-043 · `CVE-2026-32981` · Ray

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Ray | 2.8.0 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；Ray Dashboard 静态文件路径穿越（2.8.0 实机复核：不可复现） | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
Dashboard static-file traversal needs the dashboard service; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — Ray 2.8.0 dashboard reachable (advisory claims < 2.8.1 is affected)

**攻击效果**

N/A（Ray 2.8.0 dashboard reachable (advisory claims < 2.8.1 is affected)）

**复现环境**

static：Ray 2.8.0 dashboard reachable (advisory claims < 2.8.1 is affected)

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — Ray 2.8.0 dashboard reachable (advisory claims < 2.8.1 is affected)

- **检测/修复/证据**：`ray-job-marker-rce` / `inkblade/modules/ray-job-marker-rce/template.json`；dashboard token auth；8265 内网；RBAC 最小化；`lab/upstream_verify/cases/ray/CVE-2026-32981/result.json`

#### L2-044 · `CVE-2026-35029` · LiteLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LiteLLM | < 1.83.0 | 配置面/CLI: `litellm/1.82.0/litellm/proxy/proxy_server.py:11416` | `litellm/1.82.0/litellm/proxy/proxy_server.py:11416`；/config/update 缺失管理员授权 → RCE | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
litellm/1.82.0/litellm/proxy/proxy_server.py:11416
11414:     "/config/update",
11415:     tags=["config.yaml"],
11416:     dependencies=[Depends(user_api_key_auth)],
11417:     include_in_schema=False,
11418: )
11419: async def update_config(config_info: ConfigYAML):  # noqa: PLR0915
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`litellm-config-update-rce` / `inkblade/modules/litellm-config-update-rce/template.json`；管理 API 管理员鉴权；配置更新审计；禁用自定义代码上传；`lab/upstream_verify/cases/litellm/CVE-2026-35029/result.json`

#### L2-045 · `CVE-2026-42208` · LiteLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LiteLLM | 1.81.16 - 1.83.6 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；API key 校验 SQL 注入 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
SQL injection claim not resolved to a concrete unparameterized sink in 1.82.0; advisory-level static triage only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`litellm-config-update-rce` / `inkblade/modules/litellm-config-update-rce/template.json`；管理 API 管理员鉴权；配置更新审计；禁用自定义代码上传；`lab/upstream_verify/cases/litellm/CVE-2026-42208/result.json`

#### L2-046 · `CVE-2026-47102` · LiteLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LiteLLM | < 1.83.10 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；/user/update 自提权至 proxy_admin | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
Self-promotion path requires a DB-backed low-privilege user; not reproduced without Prisma/Postgres
static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`litellm-config-update-rce` / `inkblade/modules/litellm-config-update-rce/template.json`；管理 API 管理员鉴权；配置更新审计；禁用自定义代码上传；`lab/upstream_verify/cases/litellm/CVE-2026-47102/result.json`

#### L2-047 · `CVE-2026-7302` · SGLang

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| SGLang | 0.5.10 | 配置面/CLI: `sglang/v0.5.10/python/sglang/srt/disaggregation/encode_server.py:1251` | `sglang/v0.5.10/python/sglang/srt/disaggregation/encode_server.py:1251`；多模态上传路径穿越任意文件写 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
sglang/v0.5.10/python/sglang/srt/disaggregation/encode_server.py:1251
1249:         self.profiler.stop()
1250:         filename = f"{self.prefix}-rank{self.rank}-{self.profile_id}.trace.json"
1251:         trace_path = os.path.join(self.output_dir, filename)
1252:         self.profiler.export_chrome_trace(trace_path)
1253:         logger.info("Encoder profiling saved to: %s", trace_path)
1254:         self.profiler = None
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`sglang-zmq-pickle-rce` / `inkblade/modules/sglang-zmq-pickle-rce/template.json`；ZMQ 改安全序列化 + mTLS；解码端类型白名单；`lab/upstream_verify/cases/sglang/CVE-2026-7302/result.json`

#### L2-048 · `llamafactory-app-py-bind-all-interfaces-l130-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/api/app.py:130` | `src/llamafactory/api/app.py:130`；服务默认绑定 0.0.0.0，管理面暴露到 Pod 网络 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/api/app.py:130
128:     chat_model = ChatModel()
129:     app = create_app(chat_model)
130:     api_host = os.getenv("API_HOST", "0.0.0.0")
131:     api_port = int(os.getenv("API_PORT", "8000"))
132:     print(f"Visit [链接已省略] for API document.")
133:     uvicorn.run(app, host=api_host, port=api_port)
```

**攻击代码**

N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**攻击效果**

N/A（纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。）

**复现环境**

exposure：纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

- **检测/修复/证据**：`exposure-mapping` / `inkblade/modules/exposure-mapping/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-app-py-bind-all-interfaces-l130-regex/result.json`

#### L2-049 · `llamafactory-app-py-go-bind-all-l130-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/api/app.py:130` | `src/llamafactory/api/app.py:130`；服务默认监听 0.0.0.0，未限制管理面来源 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/api/app.py:130
128:     chat_model = ChatModel()
129:     app = create_app(chat_model)
130:     api_host = os.getenv("API_HOST", "0.0.0.0")
131:     api_port = int(os.getenv("API_PORT", "8000"))
132:     print(f"Visit [链接已省略] for API document.")
133:     uvicorn.run(app, host=api_host, port=api_port)
```

**攻击代码**

N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**攻击效果**

N/A（纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。）

**复现环境**

exposure：纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

- **检测/修复/证据**：`exposure-mapping` / `inkblade/modules/exposure-mapping/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-app-py-go-bind-all-l130-regex/result.json`

#### L2-050 · `llamafactory-interface-py-bind-all-interfaces-l103-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/webui/interface.py:103` | `src/llamafactory/webui/interface.py:103`；服务默认绑定 0.0.0.0，管理面暴露到 Pod 网络 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/webui/interface.py:103
92:     gradio_ipv6 = is_env_enabled("GRADIO_IPV6")
93:     gradio_share = is_env_enabled("GRADIO_SHARE")
94:     server_name = os.getenv("GRADIO_SERVER_NAME", "[::]" if gradio_ipv6 else "0.0.0.0")
95:     print("Visit [链接已省略] for Web UI, e.g., [链接已省略]
96:     fix_proxy(ipv6_enabled=gradio_ipv6)
97:     create_ui().queue().launch(share=gradio_share, server_name=server_name, inbrowser=True)
```

**攻击代码**

N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**攻击效果**

N/A（纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。）

**复现环境**

exposure：纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

- **检测/修复/证据**：`exposure-mapping` / `inkblade/modules/exposure-mapping/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-interface-py-bind-all-interfaces-l103-regex/result.json`

#### L2-051 · `llamafactory-interface-py-bind-all-interfaces-l94-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/webui/interface.py:94` | `src/llamafactory/webui/interface.py:94`；服务默认绑定 0.0.0.0，管理面暴露到 Pod 网络 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/webui/interface.py:94
92:     gradio_ipv6 = is_env_enabled("GRADIO_IPV6")
93:     gradio_share = is_env_enabled("GRADIO_SHARE")
94:     server_name = os.getenv("GRADIO_SERVER_NAME", "[::]" if gradio_ipv6 else "0.0.0.0")
95:     print("Visit [链接已省略] for Web UI, e.g., [链接已省略]
96:     fix_proxy(ipv6_enabled=gradio_ipv6)
97:     create_ui().queue().launch(share=gradio_share, server_name=server_name, inbrowser=True)
```

**攻击代码**

N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**攻击效果**

N/A（纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。）

**复现环境**

exposure：纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

- **检测/修复/证据**：`exposure-mapping` / `inkblade/modules/exposure-mapping/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-interface-py-bind-all-interfaces-l94-regex/result.json`

#### L2-052 · `llamafactory-interface-py-go-bind-all-l103-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/webui/interface.py:103` | `src/llamafactory/webui/interface.py:103`；服务默认监听 0.0.0.0，未限制管理面来源 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/webui/interface.py:103
92:     gradio_ipv6 = is_env_enabled("GRADIO_IPV6")
93:     gradio_share = is_env_enabled("GRADIO_SHARE")
94:     server_name = os.getenv("GRADIO_SERVER_NAME", "[::]" if gradio_ipv6 else "0.0.0.0")
95:     print("Visit [链接已省略] for Web UI, e.g., [链接已省略]
96:     fix_proxy(ipv6_enabled=gradio_ipv6)
97:     create_ui().queue().launch(share=gradio_share, server_name=server_name, inbrowser=True)
```

**攻击代码**

N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**攻击效果**

N/A（纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。）

**复现环境**

exposure：纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

- **检测/修复/证据**：`exposure-mapping` / `inkblade/modules/exposure-mapping/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-interface-py-go-bind-all-l103-regex/result.json`

#### L2-053 · `llamafactory-interface-py-go-bind-all-l94-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/webui/interface.py:94` | `src/llamafactory/webui/interface.py:94`；服务默认监听 0.0.0.0，未限制管理面来源 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/webui/interface.py:94
92:     gradio_ipv6 = is_env_enabled("GRADIO_IPV6")
93:     gradio_share = is_env_enabled("GRADIO_SHARE")
94:     server_name = os.getenv("GRADIO_SERVER_NAME", "[::]" if gradio_ipv6 else "0.0.0.0")
95:     print("Visit [链接已省略] for Web UI, e.g., [链接已省略]
96:     fix_proxy(ipv6_enabled=gradio_ipv6)
97:     create_ui().queue().launch(share=gradio_share, server_name=server_name, inbrowser=True)
```

**攻击代码**

N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**攻击效果**

N/A（纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。）

**复现环境**

exposure：纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — 纯配置暴露面（0.0.0.0 绑定）；按安全边界不在本机监听非回环地址，静态证据见 registry 与 lab/upstream_verify fixture。

- **检测/修复/证据**：`exposure-mapping` / `inkblade/modules/exposure-mapping/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-interface-py-go-bind-all-l94-regex/result.json`

#### L2-054 · `trl-data-utils-py-apply-chat-template-dynamic-l167-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:167` | `trl/data_utils.py:167`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:167
165:
166:
167: def apply_chat_template(
168:     example: dict[str, list[dict[str, str]]],
169:     processing_class: PreTrainedTokenizerBase ¦ ProcessorMixin,
170:     tools: list[dict ¦ Callable] ¦ None = None,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l167-regex/result.json`

#### L2-055 · `trl-data-utils-py-apply-chat-template-dynamic-l194-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:194` | `trl/data_utils.py:194`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:194
192:     # Apply the chat template to the whole conversation
193:     if "messages" in example:
194:         messages = processing_class.apply_chat_template(
195:             example["messages"],
196:             tools=tools,
197:             tokenize=False,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l194-regex/result.json`

#### L2-056 · `trl-data-utils-py-apply-chat-template-dynamic-l213-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:213` | `trl/data_utils.py:213`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:213
211:         else:
212:             raise ValueError(f"Invalid role in the last message: {last_role}")
213:         prompt = processing_class.apply_chat_template(
214:             example["prompt"],
215:             tools=tools,
216:             continue_final_message=continue_final_message,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l213-regex/result.json`

#### L2-057 · `trl-data-utils-py-apply-chat-template-dynamic-l226-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:226` | `trl/data_utils.py:226`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:226
224:     if "prompt" in example:  # explicit prompt and prompt-completion case
225:         if "chosen" in example:
226:             prompt_chosen = processing_class.apply_chat_template(
227:                 example["prompt"] + example["chosen"],
228:                 tools=tools,
229:                 tokenize=False,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l226-regex/result.json`

#### L2-058 · `trl-data-utils-py-apply-chat-template-dynamic-l238-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:238` | `trl/data_utils.py:238`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:238
236:             prompt = "".join(x for x, _ in takewhile(lambda x: x[0] == x[1], zip(prompt, prompt_chosen, strict=False)))
237:         if "rejected" in example and "prompt" in example:  # explicit prompt
238:             prompt_rejected = processing_class.apply_chat_template(
239:                 example["prompt"] + example["rejected"],
240:                 tools=tools,
241:                 tokenize=False,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l238-regex/result.json`

#### L2-059 · `trl-data-utils-py-apply-chat-template-dynamic-l250-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:250` | `trl/data_utils.py:250`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:250
248:             )
249:         if "completion" in example:
250:             prompt_completion = processing_class.apply_chat_template(
251:                 example["prompt"] + example["completion"],
252:                 tools=tools,
253:                 tokenize=False,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l250-regex/result.json`

#### L2-060 · `trl-data-utils-py-apply-chat-template-dynamic-l269-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:269` | `trl/data_utils.py:269`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:269
267:     else:  # implicit prompt case
268:         if "chosen" in example:
269:             chosen = processing_class.apply_chat_template(
270:                 example["chosen"],
271:                 tools=tools,
272:                 tokenize=False,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l269-regex/result.json`

#### L2-061 · `trl-data-utils-py-apply-chat-template-dynamic-l277-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:277` | `trl/data_utils.py:277`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:277
275:             )
276:         if "rejected" in example:
277:             rejected = processing_class.apply_chat_template(
278:                 example["rejected"],
279:                 tools=tools,
280:                 tokenize=False,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l277-regex/result.json`

#### L2-062 · `trl-data-utils-py-apply-chat-template-dynamic-l303-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:303` | `trl/data_utils.py:303`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:303
301:
302:
303: def maybe_apply_chat_template(
304:     example: dict[str, list[dict[str, str]]],
305:     processing_class: PreTrainedTokenizerBase ¦ ProcessorMixin,
306:     tools: list[dict ¦ Callable] ¦ None = None,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l303-regex/result.json`

#### L2-063 · `trl-data-utils-py-apply-chat-template-dynamic-l357-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:357` | `trl/data_utils.py:357`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:357
355:     ...     "completion": [{"role": "assistant", "content": "It is blue."}],
356:     ... }
357:     >>> apply_chat_template(example, tokenizer)
358:     {'prompt': '<¦user¦>\nWhat color is the sky?<¦end¦>\n<¦assistant¦>\n', 'completion': 'It is blue.<¦end¦>\n'}
359:     '''
360:     """
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l357-regex/result.json`

#### L2-064 · `trl-data-utils-py-apply-chat-template-dynamic-l362-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:362` | `trl/data_utils.py:362`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:362
360:     """
361:     if is_conversational(example):
362:         return apply_chat_template(example, processing_class, tools, **template_kwargs)
363:     else:
364:         return example
365:
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l362-regex/result.json`

#### L2-065 · `trl-data-utils-py-apply-chat-template-dynamic-l395-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:395` | `trl/data_utils.py:395`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:395
393:         if is_vlm:
394:             input = prepare_multimodal_messages(input)
395:         result = processing_class.apply_chat_template(
396:             input, tokenize=True, return_dict=True, **apply_chat_template_kwargs
397:         )
398:     else:  # non-conversational: plain text string
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-apply-chat-template-dynamic-l395-regex/result.json`

#### L2-066 · `trl-sft-py-load-dataset-any-l96-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/scripts/sft.py:96` | `trl/scripts/sft.py:96`；数据集加载接受任意路径或格式，解析器与代码执行相邻 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/scripts/sft.py:96
94:         dataset = get_dataset(dataset_args)
95:     elif not dataset_args.datasets and script_args.dataset_name:
96:         dataset = load_dataset(
97:             script_args.dataset_name, name=script_args.dataset_config, streaming=script_args.dataset_streaming
98:         )
99:     else:
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-sft-py-load-dataset-any-l96-regex/result.json`

#### L2-067 · `trl-sft-trainer-py-apply-chat-template-dynamic-l394-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/trainer/sft_trainer.py:394` | `trl/trainer/sft_trainer.py:394`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/trainer/sft_trainer.py:394
392:             else:
393:                 template_kwargs = processor_kwargs
394:             output = self.processor.apply_chat_template(
395:                 messages,
396:                 chat_template=self.chat_template,
397:                 tokenize=True,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-sft-trainer-py-apply-chat-template-dynamic-l394-regex/result.json`

#### L2-068 · `trl-sft-trainer-py-apply-chat-template-dynamic-l436-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/trainer/sft_trainer.py:436` | `trl/trainer/sft_trainer.py:436`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/trainer/sft_trainer.py:436
434:                 example["prompt"] = prepare_multimodal_messages(example["prompt"], images=example["images"])
435:                 example["completion"] = prepare_multimodal_messages(example["completion"])
436:             examples = [apply_chat_template(example, self.processor) for example in examples]
437:
438:         prompts = [example["prompt"] for example in examples]
439:         completions = [example["completion"] for example in examples]
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-sft-trainer-py-apply-chat-template-dynamic-l436-regex/result.json`

#### L2-069 · `trl-sft-trainer-py-load-dataset-any-l527-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/trainer/sft_trainer.py:527` | `trl/trainer/sft_trainer.py:527`；数据集加载接受任意路径或格式，解析器与代码执行相邻 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/trainer/sft_trainer.py:527
525:     >>> from datasets import load_dataset
526:
527:     >>> dataset = load_dataset("roneneldan/TinyStories", split="train[:1%]")
528:
529:     >>> trainer = SFTTrainer(
530:     ...     model="Qwen/Qwen2.5-0.5B-Instruct",
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-sft-trainer-py-load-dataset-any-l527-regex/result.json`


## 3. 组件与 Operator 层：发牌的人

**层是什么**：KubeRay、LWS、Volcano、Kueue、GPU Operator、DRA、CSI、BMC、DPU 不直接跑训练，但它们发放 GPU、存储与节点权限。Operator 的 ClusterRole 往往比业务 Pod 大一个数量级：能创建 Pod、读 Secret、改 RoleBinding，就等于在每个被管理的 namespace 旁放了一份“安装即得”的集群级权限。

### 3.1 名词与架构前置：芯片与证明链：信任根、IOMMU 与固件

芯片安全在集群内能看到的不是硅片，而是“证明链 + 隔离配置 + 固件/微码姿态”：CPU TEE 报价、GPU CC JWT、PCIe SPDM、IOMMU/SMMU、TPM PCR、固件签名。任何一环只看“存在”不验“内容”，都会变成 false trust。

**类比**：像验护照只看封面有国徽，不验芯片、签名和有效期；假护照也能过。

```text
[ CPU TEE: TDX / SEV-SNP ] ── quote ──> [ verifier: nonce + measurement ]
             │
[ GPU CC ] ── EAT/JWT ──> [ NRAS JWKS + claims: dbgstat/secboot/overall ]
             │
[ PCIe device ] ── SPDM/DOE ──> [ cert chain + measurement ]
             │
[ IOMMU/SMMU ] ── DMA isolation ──> [ device assignment / ATS / ACS ]
             │
[ TPM + Secure Boot ] ── PCR/eventlog ──> [ measured boot baseline ]
             │
[ firmware / microcode ] ── signature ──> [ vendor root + revocation ]
```

**术语速查（15 条）**

| 术语 | 白话解释 |
|---|---|
| TDX | Intel Trust Domain Extensions；把 VM 放进受保护的 TD，证明报价要绑 nonce/measurement。 |
| SEV-SNP | AMD 安全加密虚拟化；report 由 VCEK 签名，验签要走到 ASK/ARK 根。 |
| NVIDIA CC | GPU Confidential Computing；CC-On/DevTools 的差别必须由 claims 证明，不看自报。 |
| attestation | 远程证明：把“我在什么环境运行”变成可验签的 claims；不绑 nonce 就可重放。 |
| NRAS | NVIDIA Remote Attestation Service；提供 GPU EAT/JWT 与 JWKS，是 GPU CC 的信任源。 |
| PCS/KDS | AMD 的证书服务；VCEK/ASK/ARK 链从 KDS 取，缓存不等于实时信任。 |
| SPDM | DMTF 的设备安全协议；证书、测量、会话能力决定 PCIe 设备能否被证明。 |
| IOMMU/SMMU | 把设备 DMA 限制在授权地址空间；iommu=off/pt 或 identity 组会放大 DMA 越权。 |
| TPM / measured boot | 用 PCR 记录引导链；PCR 偏移或 dbx 缺失意味着“看起来正常但引导链已变”。 |
| 固件签名 | 厂商用非对称私钥签固件；HMAC fixture 不能冒充厂商 PKI。 |
| 微码 | CPU 微码 revision 低于厂商基线时，已知硬件缺陷可能未修。 |
| EAT/JWT | 实体证明令牌；验签、过期、issuer/audience 与 claims 策略缺一不可。 |
| nonce | 一次性挑战；不绑 nonce 的证明可被旧 JWT 重放。 |
| dbgstat/secboot | GPU CC claims：调试是否关闭、安全启动是否成立；不看这两项就是 false trust。 |
| CXL IDE | CXL 链路上的完整性与数据加密；CXL 设备才有的面，普通 GPU 集群无此面。 |

**前置知识 × 危害细化**

| 漏洞 | 前置知识（要懂什么） | 危害细化（训练/推理/合规） | 正文 |
|---|---|---|---|
| GPU CC false trust | 懂 NRAS JWT/JWKS、nonce 与 claims | 密钥/模型交给不可信环境、合规失真 | 第 3/7 层逐条 |
| IOMMU 直通 | 懂 DMA、ACS/ATS 与 SMMU | 节点/他租户内存 DMA 越权 | 第 3 层逐条 |
| 固件/引导链替换 | 懂 Secure Boot、TPM PCR、固件签名 | 持久化、供应链伪造、审计失真 | 第 3/7 层逐条 |
| SPDM 降级 | 懂 SPDM 版本/证书/测量 | 设备证明不可信、TEE-IO 失效 | 第 3 层逐条 |


**漏洞类别**

- Operator 集群级 RBAC：KubeRay、LWS、vLLM production-stack 的 ClusterRole 含 pods/secrets/serviceaccounts/roles/rolebindings 的 create/update，拿 operator SA 即可一步提权。
- 驱动与设备插件特权：GPU Operator driver 容器、device plugin、CSI node plugin 以 privileged + hostPath 运行，节点边界被抹平。
- DRA / MIG 策略错配：ResourceClaim 请求的 profile 与设备实际值不一致，已分配设备可在线重配。
- 带外管理面：BMC/Redfish 默认凭据、IPMI cipher 0、DPU 管理服务未鉴权，绕过 K8s RBAC 与审计。
- 调度器与队列：Volcano/Kueue 的 pprof、gang 占位与队列配额缺失，能把集群级 DoS 变成常态。

**代表漏洞**

| # | 组件 / 版本区间 | 根因锚点（file:line 或配置面） | 前置 → 影响 | 模板键 |
|---|---|---|---|---|
| 1 | KubeRay operator（所有受审版本） | `kuberay/ray-operator/config/rbac/role.yaml`：集群级 pods/secrets/serviceaccounts/roles/rolebindings create | operator SA 或进程可触达 → 创建 RoleBinding 到 cluster-admin，接管集群 | `kuberay-operator-escalation` |
| 2 | LWS（所有受审版本） | `kubernetes-sigs/lws/config/rbac/role.yaml`：secrets get/list/update/watch + nodes patch；`pkg/webhooks/pod_webhook.go:84-125` 不关 automount | operator SA 可触达 → 集群级 Secrets 读改横向 | `lws-secrets-lateral` |
| 3 | vLLM production-stack operator（上游正式资产） | `production-stack/operator/config/rbac/role.yaml`：集群级 roles/rolebindings 全 CRUD + serviceaccounts CRUD + secrets get；`enablePD` 另开 hostPID/hostIPC | operator SA/进程可触达 → create RoleBinding(cluster-admin) 一步接管 | `vllm-operator-rbac-escalation` |
| 4 | GPU Operator + driver（所有受审版本） | driver DaemonSet privileged + 宿主 `/run/nvidia`、`/usr/lib64` 等挂载 | GPU 节点上的 driver 容器 → 节点逃逸/驱动面篡改 | `gpu-operator-driver-escape`、`gpu-operator-driver-audit` |
| 5 | DRA / MIG（Kubernetes 1.31+ DRA） | ResourceClaim 的 MIG profile 请求值不等于设备实际值；已分配设备可在线重配 | GPU 共享集群 → MIG 边界降级、邻居实例受影响 | `gpu-dra-mig-policy`、`mig-profile-mismatch` |
| 6 | BMC / Redfish / IPMI（iDRAC/iLO/Supermicro/OpenBMC） | 默认凭据、匿名 Redfish、IPMI cipher 0、IPMI over LAN | 带外网可达 → 节点电源/虚拟介质/固件控制，绕过 K8s | `redfish-default-credentials`、`ipmi-cipher-zero-bypass` |
| 7 | CSI node plugin（CephFS/JuiceFS） | node plugin privileged + 宿主根目录挂载；卷归属只按 PV 名，不校验租户 | 存储节点 → 卷越权/节点逃逸/权重读写 | `csi-node-plugin-escape`、`storage-protocol-csi` |
| 8 | DPU / SmartNIC（BlueField/DOCA） | `redfish`、`grpc-doca` 管理服务默认未鉴权；rshim/SSH 密码认证 | DPU 管理网可达 → 卸载面失陷、策略执行点被改写 | `dpu-smartnic-surface`、`dpu-ipu-offload` |

**检测方法**

Operator 看三样：ClusterRole 的 verbs/resources、webhook 是否关 automount、管理的 Pod 是否带 securityContext。模板 `kuberay-operator-escalation`、`lws-secrets-lateral`、`vllm-operator-rbac-escalation` 读 fixture 里的 role.yaml 与 can-i 矩阵；`operator-cross-namespace-reference` 看跨 namespace 引用。驱动/CSI 用 `gpu-operator-driver-audit`、`csi-node-plugin-escape` 读 DaemonSet 的 privileged、hostPath、capabilities。DRA 用 `gpu-dra-mig-policy` 读 ResourceClaim 策略。BMC 用 `bmc-ipmi-exposure` 做只读 Redfish GET + 单次默认凭据验证；`ipmi-cipher-zero-bypass` 看 cipher suite 0。证据是 role 规则、mount 列表、claim 策略、Redfish 响应与登录结果，不写爆破。

**修复建议**

Operator：ClusterRole 收窄为 namespace Role；去掉 roles/rolebindings/secrets 的集群级写；manager SA 不开 automount；webhook 显式 `automountServiceAccountToken: false`；对 create RoleBinding 到 cluster-admin 加准入告警。驱动/CSI：privileged 改设备白名单，hostPath 只读白名单，seccomp/AppArmor 开启。DRA：profile 以设备实际值为准，已分配设备禁止重配。BMC：改默认凭据、带外网隔离、禁用 cipher 0/IPMI over LAN、固件签名核验。DPU：管理服务 mTLS + 独立管理网。

**边界**

Operator RBAC 结论来自上游 raw 清单（2026-10-23）与 fixture，不是每个客户集群的实际绑定；KubeRay/LWS 的“一步 cluster-admin”需要 operator SA 或进程可触达，前置不成立时只是配置风险。BMC/DPU 只做仿真只读与单次默认凭据验证，没有真实 iDRAC/iLO/BlueField；驱动/CSI 逃逸只到 DaemonSet 姿态，不执行真实逃逸。

**本节引用条目**：`KUBERAY-ADV-2026-01`、`LWS-ADV-2026-01`、`gpuoperator-0500-daemonset-yaml-elevated-pod-spec-l108-regex`、`CVE-2025-23266`、`CVE-2024-0132`、`dradriver-process-go-exec-command-l94-regex`、`cephcsi-httpserver-go-pprof-exposed-l37-regex`、`volcano-scheduler-server-go-pprof-exposed-l162-regex`、`kueue-server-go-pprof-exposed-l30-regex`、`CVE-2013-4786`、`CVE-2017-12542`、`CVE-2020-15257`。根因、代码片段、危害与修复见附录 A 对应行；重点条目另见附录 B/C。

### 3.2 逐条攻击面与演示（9 条）

#### L3-001 · `CVE-2013-4786` · BMC/Redfish

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| BMC/Redfish | IPMI 2.0 规范（全版本） | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；RAKP 密码哈希泄露（可离线爆破） | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
RAKP message 2 返回 HMAC → 离线爆破管理员密码哈希
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:H / 训练:L / 租户:M / 合规:H（带外管理面失陷可绕过 K8s RBAC 与审计，直接影响节点电源、虚拟介质与固件）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`ipmi-cipher-zero-bypass` / `inkblade/modules/ipmi-cipher-zero-bypass/template.json`；禁用 cipher suite 0；IPMI over LAN 关闭；强密码；`lab/upstream_verify/cases/bmc/CVE-2013-4786/result.json`

#### L3-002 · `CVE-2017-12542` · BMC/Redfish

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| BMC/Redfish | iLO 4 < 2.53 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；认证绕过 + 远程代码执行 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
特制请求绕过认证 → BMC 管理/代码执行（电源、虚拟介质、主机控制）
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:H / 训练:L / 租户:M / 合规:H（带外管理面失陷可绕过 K8s RBAC 与审计，直接影响节点电源、虚拟介质与固件）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`redfish-default-credentials` / `inkblade/modules/redfish-default-credentials/template.json`；改默认凭据；匿名 Redfish 关闭；带外网隔离；`lab/upstream_verify/cases/bmc/CVE-2017-12542/result.json`

#### L3-003 · `CVE-2020-15257` · containerd

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| containerd | < 1.3.9 / 1.4.0-1.4.2 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；containerd-shim abstract socket 逃逸 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
连接 shim API → 以 root 执行容器操作/逃逸
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`containerd-shim-escape-detect` / `inkblade/modules/containerd-shim-escape-detect/template.json`；升级 containerd；抽象 socket 权限收敛；`lab/upstream_verify/cases/containerd/CVE-2020-15257/result.json`

#### L3-004 · `CVE-2022-0492` · Linux kernel

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Linux kernel | < 5.16.2（对应稳定分支） | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；cgroup release_agent 逃逸 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
release_agent 写入 → 宿主 root 命令执行
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`runc-escape-detect` / `inkblade/modules/runc-escape-detect/template.json`；内核补丁；cgroup v2；seccomp；`lab/upstream_verify/cases/linux-kernel/CVE-2022-0492/result.json`

#### L3-005 · `CVE-2023-34329` · BMC/Redfish

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| BMC/Redfish | SPx12 12.0-12.3 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；HTTP 头伪造认证绕过 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
伪造 HTTP 头绕过认证 → BMC 管理员能力（电源/虚拟介质）
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:H / 训练:L / 租户:M / 合规:H（带外管理面失陷可绕过 K8s RBAC 与审计，直接影响节点电源、虚拟介质与固件）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`redfish-default-credentials` / `inkblade/modules/redfish-default-credentials/template.json`；改默认凭据；匿名 Redfish 关闭；带外网隔离；`lab/upstream_verify/cases/bmc/CVE-2023-34329/result.json`

#### L3-006 · `CVE-2024-21626` · runc

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| runc | 1.0.0-rc93 - 1.1.11 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；Leaky Vessels 文件描述符泄漏容器逃逸 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
工作目录落在宿主命名空间 + /proc/self/fd 泄漏 → 逃逸
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`runc-escape-detect` / `inkblade/modules/runc-escape-detect/template.json`；升级 runc；禁止未受信镜像；seccomp/AppArmor；`lab/upstream_verify/cases/runc/CVE-2024-21626/result.json`

#### L3-007 · `CVE-2025-31133` · runc

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| runc | <1.2.8 / 1.3.0-rc1-1.3.2 / 1.4.0-rc1-rc2 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；masked path /dev/null 符号链接竞态逃逸 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
symlink/race 替换 /dev/null → 任意宿主文件读写与逃逸
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`runc-escape-detect` / `inkblade/modules/runc-escape-detect/template.json`；升级 runc；禁止未受信镜像；seccomp/AppArmor；`lab/upstream_verify/cases/runc/CVE-2025-31133/result.json`

#### L3-008 · `OPENBMC-BMCWEB-REDfish-HW` · BMC/Redfish

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| BMC/Redfish | master | 配置面/CLI: `n/a (vendor firmware / Linux runtime / hardware fabric)` | `n/a (vendor firmware / Linux runtime / hardware fabric)`；OpenBMC/BTI/Redfish: bmcweb (C++), phosphor daemons and the IPMI BT interface are firmware/hardware paths; | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime / hardware fabric)
OpenBMC/BTI/Redfish: bmcweb (C++)
phosphor daemons and the IPMI BT interface are firmware/hardware paths; explicitly unsupported on this host. Existing BMC-surface conclusions live in the bmc-ipmi-exposure and redfish-default-credentials modules; the thr
审计记录：厂商固件/运行时路径，无逐字上游源码
```

**攻击代码**

N/A — OpenBMC image on BMC hardware (or QEMU OpenBMC target)；BMC SoC / IPMI BT device

**攻击效果**

N/A（OpenBMC image on BMC hardware (or QEMU OpenBMC target)；BMC SoC / IPMI BT device）

**复现环境**

unsupported：OpenBMC image on BMC hardware (or QEMU OpenBMC target)；BMC SoC / IPMI BT device

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:H / 训练:L / 租户:M / 合规:H（带外管理面失陷可绕过 K8s RBAC 与审计，直接影响节点电源、虚拟介质与固件）

- **演示脚本**：N/A — OpenBMC image on BMC hardware (or QEMU OpenBMC target)；BMC SoC / IPMI BT device

- **检测/修复/证据**：`bmc-ipmi-exposure` / `inkblade/modules/bmc-ipmi-exposure/template.json`；改默认凭据；带外网隔离；禁用 cipher 0 与 IPMI over LAN；固件签名与清单核验；`lab/upstream_verify/cases/bmc/OPENBMC-BMCWEB-REDfish-HW/result.json`

#### L3-009 · `cephcsi-cephcsi-go-bind-all-l255-regex` · Ceph CSI

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Ceph CSI | v3.18.1 | 配置面/CLI: `cmd/cephcsi.go:255` | `cmd/cephcsi.go:255`；服务默认监听 0.0.0.0，未限制管理面来源 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
cmd/cephcsi.go:255
253:         if conf.MetricsIP == "" {
254:             klog.Warning("missing POD_IP env var defaulting to 0.0.0.0")
255:             conf.MetricsIP = "0.0.0.0"
256:         }
257:         err = util.ValidateURL(&conf)
258:         if err != nil {
```

**攻击代码**

N/A — cephcsi pod network-reachable on the metrics port

**攻击效果**

N/A（cephcsi pod network-reachable on the metrics port）

**复现环境**

static：cephcsi pod network-reachable on the metrics port

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：N/A — cephcsi pod network-reachable on the metrics port

- **检测/修复/证据**：`csi-node-plugin-escape` / `inkblade/modules/csi-node-plugin-escape/template.json`；node plugin 去 privileged；hostPath 只读白名单；metrics/pprof 鉴权或关闭；`lab/upstream_verify/cases/cephcsi/cephcsi-cephcsi-go-bind-all-l255-regex/result.json`


## 4. 网络与 fabric 层：策略管不到的地方

**层是什么**：Kubernetes NetworkPolicy 只覆盖主 CNI 的 Pod 网络。hostNetwork、SR-IOV、macvlan、RDMA 流量不经过同一个钩子；IB 子网管理器、PFC/ECN、SHARP 会话又是 fabric 自己的控制面，根本不在 K8s API 里。训练集群的“网络”实际有三层：Pod 网络、RDMA 网络、带外与交换机管理网，三层的策略与身份各自独立。

### 4.1 名词与架构前置：网络 fabric：rail、无损与在网聚合

训练集群的网络分三层：Pod 网络、RDMA 网络、带外/交换机管理网。NetworkPolicy 只覆盖第一层；rail 绑定、PFC/ECN、SHARP 会话、IB Partition 是 fabric 自己的控制面，也是租户隔离真正落地的地方。

**类比**：像高速公路按车牌尾号分车道，但匝道口没人查票；一辆车变道就能堵死整条路。

```text
GPU0 ─ NIC0 ─ leaf0 ┐
GPU1 ─ NIC1 ─ leaf1 ┼─> spine ─> spine ─> leafN ─ NICn ─ GPUn
GPU2 ─ NIC2 ─ leaf2 ┘         (fat-tree / multi-plane)
      rail 0..N                │
                               ├─ PFC/ECN: 无损队列，全局配置
                               ├─ SHARP: 交换机内 reduce，会话即信任域
                               └─ IB SM/Partition: RDMA 租户边界

Pod network: CNI + NetworkPolicy
RDMA network: SR-IOV / Multus / IMEX (bypasses NetworkPolicy)
```

**术语速查（15 条）**

| 术语 | 白话解释 |
|---|---|
| rail | GPU 服务器内 GPU↔NIC↔leaf 的固定编号绑定；错轨会把集合通信挤到错误平面。 |
| 多平面 | 用多个并行 fabric 平面分担流量；平面间路由/隔离错配会绕过按轨策略。 |
| fat-tree | 三层 CLOS 拓扑；spine/leaf 的 oversubscription 决定拥塞与故障域。 |
| RoCEv2 | 在以太网上跑 RDMA；依赖 PFC/ECN 做无损，配置是全局的。 |
| PFC | Priority Flow Control；暂停帧可止血也可形成风暴，watchdog 关闭时更危险。 |
| ECN | 显式拥塞通知；与 PFC 配合做无损，缺失时靠丢包回退会拖垮吞吐。 |
| SHARP | 交换机在网聚合；reduce 发生在交换机内，主机策略看不到会话成员与结果。 |
| NCCL ring/tree | NCCL 的两种集合通信算法；ring 省带宽、tree 低时延，bootstrap 不认证。 |
| IB SM | InfiniBand 子网管理器；在 K8s 之外，默认分区 `*` 会把信任域放大到全 fabric。 |
| IB Partition | IB 的租户隔离单位（PKey）；成员不按租户收敛时，RDMA 就是平网。 |
| NetworkPolicy | K8s 的 L3/L4 策略；只覆盖主 CNI，hostNetwork/SR-IOV/RDMA 不经过它。 |
| SR-IOV | 把一张网卡切成多个 VF 直通给 Pod；绕过 kube-proxy 与策略钩子。 |
| Multus | 给 Pod 挂多张网卡；第二张网卡的策略覆盖常被忽略。 |
| IMEX | 多节点 NVLink 显存共享；域成员/通道权限就是跨节点内存边界。 |
| NVLink | GPU 间高带宽互联；NVSwitch/IMEX 把单机信任域扩展到机架。 |

**前置知识 × 危害细化**

| 漏洞 | 前置知识（要懂什么） | 危害细化（训练/推理/合规） | 正文 |
|---|---|---|---|
| rail 错配 | 懂 GPU-NIC-leaf 三元组与 NCCL 环境变量 | 跨轨拥塞、PFC 风暴、straggler | 第 4 层逐条 |
| PFC/ECN 配置可写 | 懂无损以太与全局队列 | fabric 级停摆、训练中断 | 第 4 层逐条 |
| SHARP 会话无鉴权 | 懂在网聚合与 reduce 语义 | all-reduce 静默篡改、训练无效 | 第 4 层逐条 |
| IB Partition 过宽 | 懂 SM/PKey 与 RDMA 信任域 | 跨租户加入、窃听、注入 | 第 4 层逐条 |
| SR-IOV/Multus 旁路 | 懂第二张网卡与策略钩子 | 跨 namespace 直达训练/推理端口 | 第 4 层逐条 |


**概念详解：rail 错配**

- **一句话定义**：rail-optimized 是把每台 GPU 服务器里的每张 GPU 固定绑定到同一编号的网卡与 leaf 交换机（rail 0..N），让 all-reduce 中同一 rank 的流量走同一条轨，避免跨轨拥塞。
- **类比**：高速公路有 N 条车道，每辆车按车牌尾号固定走一条；错配就是把车强行并到别的车道，而且所有车同时变道。单看每辆车都没坏，整条路却堵死。
- **错配原因**：调度器不校验 GPU-NIC-leaf 三元组；拓扑标签写错；`NCCL_IB_HCA` 或 `GID_INDEX` 指错；SR-IOV VF 与 PF 不在同一 rail；异构机型混部；多租户共享 HCA。最常见的是“能跑但跑错轨”，监控只看吞吐，不看 rail 映射。
- **攻击链**：已有 Pod → 读 rail 映射与拓扑标签 → 写 NCCL rail 绑定或选错 HCA → 集合通信跨轨 → PFC 暂停帧增长、步时劣化 → 训练退化；叠加 SHARP/PFC 攻击时，跨轨流量还会放大交换机聚合面的故障域。
- **前置**：能写 rail 配置或控制 NCCL 环境变量；作业与目标同 fabric；没有 per-job rail 校验。只读侦察只需要能看到拓扑标签与 NCCL 配置。
- **危害**：跨 rail 拥塞与 PFC 风暴（可用性）；straggler 使同步 all-reduce 被单 rank 拖垮，goodput 静默下降（训练有效性）；跨轨流不在预期 rail 计数里，绕过按轨隔离与监控（租户隔离/合规）；放大 SHARP/PFC 攻击的影响面。
- **检测**：`rail-mismatch-forcing` 读/试 rail 绑定并观察 `cross_rail_flows`；`fabric-topology-isolation` 出 rail 映射与分区；`roce-pfc-storm` 看 `pfc_pause_frames` 差分；`nccl-straggler-injection` 看步时比。证据是 rail 图、跨轨流计数、PFC 计数与步时基线。
- **边界**：配置判定 + 仿真（`lab/fabric_dos_sim.py`），没有真实 IB/RoCE ASIC，也没有跑真实 NCCL 二进制协议；PFC/ECN 的真实行为必须上交换机核验。


**漏洞类别**

- NetworkPolicy 旁路：hostNetwork、Multus/SR-IOV、macvlan 与 RDMA 直通流量不经过策略钩子。
- CNI 双控制面：托管云的 VPC 路由/安全组与集群 NetworkPolicy 是两套系统，权限模型和漂移方向不同。
- IB SM / Partition：SM 是 K8s 之外的信任域，默认分区 `*` 或单 SM 无冗余会把 RDMA 信任域放大到全 fabric。
- RoCE PFC / ECN：无损配置是全局的，一个坏队列能拖住整片 fabric；PFC watchdog 关闭时没有自动恢复。
- SHARP 在网聚合：会话加入不鉴权，reduce 发生在交换机内，主机策略看不到成员与结果。
- NCCL bootstrap / straggler：bootstrap 端口无认证，慢 rank 能把同步 all-reduce 拖成 2× 以上步时。
- DNS：服务发现是攻击者最想先拿到的图，CoreDNS/Service 清单暴露训练/推理拓扑。

**代表漏洞**

| # | 组件 / 版本区间 | 根因锚点（file:line 或配置面） | 前置 → 影响 | 模板键 |
|---|---|---|---|---|
| 1 | Multus + SR-IOV + RDMA（所有受审版本） | 策略钩子只覆盖主 CNI；SR-IOV VF/macvlan/RDMA 流量绕过 kube-proxy 与 NetworkPolicy | 已有 Pod + 第二张网卡 → 跨 namespace 直达训练/推理端口 | `multus-sriov-rdma-bypass`、`network-policy-coverage` |
| 2 | VPC-native CNI（EKS VPC-CNI / ACK Terway / TKE VPC-CNI） | VPC 路由/安全组与 K8s NetworkPolicy 双控制面；SG 规则不随 namespace 自动收敛 | 云上集群 → 安全组漂移导致跨租户可达 | `cni-stack-capability`、`cni-aware-reachability-graph` |
| 3 | IB SM / Partition（UFM/OpenSM） | SM 跑在计算节点或单实例；默认分区 `*` 覆盖全部 HCA；PKey 成员不按租户收敛 | IB 管理面可达 → 重定义 RDMA 信任域、跨租户加入 | `ib-sm-partition-audit`、`ib-subnet-manager-hijack` |
| 4 | RoCE PFC / ECN（Spectrum-X / 自研白盒） | PFC watchdog 关闭、ECN 未启用、管理 ACL 放行任意来源；无损队列无租户配额 | 交换机配置面可达 → PFC 暂停风暴、fabric 级停摆 | `roce-pfc-storm`、`fabric-observability-exposure` |
| 5 | SHARP 在网聚合（Quantum-X800 / NVLink SHARP） | 会话加入无鉴权；聚合节点跨租户共享；reduce 结果不在主机审计里 | 交换机/SHARP 会话面可达 → 静默篡改 all-reduce 结果 | `sharp-in-network-poison`、`sharp-session-trust-audit` |
| 6 | NCCL bootstrap / rank（NCCL 2.x） | bootstrap 端口无认证；rank 时序被信任；端口池无配额 | 同网可达 → 加入集合通信、注入梯度、耗尽端口 | `nccl-collective-join`、`nccl-straggler-injection`、`nccl-port-exhaustion` |
| 7 | DNS / Service discovery（CoreDNS） | Service/Endpoint 清单可读；训练作业用可预测的 headless Service 名 | 已有 Pod → 拓扑测绘、定位 Ray/vLLM/SGLang 控制面 | `dns-service-discovery` |

**检测方法**

先做接口清单：`network-policy-coverage` 与 `multus-sriov-rdma-bypass` 读 Pod 的 hostNetwork、Multus annotation、SR-IOV VF、RDMA 设备；`cni-stack-capability` 读 CNI 类型与策略能力；`cni-aware-reachability-graph` 把可达路径画出来。IB 用 `ib-sm-partition-audit` 读 SM/Partition 导出，`ib-subnet-manager-hijack` 只做只读成员证明。fabric 用 `roce-pfc-storm` 看 `pfc_pause_frames` 差分，`sharp-in-network-poison` 看 reduce 前后差分与 `tampered_reduces`，`nccl-straggler-injection` 看步时比，`nccl-port-exhaustion` 看端口池剩余。DNS 用 `dns-service-discovery` 出区域/端点图。证据是接口清单、可达性证明、计数器差分、会话成员与步时基线。

**修复建议**

策略面：default-deny 基线 + 对 hostNetwork/SR-IOV/macvlan 单独建策略；RDMA 用 IB Partition/PKey 做租户隔离，不能只靠 NetworkPolicy。CNI：VPC 安全组与 K8s 策略双向核对，改动走 GitOps 与漂移检测。IB：SM 冗余、默认分区最小化、PKey 按租户、SM 不跑在计算节点。RoCE：PFC watchdog 开、ECN 开、管理 ACL 限源、每租户队列配额。SHARP：会话 mTLS + 作业令牌、聚合节点独立、缓冲隔离。NCCL：bootstrap 令牌/端口配额、rank 健康检查、超时与 straggler 告警。DNS：只暴露必要 Service，限制 Endpoint 读权限。

**边界**

没有真实 IB/RoCE 交换机、没有跑真实 SHARP reduce 或 NCCL 二进制握手；fabric 结论来自 `lab/fabric_dos_sim.py` 的 HTTP 语义同构与配置导出。NetworkPolicy 旁路是接口/路径判定，不是每个 CNI 的实测；VPC-CNI 双控制面只在仿真与静态清单上成立。PFC/ECN 的真实行为必须上交换机核验，不能用仿真计数器替代。

**本节引用条目**：`CVE-2025-33180`、`CVE-2026-24184`、`GHSA-h26v-922j-28cg`、`sonicrestapi-default-go-exec-command-l1881-regex`、`NCCL-NCCLPLUGIN-HW`、`ucxpy-server-py-pickle-loads-l42-regex`、`CVE-2025-47277`、`CVE-2026-92972`。根因、代码片段、危害与修复见附录 A 对应行；重点条目另见附录 B/C。

### 4.2 逐条攻击面与演示（4 条）

#### L4-001 · `CVE-2025-33180` · Cumulus/NVUE

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Cumulus/NVUE | <5.14（GA）/ <5.11.4（LTS）/ <5.9.4（LTS） | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；NVUE 低权限命令注入 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
NVUE 命令注入 → 提权/交换机配置篡改
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`cumulus-nvue-injection` / `inkblade/modules/cumulus-nvue-injection/template.json`；交换机管理面限源；NVUE/LLDP 补丁升级；配置变更双人复核；`lab/upstream_verify/cases/cumulus/CVE-2025-33180/result.json`

#### L4-002 · `CVE-2025-38741` · SONiC

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| SONiC | 4.5.0 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；SSH 硬编码密钥 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
硬编码 SSH 密钥 → 未授权通信/管理面访问
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`sonic-config-plane-write` / `inkblade/modules/sonic-config-plane-write/template.json`；交换机管理面限源；禁用 SNMP v1/v2c public；PFC/ECN/ACL 基线；`lab/upstream_verify/cases/sonic/CVE-2025-38741/result.json`

#### L4-003 · `CVE-2026-24184` · Cumulus/NVUE

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Cumulus/NVUE | <5.16（GA）/ <5.11.5 / <5.9.5 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；LLDP 守护进程缓冲区溢出 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
LLDP 缓冲区溢出 → 交换机代码执行
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`cumulus-nvue-injection` / `inkblade/modules/cumulus-nvue-injection/template.json`；交换机管理面限源；NVUE/LLDP 补丁升级；配置变更双人复核；`lab/upstream_verify/cases/cumulus/CVE-2026-24184/result.json`

#### L4-004 · `sonicrestapi-default-go-exec-command-l1881-regex` · SONiC REST API

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| SONiC REST API | a45b9bc | 配置面/CLI: `go-server-server/go/default.go:1881` | `go-server-server/go/default.go:1881`；以请求可控参数拼接 exec.Command，缺少参数化与白名单 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
go-server-server/go/default.go:1881
1879:     args = append(args, "-I", vnet_id_match)
1880:     }
1881:     out, err = exec.Command(PING_COMMAND_STR, args...).Output()
1882:     if err != nil {
1883:         log.Printf("Exec command Error is "+ err.Error())
1884:     }
```

**攻击代码**

N/A — REST access to the SONiC switch REST server (TLS + client-cert CN allowlist)

**攻击效果**

N/A（REST access to the SONiC switch REST server (TLS + client-cert CN allowlist)）

**复现环境**

static：REST access to the SONiC switch REST server (TLS + client-cert CN allowlist)

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — REST access to the SONiC switch REST server (TLS + client-cert CN allowlist)

- **检测/修复/证据**：`switch-os-config-surface` / `inkblade/modules/switch-os-config-surface/template.json`；REST API 鉴权 + 参数化；管理网隔离；`lab/upstream_verify/cases/sonicrestapi/sonicrestapi-default-go-exec-command-l1881-regex/result.json`


## 5. 数据与权重层：训练状态的信任链

**层是什么**：训练状态同时具备三个特点：体量大、可写、加载时被信任。checkpoint、optimizer shard、数据集缓存、HF 缓存、权重桶、模型注册表都是如此。只要写者能让受害者在下一次恢复时加载被污染的分片，数据面问题就变成代码执行或静默训练损坏；只要读者能跨租户读到缓存或权重，“训练数据”就成了“模型窃取”。

**漏洞类别**

- checkpoint / optimizer 分片投毒：分片写面常由 sidecar/对象存储网关暴露，加载时不做哈希/签名校验。
- 数据集管道：webdataset/Arrow/pickle 解析与代码执行相邻，共享缓存目录可被跨租户写。
- HF 缓存：一个租户写、另一个租户读；`pinned` 块可绕过逐出，形成持久化投毒。
- 权重存储：路径穿越、云端桶 ACL、对象列举把权重面暴露给相邻租户。
- 模型注册表 / 实验追踪：MLflow、W&B、模型清单匿名可读，提供私有模型与后端地址。
- KV / 前缀缓存：推理状态是数据，缓存键不带 tenant/salt 时跨租户复用。

**代表漏洞**

| # | 组件 / 版本区间 | 根因锚点（file:line 或配置面） | 前置 → 影响 | 模板键 |
|---|---|---|---|---|
| 1 | Checkpoint 分片（Megatron/DeepSpeed/LLaMA-Factory/slime） | `torch.load(weights_only=False)` 或 `recv_pyobj`；分片哈希不校验；写面由共享 PVC/对象存储暴露 | 可写 checkpoint 目录 → 恢复时 pickle 执行或静默训练损坏 | `checkpoint-shard-poison`、`megatron-checkpoint-rce`、`deepspeed-checkpoint-rce` |
| 2 | Optimizer state（ZeRO/FSDP） | optimizer shard 无签名；`latest` 文件指向攻击者可写分片；加载顺序信任本地文件 | 可写训练状态目录 → 收敛偏移、loss 正常但权重被改 | `checkpoint-optimizer-state-poison` |
| 3 | 数据集管道（ms-swift/TRL/LLaMA-Factory） | `IndexedDataset` 用 `pickle.load` 读 `data.idx`；packing cache 在共享目录；`load_dataset` 接受任意路径 | 可写数据集缓存 → 加载时执行代码/污染样本 | `msswift-dataset-pickle-rce`、`data-pipeline-poison` |
| 4 | HF 缓存（共享 PVC / RWX 卷） | 缓存目录跨租户可写；`pinned` 块在逐出压力下仍保留；模型加载信任本地缓存 | 一个租户写、另一个租户读 → 持久化投毒/权重替换 | `cache-poison-persistence`、`shared-volume-weight-copy` |
| 5 | 权重存储（S3/OSS/COS/Blob 桶） | 桶策略 Principal `*`、对象 ACL 跨账户、`skyrl /fetch_weights` 路径穿越 | 桶可达或路径可控 → 权重直下/穿越写 | `skyrl-fetch-weights-traversal`、`cloud-bucket-cross-tenant` |
| 6 | 模型注册表 / 实验追踪（MLflow/W&B） | `/models`、`/ai/route`、MLflow artifact 匿名；trace ID 路径穿越 | 注册表可达 → 私有模型清单、后端地址、artifact 读写 | `model-registry-exposure`、`mlflow-trace-write` |
| 7 | KV / 前缀缓存（vLLM APC / SGLang Radix） | 缓存键只取 token 哈希，`cache_salt` 可选；逐出只释放索引不清零 | 同实例多租户 → 跨租户前缀复用、残留读回 | `prefix-cache-cross-tenant-leak`、`cache-eviction-residue` |

**检测方法**

先确认写面：checkpoint/数据集/缓存目录的挂载范围、属主、是否 RWX；再看加载点：`torch.load`、`pickle.load`、`recv_pyobj`、`load_dataset`。模板 `checkpoint-shard-poison` 做写后读回 sha256 + 备份回滚精确复原；`checkpoint-optimizer-state-poison` 读分片差异；`msswift-dataset-pickle-rce` 读 `data.idx` 加载路径；`cache-poison-persistence` 写 benign 块 + 洪泛 + 独立读回；`skyrl-fetch-weights-traversal` 看 `cache_dir / payload_file` 未净化；`model-registry-exposure` 读 `/models`、`/ai/route`。证据是写入路径、读回 sha256、对象 ACL、注册表响应与 loader 轨迹。

**修复建议**

按租户隔离 PVC/前缀，权重与 checkpoint 只读挂载；写入面加哈希/签名校验与审计；`torch.load` 固定 `weights_only=True`，禁用 pickle 数据集；HF 缓存按租户前缀 + 只读副本；权重桶关闭 public access、Principal 收敛到角色、禁止跨账户 ListBucket；模型注册表加鉴权与签名链；KV 缓存键加 tenant + `cache_salt`，逐出即 zeroize。

**边界**

写类验证只在 `backup-write` + 备份回执下执行，benign marker 不含真实权重；checkpoint/数据集结论多来自 fixture 与函数级复现，不是客户真实训练状态；云端桶结论是契约级仿真，没有真实 IAM 求值；KV 缓存是 HTTP 语义同构，不覆盖真实 GPU 显存逐出。

**本节引用条目**：`CVE-2024-0520`、`CVE-2024-37061`、`CVE-2026-53995`、`CVE-2025-32434`、`llamafactory-checkpoint-py-torch-load-unsafe-l136-ast`、`msswift-indexed-dataset-py-pickle-loads-l112-ast`、`deepspeed-stage3-py-torch-load-any-l3660-regex`、`CVE-2026-4993`、`cephcsi-httpserver-go-pprof-exposed-l37-regex`、`CVE-2025-32444`。根因、代码片段、危害与修复见附录 A 对应行；重点条目另见附录 B/C。

### 5.1 逐条攻击面与演示（59 条）

#### L5-001 · `CVE-2024-0520` · MLflow

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| MLflow | 2.8.1 | HTTP POST /ajax-api/2.0/mlflow/registered-models/create (5000/tcp) | `mlflow/2.8.1/mlflow/data/http_dataset_source.py:68`；HTTP dataset 路径穿越/命令注入 RCE | source | 无（无/需 token） | ClusterIP |

**根因片段**

```text
mlflow/2.8.1/mlflow/data/http_dataset_source.py:68
66:             dst_path = tempfile.mkdtemp()
67:
68:         dst_path = os.path.join(dst_path, basename)
69:         with open(dst_path, "wb") as f:
70:             chunk_size = 1024 * 1024  # 1 MB
71:             for chunk in resp.iter_content(chunk_size=chunk_size):
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2024-0520"
SPEC = {'id': 'CVE-2024-0520', 'kind': 'path', 'payload': '../victim.txt'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

路径穿越 + marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2024-0520`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2024-0520/poc.py`；上游 pin: `mlflow/2.8.1/mlflow/data/http_dataset_source.py:68`

**清理**

`python demos/CVE-2024-0520/poc.py --cleanup`；删除 `demos/.work/CVE-2024-0520/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2024-0520/poc.py`（sha256 `aad323864515ad951c54c76b1c812691e74430b10456dff7345bfa6938496fe2`）

- **检测/修复/证据**：`mlflow-model-rce` / `inkblade/modules/mlflow-model-rce/template.json`；artifact 路径校验；tracking server 鉴权；MLproject 签名；`lab/upstream_verify/cases/mlflow/CVE-2024-0520/result.json`

#### L5-002 · `CVE-2024-43497` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | 0.15.0 | CLI: deepspeed/0.15.0/op_builder/async_io.py:85 | `deepspeed/0.15.0/op_builder/async_io.py:85`；检查点/配置命令注入 RCE | PATH/HOME | 需本地（需本地调用） | 宿主/训练进程 |

**根因片段**

```text
deepspeed/0.15.0/op_builder/async_io.py:85
83:             if path is not None:
84:                 cmd = f"{pkgmgr} {flag} {lib}"
85:                 result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
86:                 if result.wait() == 0:
87:                     found = True
88:                 else:
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2024-43497"
SPEC = {'id': 'CVE-2024-43497', 'kind': 'command', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

subprocess shell=True -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2024-43497`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2024-43497/poc.py`；上游 pin: `deepspeed/0.15.0/op_builder/async_io.py:85`

**清理**

`python demos/CVE-2024-43497/poc.py --cleanup`；删除 `demos/.work/CVE-2024-43497/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2024-43497/poc.py`（sha256 `159e00af1be7d042871a1fa93a254704e0ae3b8a655cb59794aaaf3340f04d8b`）

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；stage3 torch.load 固定 weights_only=True；AutoEP 输入校验；`lab/upstream_verify/cases/deepspeed/CVE-2024-43497/result.json`

#### L5-003 · `CVE-2025-32434` · PyTorch

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| PyTorch | 2.5.1+cpu | 文件: torch/serialization.py:1328 | `pytorch/2.5.1/torch/serialization.py:1328`；torch.load weights_only 绕过 RCE | weights_only=False, checkpoint | 需本地（需本地模型文件） | 宿主/本地进程 |

**根因片段**

```text
pytorch/2.5.1/torch/serialization.py:1328
1327:                 if _is_torchscript_zip(opened_zipfile):
1328:                     warnings.warn(
1329:                         "'torch.load' received a zip file that looks like a TorchScript archive"
1330:                         " dispatching to 'torch.jit.load' (call 'torch.jit.load' directly to"
1331:                         " silence this warning)",
1332:                         UserWarning,
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2025-32434"
SPEC = {'id': 'CVE-2025-32434', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2025-32434`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2025-32434/poc.py`；上游 pin: `pytorch/2.5.1/torch/serialization.py:1328`

**清理**

`python demos/CVE-2025-32434/poc.py --cleanup`；删除 `demos/.work/CVE-2025-32434/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2025-32434/poc.py`（sha256 `8a354a802cf54034669dcf604df193d738900ef47cb87896c3ab94764bd6ba85`）

- **检测/修复/证据**：`torch-weights-bypass-rce` / `inkblade/modules/torch-weights-bypass-rce/template.json`；torch.load weights_only=True；模型签名；`lab/upstream_verify/cases/pytorch/CVE-2025-32434/result.json`

#### L5-004 · `CVE-2026-65110` · Megatron-LM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Megatron-LM | 0.17.0 | 文件: checkpointing.py:1341 | `megatron/0.17.0/megatron/training/checkpointing.py:1341`；检查点加载 RCE | checkpoint path | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
megatron/0.17.0/megatron/training/checkpointing.py:1341
1339:             checkpoint_name = get_checkpoint_name(load_dir, iteration, release, return_base_dir=False)
1340:         try:
1341:             state_dict = torch.load(checkpoint_name, map_location='cpu')
1342:         except ModuleNotFoundError:
1343:             from megatron.legacy.fp16_deprecated import loss_scaler
1344:
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-CVE-2026-65110"
SPEC = {'id': 'CVE-2026-65110', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-CVE-2026-65110`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/CVE-2026-65110/poc.py`；上游 pin: `megatron/0.17.0/megatron/training/checkpointing.py:1341`

**清理**

`python demos/CVE-2026-65110/poc.py --cleanup`；删除 `demos/.work/CVE-2026-65110/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/CVE-2026-65110/poc.py`（sha256 `c5919998f584f4346db3771d9f2d529b814948b36015cbac372b7cbab716f249`）

- **检测/修复/证据**：`megatron-checkpoint-rce` / `inkblade/modules/megatron-checkpoint-rce/template.json`；checkpoint 固定 weights_only=True；分片签名/哈希；`lab/upstream_verify/cases/megatron/CVE-2026-65110/result.json`

#### L5-005 · `deepspeed-stage3-py-torch-load-any-l3660-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 文件: DeepSpeed checkpoint/stage3.py | `deepspeed/runtime/zero/stage3.py:3660`；加载 checkpoint 时调用 torch.load 且未固定 weights_only，checkpoint 写者可在恢复时执行 pickle | checkpoint dir, torch.load payload | 需本地（需本地文件写） | 宿主/PVC |

**根因片段**

```text
deepspeed/runtime/zero/stage3.py:3660
3658:             optim_state_path), f'{optim_state_path} containing optimizer global state is missing! Cannot proceed.'
3659:
3660:         optim_sd = torch.load(optim_state_path, weights_only=False)
3661:         self._load_global_state_stage3(optim_sd)
3662:
3663:         # Generally the step of each optimizer file should be the same, we can obtain from any parameter.
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-deepspeed-stage3-py-torch-load-any-l3660-regex"
SPEC = {'id': 'deepspeed-stage3-py-torch-load-any-l3660-regex', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-deepspeed-stage3-py-torch-load-any-l3660-regex`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/deepspeed-stage3-py-torch-load-any-l3660-regex/poc.py`；上游 pin: `deepspeed/runtime/zero/stage3.py:3660`

**清理**

`python demos/deepspeed-stage3-py-torch-load-any-l3660-regex/poc.py --cleanup`；删除 `demos/.work/deepspeed-stage3-py-torch-load-any-l3660-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/deepspeed-stage3-py-torch-load-any-l3660-regex/poc.py`（sha256 `6e989087d9a49f6bba1cb49778c44c396f21f2801a52b0898972e4e66ec76963`）

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；stage3 torch.load 固定 weights_only=True；AutoEP 输入校验；`lab/upstream_verify/cases/deepspeed/deepspeed-stage3-py-torch-load-any-l3660-regex/result.json`

#### L5-006 · `deepspeed-stage3-py-torch-load-any-l3770-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 文件: DeepSpeed checkpoint/stage3.py | `deepspeed/runtime/zero/stage3.py:3770`；加载 checkpoint 时调用 torch.load 且未固定 weights_only，checkpoint 写者可在恢复时执行 pickle | checkpoint dir, torch.load payload | 需本地（需本地文件写） | 宿主/PVC |

**根因片段**

```text
deepspeed/runtime/zero/stage3.py:3770
3768:
3769:         # Load tensors from files and reshape them to flat vectors
3770:         ckpt_dict = torch.load(os.path.join(folder, f"{key}.pt"), weights_only=False)
3771:         loaded_checkpoint_state = ckpt_dict
3772:         if isinstance(ckpt_dict, dict):
3773:             if ckpt_dict.get(EP_IS_EXPERT_PARAM, False):
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-deepspeed-stage3-py-torch-load-any-l3770-regex"
SPEC = {'id': 'deepspeed-stage3-py-torch-load-any-l3770-regex', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-deepspeed-stage3-py-torch-load-any-l3770-regex`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/deepspeed-stage3-py-torch-load-any-l3770-regex/poc.py`；上游 pin: `deepspeed/runtime/zero/stage3.py:3770`

**清理**

`python demos/deepspeed-stage3-py-torch-load-any-l3770-regex/poc.py --cleanup`；删除 `demos/.work/deepspeed-stage3-py-torch-load-any-l3770-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/deepspeed-stage3-py-torch-load-any-l3770-regex/poc.py`（sha256 `8ece2d7639a82cf775c44b90eb0ac686a5e5f88ba989c9d7bd4c26fb5ef64584`）

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；stage3 torch.load 固定 weights_only=True；AutoEP 输入校验；`lab/upstream_verify/cases/deepspeed/deepspeed-stage3-py-torch-load-any-l3770-regex/result.json`

#### L5-007 · `deepspeed-stage3-py-torch-load-unsafe-l3660-ast` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 文件: DeepSpeed checkpoint/stage3.py | `deepspeed/runtime/zero/stage3.py:3660`；加载 checkpoint 时显式使用 weights_only=False，checkpoint 写者可在恢复时执行 pickle | checkpoint dir, torch.load payload | 需本地（需本地文件写） | 宿主/PVC |

**根因片段**

```text
deepspeed/runtime/zero/stage3.py:3660
3658:             optim_state_path), f'{optim_state_path} containing optimizer global state is missing! Cannot proceed.'
3659:
3660:         optim_sd = torch.load(optim_state_path, weights_only=False)
3661:         self._load_global_state_stage3(optim_sd)
3662:
3663:         # Generally the step of each optimizer file should be the same, we can obtain from any parameter.
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-deepspeed-stage3-py-torch-load-unsafe-l3660-ast"
SPEC = {'id': 'deepspeed-stage3-py-torch-load-unsafe-l3660-ast', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-deepspeed-stage3-py-torch-load-unsafe-l3660-ast`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/deepspeed-stage3-py-torch-load-unsafe-l3660-ast/poc.py`；上游 pin: `deepspeed/runtime/zero/stage3.py:3660`

**清理**

`python demos/deepspeed-stage3-py-torch-load-unsafe-l3660-ast/poc.py --cleanup`；删除 `demos/.work/deepspeed-stage3-py-torch-load-unsafe-l3660-ast/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/deepspeed-stage3-py-torch-load-unsafe-l3660-ast/poc.py`（sha256 `7a52c1aec39307d115f18e25c0e0a3019636d2a4f6f9418abbce3c06aaac5cde`）

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；stage3 torch.load 固定 weights_only=True；AutoEP 输入校验；`lab/upstream_verify/cases/deepspeed/deepspeed-stage3-py-torch-load-unsafe-l3660-ast/result.json`

#### L5-008 · `deepspeed-stage3-py-torch-load-unsafe-l3660-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 文件: DeepSpeed checkpoint/stage3.py | `deepspeed/runtime/zero/stage3.py:3660`；加载 checkpoint 时显式使用 weights_only=False，checkpoint 写者可在恢复时执行 pickle | checkpoint dir, torch.load payload | 需本地（需本地文件写） | 宿主/PVC |

**根因片段**

```text
deepspeed/runtime/zero/stage3.py:3660
3658:             optim_state_path), f'{optim_state_path} containing optimizer global state is missing! Cannot proceed.'
3659:
3660:         optim_sd = torch.load(optim_state_path, weights_only=False)
3661:         self._load_global_state_stage3(optim_sd)
3662:
3663:         # Generally the step of each optimizer file should be the same, we can obtain from any parameter.
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-deepspeed-stage3-py-torch-load-unsafe-l3660-rege"
SPEC = {'id': 'deepspeed-stage3-py-torch-load-unsafe-l3660-regex', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-deepspeed-stage3-py-torch-load-unsafe-l3660-rege`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/deepspeed-stage3-py-torch-load-unsafe-l3660-regex/poc.py`；上游 pin: `deepspeed/runtime/zero/stage3.py:3660`

**清理**

`python demos/deepspeed-stage3-py-torch-load-unsafe-l3660-regex/poc.py --cleanup`；删除 `demos/.work/deepspeed-stage3-py-torch-load-unsafe-l3660-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/deepspeed-stage3-py-torch-load-unsafe-l3660-regex/poc.py`（sha256 `e1defdf4d58ddcc421b297bf4e0d967a875fdfd0174097536016738fe5a094f6`）

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；stage3 torch.load 固定 weights_only=True；AutoEP 输入校验；`lab/upstream_verify/cases/deepspeed/deepspeed-stage3-py-torch-load-unsafe-l3660-regex/result.json`

#### L5-009 · `deepspeed-stage3-py-torch-load-unsafe-l3770-ast` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 文件: DeepSpeed checkpoint/stage3.py | `deepspeed/runtime/zero/stage3.py:3770`；加载 checkpoint 时显式使用 weights_only=False，checkpoint 写者可在恢复时执行 pickle | checkpoint dir, torch.load payload | 需本地（需本地文件写） | 宿主/PVC |

**根因片段**

```text
deepspeed/runtime/zero/stage3.py:3770
3768:
3769:         # Load tensors from files and reshape them to flat vectors
3770:         ckpt_dict = torch.load(os.path.join(folder, f"{key}.pt"), weights_only=False)
3771:         loaded_checkpoint_state = ckpt_dict
3772:         if isinstance(ckpt_dict, dict):
3773:             if ckpt_dict.get(EP_IS_EXPERT_PARAM, False):
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-deepspeed-stage3-py-torch-load-unsafe-l3770-ast"
SPEC = {'id': 'deepspeed-stage3-py-torch-load-unsafe-l3770-ast', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-deepspeed-stage3-py-torch-load-unsafe-l3770-ast`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/deepspeed-stage3-py-torch-load-unsafe-l3770-ast/poc.py`；上游 pin: `deepspeed/runtime/zero/stage3.py:3770`

**清理**

`python demos/deepspeed-stage3-py-torch-load-unsafe-l3770-ast/poc.py --cleanup`；删除 `demos/.work/deepspeed-stage3-py-torch-load-unsafe-l3770-ast/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/deepspeed-stage3-py-torch-load-unsafe-l3770-ast/poc.py`（sha256 `9c4cd79b96d8fa3ccf6f0718a4ce146160cc6c122a7fccc7fe0b7e51296949e5`）

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；stage3 torch.load 固定 weights_only=True；AutoEP 输入校验；`lab/upstream_verify/cases/deepspeed/deepspeed-stage3-py-torch-load-unsafe-l3770-ast/result.json`

#### L5-010 · `llamafactory-checkpoint-py-torch-load-unsafe-l136-ast` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 文件: checkpoint.py:136/334 | `src/llamafactory/v1/core/utils/checkpoint.py:136`；加载 checkpoint 时显式使用 weights_only=False，checkpoint 写者可在恢复时执行 pickle | checkpoint dir, rng_state/dataloader | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
src/llamafactory/v1/core/utils/checkpoint.py:136
134:         return
135:
136:     rng_state = torch.load(path, map_location="cpu", weights_only=False)
137:     random.setstate(rng_state["python"])
138:     np.random.set_state(rng_state["numpy"])
139:     torch.random.set_rng_state(rng_state["torch"])
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-llamafactory-checkpoint-py-torch-load-unsafe-l13"
SPEC = {'id': 'llamafactory-checkpoint-py-torch-load-unsafe-l136-ast', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-llamafactory-checkpoint-py-torch-load-unsafe-l13`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/llamafactory-checkpoint-py-torch-load-unsafe-l136-ast/poc.py`；上游 pin: `src/llamafactory/v1/core/utils/checkpoint.py:136`

**清理**

`python demos/llamafactory-checkpoint-py-torch-load-unsafe-l136-ast/poc.py --cleanup`；删除 `demos/.work/llamafactory-checkpoint-py-torch-load-unsafe-l136-ast/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/llamafactory-checkpoint-py-torch-load-unsafe-l136-ast/poc.py`（sha256 `456bb10cd4c3906991ff0d9965538047edc21f158b2623cc87f573deeb7abb49`）

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；resume 固定 weights_only=True；checkpoint 只读 + 哈希；`lab/upstream_verify/cases/llamafactory/llamafactory-checkpoint-py-torch-load-unsafe-l136-ast/result.json`

#### L5-011 · `llamafactory-checkpoint-py-torch-load-unsafe-l136-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 文件: checkpoint.py:136/334 | `src/llamafactory/v1/core/utils/checkpoint.py:136`；加载 checkpoint 时显式使用 weights_only=False，checkpoint 写者可在恢复时执行 pickle | checkpoint dir, rng_state/dataloader | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
src/llamafactory/v1/core/utils/checkpoint.py:136
134:         return
135:
136:     rng_state = torch.load(path, map_location="cpu", weights_only=False)
137:     random.setstate(rng_state["python"])
138:     np.random.set_state(rng_state["numpy"])
139:     torch.random.set_rng_state(rng_state["torch"])
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-llamafactory-checkpoint-py-torch-load-unsafe-l13"
SPEC = {'id': 'llamafactory-checkpoint-py-torch-load-unsafe-l136-regex', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-llamafactory-checkpoint-py-torch-load-unsafe-l13`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/llamafactory-checkpoint-py-torch-load-unsafe-l136-regex/poc.py`；上游 pin: `src/llamafactory/v1/core/utils/checkpoint.py:136`

**清理**

`python demos/llamafactory-checkpoint-py-torch-load-unsafe-l136-regex/poc.py --cleanup`；删除 `demos/.work/llamafactory-checkpoint-py-torch-load-unsafe-l136-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/llamafactory-checkpoint-py-torch-load-unsafe-l136-regex/poc.py`（sha256 `a71813f50c39a210f7c70a6ac5559fa29d9f94f94b276a9dd679adb720a70e53`）

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；resume 固定 weights_only=True；checkpoint 只读 + 哈希；`lab/upstream_verify/cases/llamafactory/llamafactory-checkpoint-py-torch-load-unsafe-l136-regex/result.json`

#### L5-012 · `llamafactory-checkpoint-py-torch-load-unsafe-l334-ast` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 文件: checkpoint.py:136/334 | `src/llamafactory/v1/core/utils/checkpoint.py:334`；加载 checkpoint 时显式使用 weights_only=False，checkpoint 写者可在恢复时执行 pickle | checkpoint dir, rng_state/dataloader | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
src/llamafactory/v1/core/utils/checkpoint.py:334
332:
333:         if os.path.exists(dl_path):
334:             self._t.train_batch_generator.load_state_dict(torch.load(dl_path, map_location="cpu", weights_only=False))
335:         else:
336:             logger.warning_rank0(
337:                 f"Dataloader state file not found at {dl_path}. Skipping Dataloader state restoration."
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-llamafactory-checkpoint-py-torch-load-unsafe-l33"
SPEC = {'id': 'llamafactory-checkpoint-py-torch-load-unsafe-l334-ast', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-llamafactory-checkpoint-py-torch-load-unsafe-l33`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-ast/poc.py`；上游 pin: `src/llamafactory/v1/core/utils/checkpoint.py:334`

**清理**

`python demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-ast/poc.py --cleanup`；删除 `demos/.work/llamafactory-checkpoint-py-torch-load-unsafe-l334-ast/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-ast/poc.py`（sha256 `8b6ee4613cee68373fdb904c823154d326848cde5394318aace5cd448f71f0d3`）

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；resume 固定 weights_only=True；checkpoint 只读 + 哈希；`lab/upstream_verify/cases/llamafactory/llamafactory-checkpoint-py-torch-load-unsafe-l334-ast/result.json`

#### L5-013 · `llamafactory-checkpoint-py-torch-load-unsafe-l334-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 文件: checkpoint.py:136/334 | `src/llamafactory/v1/core/utils/checkpoint.py:334`；加载 checkpoint 时显式使用 weights_only=False，checkpoint 写者可在恢复时执行 pickle | checkpoint dir, rng_state/dataloader | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
src/llamafactory/v1/core/utils/checkpoint.py:334
332:
333:         if os.path.exists(dl_path):
334:             self._t.train_batch_generator.load_state_dict(torch.load(dl_path, map_location="cpu", weights_only=False))
335:         else:
336:             logger.warning_rank0(
337:                 f"Dataloader state file not found at {dl_path}. Skipping Dataloader state restoration."
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-llamafactory-checkpoint-py-torch-load-unsafe-l33"
SPEC = {'id': 'llamafactory-checkpoint-py-torch-load-unsafe-l334-regex', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-llamafactory-checkpoint-py-torch-load-unsafe-l33`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-regex/poc.py`；上游 pin: `src/llamafactory/v1/core/utils/checkpoint.py:334`

**清理**

`python demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-regex/poc.py --cleanup`；删除 `demos/.work/llamafactory-checkpoint-py-torch-load-unsafe-l334-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-regex/poc.py`（sha256 `a44eeaa463219cbf59f32ab32d2d0346182d22ce5eccc5b05f9165258cdb69a0`）

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；resume 固定 weights_only=True；checkpoint 只读 + 哈希；`lab/upstream_verify/cases/llamafactory/llamafactory-checkpoint-py-torch-load-unsafe-l334-regex/result.json`

#### L5-014 · `megatron-checkpointing-py-torch-load-any-l1739-regex` · Megatron-LM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Megatron-LM | core_v0.19.2 | 文件: checkpointing.py:1341 | `megatron/training/checkpointing.py:1739`；加载 checkpoint 时调用 torch.load 且未固定 weights_only，checkpoint 写者可在恢复时执行 pickle | checkpoint path | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
megatron/training/checkpointing.py:1739
1737:             )
1738:         try:
1739:             state_dict = torch.load(checkpoint_name, map_location='cpu')
1740:         except Exception as e:
1741:             print('could not load the checkpoint')
1742:             print(e)
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-megatron-checkpointing-py-torch-load-any-l1739-r"
SPEC = {'id': 'megatron-checkpointing-py-torch-load-any-l1739-regex', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-megatron-checkpointing-py-torch-load-any-l1739-r`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/megatron-checkpointing-py-torch-load-any-l1739-regex/poc.py`；上游 pin: `megatron/training/checkpointing.py:1739`

**清理**

`python demos/megatron-checkpointing-py-torch-load-any-l1739-regex/poc.py --cleanup`；删除 `demos/.work/megatron-checkpointing-py-torch-load-any-l1739-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/megatron-checkpointing-py-torch-load-any-l1739-regex/poc.py`（sha256 `fdce4fa53c77ca791ad17c0641f23e260f7e473fb08eb50ffb5ac528552faf05`）

- **检测/修复/证据**：`megatron-checkpoint-rce` / `inkblade/modules/megatron-checkpoint-rce/template.json`；checkpoint 固定 weights_only=True；分片签名/哈希；`lab/upstream_verify/cases/megatron/megatron-checkpointing-py-torch-load-any-l1739-regex/result.json`

#### L5-015 · `msswift-indexed-dataset-py-pickle-loads-l112-ast` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 文件: IndexedDataset data.idx | `swift/dataset/indexed_dataset.py:112`；对共享缓存或请求字节直接 pickle.loads，写者可在加载时执行代码 | data.idx / pickle | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
swift/dataset/indexed_dataset.py:112
110:         self.idx_path = os.path.join(cache_dir, self.IDX_FNAME)
111:         with open(self.idx_path, 'rb') as f:
112:             idx_obj = pickle.load(f)
113:         self.idx_list = idx_obj['idx']
114:         self.length_list = idx_obj['length']
115:         self.n_shard = idx_obj['n_shard']
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-msswift-indexed-dataset-py-pickle-loads-l112-ast"
SPEC = {'id': 'msswift-indexed-dataset-py-pickle-loads-l112-ast', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-msswift-indexed-dataset-py-pickle-loads-l112-ast`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/msswift-indexed-dataset-py-pickle-loads-l112-ast/poc.py`；上游 pin: `swift/dataset/indexed_dataset.py:112`

**清理**

`python demos/msswift-indexed-dataset-py-pickle-loads-l112-ast/poc.py --cleanup`；删除 `demos/.work/msswift-indexed-dataset-py-pickle-loads-l112-ast/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/msswift-indexed-dataset-py-pickle-loads-l112-ast/poc.py`（sha256 `55c4fd9922a233ce21b95e6e5bc63a8a475ea19ba469fcf47e3ef2738bf7ac05`）

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；禁用 dataset pickle；改用 safetensors/Arrow + 签名；`lab/upstream_verify/cases/msswift/msswift-indexed-dataset-py-pickle-loads-l112-ast/result.json`

#### L5-016 · `msswift-indexed-dataset-py-pickle-loads-l112-regex` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 文件: IndexedDataset data.idx | `swift/dataset/indexed_dataset.py:112`；对共享缓存或请求字节直接 pickle.loads，写者可在加载时执行代码 | data.idx / pickle | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
swift/dataset/indexed_dataset.py:112
110:         self.idx_path = os.path.join(cache_dir, self.IDX_FNAME)
111:         with open(self.idx_path, 'rb') as f:
112:             idx_obj = pickle.load(f)
113:         self.idx_list = idx_obj['idx']
114:         self.length_list = idx_obj['length']
115:         self.n_shard = idx_obj['n_shard']
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-msswift-indexed-dataset-py-pickle-loads-l112-reg"
SPEC = {'id': 'msswift-indexed-dataset-py-pickle-loads-l112-regex', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-msswift-indexed-dataset-py-pickle-loads-l112-reg`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/msswift-indexed-dataset-py-pickle-loads-l112-regex/poc.py`；上游 pin: `swift/dataset/indexed_dataset.py:112`

**清理**

`python demos/msswift-indexed-dataset-py-pickle-loads-l112-regex/poc.py --cleanup`；删除 `demos/.work/msswift-indexed-dataset-py-pickle-loads-l112-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/msswift-indexed-dataset-py-pickle-loads-l112-regex/poc.py`（sha256 `11f85f8519a88de34883ee5be0288b16144760809843eb848cdaf3725ee3ef7f`）

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；禁用 dataset pickle；改用 safetensors/Arrow + 签名；`lab/upstream_verify/cases/msswift/msswift-indexed-dataset-py-pickle-loads-l112-regex/result.json`

#### L5-017 · `msswift-indexed-dataset-py-pickle-loads-l129-ast` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 文件: IndexedDataset data.idx | `swift/dataset/indexed_dataset.py:129`；对共享缓存或请求字节直接 pickle.loads，写者可在加载时执行代码 | data.idx / pickle | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
swift/dataset/indexed_dataset.py:129
127:         offset = self.shard_offset[num_shard - 1]
128:         buffer = self.bin_readers[num_shard - 1].read_buffer(idx - offset, idx_next - idx)
129:         return pickle.loads(buffer)
130:
131:     def __len__(self):
132:         return len(self.idx_list) - 1
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-msswift-indexed-dataset-py-pickle-loads-l129-ast"
SPEC = {'id': 'msswift-indexed-dataset-py-pickle-loads-l129-ast', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-msswift-indexed-dataset-py-pickle-loads-l129-ast`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/msswift-indexed-dataset-py-pickle-loads-l129-ast/poc.py`；上游 pin: `swift/dataset/indexed_dataset.py:129`

**清理**

`python demos/msswift-indexed-dataset-py-pickle-loads-l129-ast/poc.py --cleanup`；删除 `demos/.work/msswift-indexed-dataset-py-pickle-loads-l129-ast/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/msswift-indexed-dataset-py-pickle-loads-l129-ast/poc.py`（sha256 `4a9d8e96157e339ce70cea449944bf61b75b62c16b405bd8848e460b41b6dd3f`）

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；禁用 dataset pickle；改用 safetensors/Arrow + 签名；`lab/upstream_verify/cases/msswift/msswift-indexed-dataset-py-pickle-loads-l129-ast/result.json`

#### L5-018 · `msswift-indexed-dataset-py-pickle-loads-l129-regex` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 文件: IndexedDataset data.idx | `swift/dataset/indexed_dataset.py:129`；对共享缓存或请求字节直接 pickle.loads，写者可在加载时执行代码 | data.idx / pickle | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
swift/dataset/indexed_dataset.py:129
127:         offset = self.shard_offset[num_shard - 1]
128:         buffer = self.bin_readers[num_shard - 1].read_buffer(idx - offset, idx_next - idx)
129:         return pickle.loads(buffer)
130:
131:     def __len__(self):
132:         return len(self.idx_list) - 1
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-msswift-indexed-dataset-py-pickle-loads-l129-reg"
SPEC = {'id': 'msswift-indexed-dataset-py-pickle-loads-l129-regex', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-msswift-indexed-dataset-py-pickle-loads-l129-reg`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/msswift-indexed-dataset-py-pickle-loads-l129-regex/poc.py`；上游 pin: `swift/dataset/indexed_dataset.py:129`

**清理**

`python demos/msswift-indexed-dataset-py-pickle-loads-l129-regex/poc.py --cleanup`；删除 `demos/.work/msswift-indexed-dataset-py-pickle-loads-l129-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/msswift-indexed-dataset-py-pickle-loads-l129-regex/poc.py`（sha256 `09b9fd42029f78cbc5c2a66cf348fbbd559ea9596e8fd2119d78b46f9d6e91d4`）

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；禁用 dataset pickle；改用 safetensors/Arrow + 签名；`lab/upstream_verify/cases/msswift/msswift-indexed-dataset-py-pickle-loads-l129-regex/result.json`

#### L5-019 · `msswift-torch-utils-py-pickle-loads-l340-ast` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 文件: IndexedDataset data.idx | `swift/utils/torch_utils.py:340`；对共享缓存或请求字节直接 pickle.loads，写者可在加载时执行代码 | data.idx / pickle | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
swift/utils/torch_utils.py:340
338:         buffer_size = np.frombuffer(res[:8], dtype=np.int64)[0]
339:         res = res[8:]
340:         return pickle.loads(res[:buffer_size])
341:
342:
343: def set_default_ddp_config():
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-msswift-torch-utils-py-pickle-loads-l340-ast"
SPEC = {'id': 'msswift-torch-utils-py-pickle-loads-l340-ast', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-msswift-torch-utils-py-pickle-loads-l340-ast`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/msswift-torch-utils-py-pickle-loads-l340-ast/poc.py`；上游 pin: `swift/utils/torch_utils.py:340`

**清理**

`python demos/msswift-torch-utils-py-pickle-loads-l340-ast/poc.py --cleanup`；删除 `demos/.work/msswift-torch-utils-py-pickle-loads-l340-ast/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/msswift-torch-utils-py-pickle-loads-l340-ast/poc.py`（sha256 `d56ed7aee210da8389de34f9eb5e99c07b6adc24a075c2f761e4a20268d82c76`）

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；禁用 dataset pickle；改用 safetensors/Arrow + 签名；`lab/upstream_verify/cases/msswift/msswift-torch-utils-py-pickle-loads-l340-ast/result.json`

#### L5-020 · `msswift-torch-utils-py-pickle-loads-l340-regex` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 文件: IndexedDataset data.idx | `swift/utils/torch_utils.py:340`；对共享缓存或请求字节直接 pickle.loads，写者可在加载时执行代码 | data.idx / pickle | 需本地（需本地文件写） | PVC/宿主 |

**根因片段**

```text
swift/utils/torch_utils.py:340
338:         buffer_size = np.frombuffer(res[:8], dtype=np.int64)[0]
339:         res = res[8:]
340:         return pickle.loads(res[:buffer_size])
341:
342:
343: def set_default_ddp_config():
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-msswift-torch-utils-py-pickle-loads-l340-regex"
SPEC = {'id': 'msswift-torch-utils-py-pickle-loads-l340-regex', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-msswift-torch-utils-py-pickle-loads-l340-regex`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/msswift-torch-utils-py-pickle-loads-l340-regex/poc.py`；上游 pin: `swift/utils/torch_utils.py:340`

**清理**

`python demos/msswift-torch-utils-py-pickle-loads-l340-regex/poc.py --cleanup`；删除 `demos/.work/msswift-torch-utils-py-pickle-loads-l340-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/msswift-torch-utils-py-pickle-loads-l340-regex/poc.py`（sha256 `db6d09db35a02d560fec8f6adabd82303957d0133b8453829bc76de2b810bf5d`）

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；禁用 dataset pickle；改用 safetensors/Arrow + 签名；`lab/upstream_verify/cases/msswift/msswift-torch-utils-py-pickle-loads-l340-regex/result.json`

#### L5-021 · `deepspeed-autoep-unsafe-load` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 文件: DeepSpeed checkpoint/stage3.py | `deepspeed/checkpoint/autoep_universal.py:459`；DeepSpeed 0.19.8 AutoEP universal conversion loads expert shards with weights_only=False | checkpoint dir, torch.load payload | 需本地（需本地文件写） | 宿主/PVC |

**根因片段**

```text
deepspeed/checkpoint/autoep_universal.py:459
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-deepspeed-autoep-unsafe-load"
SPEC = {'id': 'deepspeed-autoep-unsafe-load', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

torch.load -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-deepspeed-autoep-unsafe-load`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/deepspeed-autoep-unsafe-load/poc.py`；上游 pin: `deepspeed/checkpoint/autoep_universal.py:459`

**清理**

`python demos/deepspeed-autoep-unsafe-load/poc.py --cleanup`；删除 `demos/.work/deepspeed-autoep-unsafe-load/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/deepspeed-autoep-unsafe-load/poc.py`（sha256 `634981f1cb747b3e12bc14609f245168a7aa2631cf16600c29fc1430a457cdd1`）

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；stage3 torch.load 固定 weights_only=True；AutoEP 输入校验；`lab/zeroday_reserve/cases/deepspeed-autoep-unsafe-load/result.json`

#### L5-022 · `verl-checkpoint-pickle` · verl

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| verl | 76e837e | TCP/ZMQ: recv_pyobj | `verl/checkpoint_engine（入口/函数级，无行号）`；verl checkpoint engine recv_pyobj: pickle over TCP/ZMQ without auth | pickle payload | 无（无（通道可达）） | Pod 内/ClusterIP |

**根因片段**

```text
verl/checkpoint_engine（入口/函数级，无行号）
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-verl-checkpoint-pickle"
SPEC = {'id': 'verl-checkpoint-pickle', 'kind': 'pickle', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

pickle.loads -> marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-verl-checkpoint-pickle`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/verl-checkpoint-pickle/poc.py`；上游 pin: `n/a（advisory）`

**清理**

`python demos/verl-checkpoint-pickle/poc.py --cleanup`；删除 `demos/.work/verl-checkpoint-pickle/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/verl-checkpoint-pickle/poc.py`（sha256 `01e421b8983787144b2851455ee52735b66c4f1d6059d79e7d3f97cbec698894`）

- **检测/修复/证据**：`verl-checkpoint-pickle` / `inkblade/modules/verl-checkpoint-pickle/template.json`；改用 weights_only=True 或安全序列化；checkpoint 目录只读并做哈希/签名校验；反序列化端做类型白名单；`projects/repro-2026-10/verl-checkpoint-engine-pickle/LATEST-RESULT.md`

#### L5-023 · `megatron-checkpointing-py-torch-load-any-l2796-regex` · Megatron-LM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Megatron-LM | core_v0.19.2 | 配置面/CLI: `megatron/training/checkpointing.py:2796` | `megatron/training/checkpointing.py:2796`；加载 checkpoint 时调用 torch.load 且未固定 weights_only，checkpoint 写者可在恢复时执行 pickle | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
megatron/training/checkpointing.py:2796
2794:         )
2795:
2796:     state_dict = torch.load(checkpoint_name, map_location='cpu')
2797:     ret_state_dict = state_dict['model']
2798:
2799:     if only_query_model:
```

**攻击代码**

N/A — attacker can write the Megatron biencoder checkpoint directory

**攻击效果**

N/A（attacker can write the Megatron biencoder checkpoint directory）

**复现环境**

unsupported：attacker can write the Megatron biencoder checkpoint directory

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — attacker can write the Megatron biencoder checkpoint directory

- **检测/修复/证据**：`megatron-checkpoint-rce` / `inkblade/modules/megatron-checkpoint-rce/template.json`；checkpoint 签名/哈希；config 面鉴权；optimizer shard 只读；`lab/upstream_verify/cases/megatron/megatron-checkpointing-py-torch-load-any-l2796-regex/result.json`

#### L5-024 · `CVE-2024-37061` · MLflow

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| MLflow | >=1.11.0（<=2.13.1 记录） | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；恶意 MLproject 代码执行 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
Malicious MLproject execution is the documented project runner trust model; no safe-vs-vulnerable boundary reproduced
static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`mlflow-model-rce` / `inkblade/modules/mlflow-model-rce/template.json`；artifact 路径校验；tracking server 鉴权；MLproject 签名；`lab/upstream_verify/cases/mlflow/CVE-2024-37061/result.json`

#### L5-025 · `CVE-2025-23354` · Megatron-LM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Megatron-LM | < 0.13.1（及 0.12.3） | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；ensemble_classifier 脚本注入 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
ensemble_classifier script injection needs a Megatron training/checkpoint config; no dynamic path imported
static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`megatron-checkpoint-rce` / `inkblade/modules/megatron-checkpoint-rce/template.json`；checkpoint 固定 weights_only=True；分片签名/哈希；`lab/upstream_verify/cases/megatron/CVE-2025-23354/result.json`

#### L5-026 · `CVE-2025-33247` · Megatron-LM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Megatron-LM | < 0.15.3 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；量化配置加载 RCE | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
Quantization config loading needs a full Megatron training run; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`megatron-checkpoint-rce` / `inkblade/modules/megatron-checkpoint-rce/template.json`；checkpoint 固定 weights_only=True；分片签名/哈希；`lab/upstream_verify/cases/megatron/CVE-2025-33247/result.json`

#### L5-027 · `deepspeed-engine-py-env-rank-read-l1964-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 配置面/CLI: `deepspeed/runtime/engine.py:1964` | `deepspeed/runtime/engine.py:1964`；静态规则命中，需人工确认可达性：从环境变量读取 rank 或配置，未校验来源与边界 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
deepspeed/runtime/engine.py:1964
1962:             assert ompi_local_rank == local_rank, f"LOCAL_RANK ({local_rank}) != OMPI_COMM_WORLD_LOCAL_RANK ({ompi_local_rank}), " \
1963:                 "not sure how to proceed as we're seeing conflicting local rank info."
1964:             os.environ['LOCAL_RANK'] = local_rank
1965:
1966:         self.local_rank = int(os.environ['LOCAL_RANK'])
1967:         if hasattr(args, 'local_rank'):
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；先人工复核该静态命中；确认可达后再按组件基线收窄；不要直接当漏洞修复；`lab/upstream_verify/cases/deepspeed/deepspeed-engine-py-env-rank-read-l1964-regex/result.json`

#### L5-028 · `deepspeed-engine-py-env-rank-read-l1966-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 配置面/CLI: `deepspeed/runtime/engine.py:1966` | `deepspeed/runtime/engine.py:1966`；静态规则命中，需人工确认可达性：从环境变量读取 rank 或配置，未校验来源与边界 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
deepspeed/runtime/engine.py:1966
1964:             os.environ['LOCAL_RANK'] = local_rank
1965:
1966:         self.local_rank = int(os.environ['LOCAL_RANK'])
1967:         if hasattr(args, 'local_rank'):
1968:             args.local_rank = self.local_rank
1969:
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；先人工复核该静态命中；确认可达后再按组件基线收窄；不要直接当漏洞修复；`lab/upstream_verify/cases/deepspeed/deepspeed-engine-py-env-rank-read-l1966-regex/result.json`

#### L5-029 · `deepspeed-engine-py-eval-call-l2889-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 配置面/CLI: `deepspeed/runtime/engine.py:2889` | `deepspeed/runtime/engine.py:2889`；静态规则命中，需人工确认可达性：对模型输出或配置可控字符串执行 eval，输入可逃逸到解释器 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
deepspeed/runtime/engine.py:2889
2887:         self.module.train(mode)
2888:
2889:     def eval(self):
2890:         r""""""
2891:
2892:         self.warn_unscaled_loss = True
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；先人工复核该静态命中；确认可达后再按组件基线收窄；不要直接当漏洞修复；`lab/upstream_verify/cases/deepspeed/deepspeed-engine-py-eval-call-l2889-regex/result.json`

#### L5-030 · `deepspeed-multinode-runner-py-subprocess-popen-l457-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 配置面/CLI: `deepspeed/launcher/multinode_runner.py:457` | `deepspeed/launcher/multinode_runner.py:457`；静态规则命中，需人工确认可达性：命令字符串拼接后交给 subprocess，路径或参数可注入 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
deepspeed/launcher/multinode_runner.py:457
455:             warnings.warn("mpiname does not exist, mvapich is not installed properly")
456:         else:
457:             results = subprocess.check_output(['mpiname'])
458:             mpiname_results = results.decode('utf-8').strip()
459:             if "MVAPICH2-GDR" in mpiname_results:
460:                 exists = True
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；先人工复核该静态命中；确认可达后再按组件基线收窄；不要直接当漏洞修复；`lab/upstream_verify/cases/deepspeed/deepspeed-multinode-runner-py-subprocess-popen-l457-regex/result.json`

#### L5-031 · `deepspeed-runner-py-subprocess-popen-l489-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 配置面/CLI: `deepspeed/launcher/runner.py:489` | `deepspeed/launcher/runner.py:489`；静态规则命中，需人工确认可达性：命令字符串拼接后交给 subprocess，路径或参数可注入 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
deepspeed/launcher/runner.py:489
487:                              (f"-p {args.ssh_port} " if args.ssh_port is not None else "") + f"{first_host} hostname")
488:             safe_ssh_cmd = shlex.split(ssh_check_cmd)
489:             subprocess.check_call(safe_ssh_cmd, stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL)
490:         except subprocess.CalledProcessError:
491:             raise RuntimeError(
492:                 f"Using hostfile at {args.hostfile} but host={first_host} was not reachable via ssh. If you are running with a single node please remove {args.hostfile} or setup passwordless ssh."
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；先人工复核该静态命中；确认可达后再按组件基线收窄；不要直接当漏洞修复；`lab/upstream_verify/cases/deepspeed/deepspeed-runner-py-subprocess-popen-l489-regex/result.json`

#### L5-032 · `deepspeed-runner-py-subprocess-popen-l504-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 配置面/CLI: `deepspeed/launcher/runner.py:504` | `deepspeed/launcher/runner.py:504`；静态规则命中，需人工确认可达性：命令字符串拼接后交给 subprocess，路径或参数可注入 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
deepspeed/launcher/runner.py:504
502:         hostname_cmd = shlex.split(ssh_check_cmd)
503:         try:
504:             result = subprocess.check_output(hostname_cmd)
505:         except subprocess.CalledProcessError as err:
506:             logger.error(
507:                 "Unable to detect suitable master address via 'hostname -I', please manually specify one via --master_addr"
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；先人工复核该静态命中；确认可达后再按组件基线收窄；不要直接当漏洞修复；`lab/upstream_verify/cases/deepspeed/deepspeed-runner-py-subprocess-popen-l504-regex/result.json`

#### L5-033 · `deepspeed-runner-py-subprocess-popen-l619-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 配置面/CLI: `deepspeed/launcher/runner.py:619` | `deepspeed/launcher/runner.py:619`；静态规则命中，需人工确认可达性：命令字符串拼接后交给 subprocess，路径或参数可注入 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
deepspeed/launcher/runner.py:619
617:
618:     logger.info(f"cmd = {' '.join(cmd)}")
619:     result = subprocess.Popen(cmd, env=env)
620:
621:     def sigkill_handler(signum, frame):
622:         result.send_signal(signal.SIGINT)
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；先人工复核该静态命中；确认可达后再按组件基线收窄；不要直接当漏洞修复；`lab/upstream_verify/cases/deepspeed/deepspeed-runner-py-subprocess-popen-l619-regex/result.json`

#### L5-034 · `deepspeed-runner-py-subprocess-popen-l625-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 配置面/CLI: `deepspeed/launcher/runner.py:625` | `deepspeed/launcher/runner.py:625`；静态规则命中，需人工确认可达性：命令字符串拼接后交给 subprocess，路径或参数可注入 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
deepspeed/launcher/runner.py:625
623:         time.sleep(0.1)
624:         result.send_signal(signal.SIGTERM)
625:         result_kill = subprocess.Popen(kill_cmd, env=env)
626:         result_kill.wait()
627:         time.sleep(1)
628:         sys.exit(1)
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；先人工复核该静态命中；确认可达后再按组件基线收窄；不要直接当漏洞修复；`lab/upstream_verify/cases/deepspeed/deepspeed-runner-py-subprocess-popen-l625-regex/result.json`

#### L5-035 · `deepspeed-stage3-py-torch-load-any-l3616-regex` · DeepSpeed

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DeepSpeed | v0.19.8 | 配置面/CLI: `deepspeed/runtime/zero/stage3.py:3616` | `deepspeed/runtime/zero/stage3.py:3616`；加载 checkpoint 时调用 torch.load 且未固定 weights_only，checkpoint 写者可在恢复时执行 pickle | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
deepspeed/runtime/zero/stage3.py:3616
3614:             optimizer = FP16_Optimizer(optimizer, static_loss_scale = 128.0)
3615:             ...
3616:             checkpoint = torch.load("saved.pth")
3617:             model.load_state_dict(checkpoint['model'])
3618:             optimizer.load_state_dict(checkpoint['optimizer'])
3619:         """
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`deepspeed-checkpoint-rce` / `inkblade/modules/deepspeed-checkpoint-rce/template.json`；stage3 torch.load weights_only=True；AutoEP 输入校验；runner 参数化；`lab/upstream_verify/cases/deepspeed/deepspeed-stage3-py-torch-load-any-l3616-regex/result.json`

#### L5-036 · `llamafactory-fsdp2-py-torch-load-any-l517-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/v1/plugins/trainer_plugins/distributed/fsdp2.py:517` | `src/llamafactory/v1/plugins/trainer_plugins/distributed/fsdp2.py:517`；加载 checkpoint 时调用 torch.load 且未固定 weights_only，checkpoint 写者可在恢复时执行 pickle | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/v1/plugins/trainer_plugins/distributed/fsdp2.py:517
515:                             self._copy_weights(param_map[renamed_key], tensor)
516:             else:
517:                 state_dict = torch.load(ckpt_file, map_location="cpu")
518:                 for key, tensor in sorted(state_dict.items(), key=lambda item: sort_key(item[0])):
519:                     renamed_key = key
520:                     source_pattern = None
```

**攻击代码**

N/A — attacker can write an FSDP2 checkpoint file；victim resumes with torch<2.6 (weights_only defaults False)

**攻击效果**

N/A（attacker can write an FSDP2 checkpoint file；victim resumes with torch<2.6 (weights_only defaults False)）

**复现环境**

static：attacker can write an FSDP2 checkpoint file；victim resumes with torch<2.6 (weights_only defaults False)

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — attacker can write an FSDP2 checkpoint file；victim resumes with torch<2.6 (weights_only defaults False)

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-fsdp2-py-torch-load-any-l517-regex/result.json`

#### L5-037 · `llamafactory-loader-py-eval-call-l211-ast` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/model/loader.py:211` | `src/llamafactory/model/loader.py:211`；对模型输出或配置可控字符串执行 eval，输入可逃逸到解释器 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/model/loader.py:211
209:     if not is_trainable:
210:         model.requires_grad_(False)
211:         model.eval()
212:     else:
213:         model.train()
214:
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-loader-py-eval-call-l211-ast/result.json`

#### L5-038 · `llamafactory-loader-py-eval-call-l211-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/model/loader.py:211` | `src/llamafactory/model/loader.py:211`；对模型输出或配置可控字符串执行 eval，输入可逃逸到解释器 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/model/loader.py:211
209:     if not is_trainable:
210:         model.requires_grad_(False)
211:         model.eval()
212:     else:
213:         model.train()
214:
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-loader-py-eval-call-l211-regex/result.json`

#### L5-039 · `llamafactory-loader-py-missing-revision-l104-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/model/loader.py:104` | `src/llamafactory/model/loader.py:104`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/model/loader.py:104
96:
97:     try:
98:         processor = AutoProcessor.from_pretrained(
99:             model_args.model_name_or_path,
100:             use_fast=model_args.use_fast_tokenizer,
101:             **init_kwargs,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-loader-py-missing-revision-l104-regex/result.json`

#### L5-040 · `llamafactory-loader-py-missing-revision-l128-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/model/loader.py:128` | `src/llamafactory/model/loader.py:128`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/model/loader.py:128
126:     r"""Load model config."""
127:     init_kwargs = _get_init_kwargs(model_args)
128:     return AutoConfig.from_pretrained(model_args.model_name_or_path, **init_kwargs)
129:
130:
131: def load_model(
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-loader-py-missing-revision-l128-regex/result.json`

#### L5-041 · `llamafactory-loader-py-missing-revision-l172-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/model/loader.py:172` | `src/llamafactory/model/loader.py:172`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/model/loader.py:172
168:
169:             if model_args.train_from_scratch:
170:                 model = load_class.from_config(config, trust_remote_code=model_args.trust_remote_code)
171:             else:
172:                 model = load_class.from_pretrained(**init_kwargs)
173:                 if getattr(model.config, "model_type", None) in ["qwen2_5_omni", "qwen3_omni_moe"]:
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-loader-py-missing-revision-l172-regex/result.json`

#### L5-042 · `llamafactory-loader-py-missing-revision-l186-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/model/loader.py:186` | `src/llamafactory/model/loader.py:186`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/model/loader.py:186
184:
185:     if add_valuehead:
186:         model = AutoModelForCausalLMWithValueHead.from_pretrained(model)
187:         patch_valuehead_model(model)
188:
189:         if model_args.adapter_name_or_path is not None:
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-loader-py-missing-revision-l186-regex/result.json`

#### L5-043 · `llamafactory-loader-py-missing-revision-l78-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/model/loader.py:78` | `src/llamafactory/model/loader.py:78`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/model/loader.py:78
76:     init_kwargs = _get_init_kwargs(model_args)
77:     try:
78:         tokenizer = AutoTokenizer.from_pretrained(
79:             model_args.model_name_or_path,
80:             use_fast=model_args.use_fast_tokenizer,
81:             split_special_tokens=model_args.split_special_tokens,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-loader-py-missing-revision-l78-regex/result.json`

#### L5-044 · `llamafactory-loader-py-missing-revision-l86-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/model/loader.py:86` | `src/llamafactory/model/loader.py:86`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/model/loader.py:86
76:     init_kwargs = _get_init_kwargs(model_args)
77:     try:
78:         tokenizer = AutoTokenizer.from_pretrained(
79:             model_args.model_name_or_path,
80:             use_fast=model_args.use_fast_tokenizer,
81:             split_special_tokens=model_args.split_special_tokens,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-loader-py-missing-revision-l86-regex/result.json`

#### L5-045 · `llamafactory-loader-py-missing-revision-l98-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/model/loader.py:98` | `src/llamafactory/model/loader.py:98`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/model/loader.py:98
96:
97:     try:
98:         processor = AutoProcessor.from_pretrained(
99:             model_args.model_name_or_path,
100:             use_fast=model_args.use_fast_tokenizer,
101:             **init_kwargs,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-loader-py-missing-revision-l98-regex/result.json`

#### L5-046 · `llamafactory-loader-py-trust-remote-code-propagated-l170-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/model/loader.py:170` | `src/llamafactory/model/loader.py:170`；trust_remote_code 从上层参数传播到模型加载，模型仓库代码被当成本地代码执行 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/model/loader.py:170
168:
169:             if model_args.train_from_scratch:
170:                 model = load_class.from_config(config, trust_remote_code=model_args.trust_remote_code)
171:             else:
172:                 model = load_class.from_pretrained(**init_kwargs)
173:                 if getattr(model.config, "model_type", None) in ["qwen2_5_omni", "qwen3_omni_moe"]:
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-loader-py-trust-remote-code-propagated-l170-regex/result.json`

#### L5-047 · `llamafactory-template-py-apply-chat-template-dynamic-l584-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/data/template.py:584` | `src/llamafactory/data/template.py:584`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/data/template.py:584
582:
583:     messages = [{"role": "system", "content": "{{content}}"}]
584:     system_slot = tokenizer.apply_chat_template(messages, add_generation_prompt=False, tokenize=False)[len(prefix) :]
585:
586:     messages = [{"role": "system", "content": ""}, {"role": "user", "content": "{{content}}"}]
587:     user_slot_empty_system = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-template-py-apply-chat-template-dynamic-l584-regex/result.json`

#### L5-048 · `llamafactory-template-py-apply-chat-template-dynamic-l587-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/data/template.py:587` | `src/llamafactory/data/template.py:587`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/data/template.py:587
585:
586:     messages = [{"role": "system", "content": ""}, {"role": "user", "content": "{{content}}"}]
587:     user_slot_empty_system = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
588:     user_slot_empty_system = user_slot_empty_system[len(prefix) :]
589:
590:     messages = [{"role": "user", "content": "{{content}}"}]
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-template-py-apply-chat-template-dynamic-l587-regex/result.json`

#### L5-049 · `llamafactory-template-py-apply-chat-template-dynamic-l591-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/data/template.py:591` | `src/llamafactory/data/template.py:591`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/data/template.py:591
589:
590:     messages = [{"role": "user", "content": "{{content}}"}]
591:     user_slot = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
592:     user_slot = user_slot[len(prefix) :]
593:
594:     messages = [{"role": "user", "content": "{{content}}"}, {"role": "assistant", "content": "{{content}}"}]
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-template-py-apply-chat-template-dynamic-l591-regex/result.json`

#### L5-050 · `llamafactory-template-py-apply-chat-template-dynamic-l595-regex` · LLaMA-Factory

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LLaMA-Factory | v0.9.5 | 配置面/CLI: `src/llamafactory/data/template.py:595` | `src/llamafactory/data/template.py:595`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
src/llamafactory/data/template.py:595
593:
594:     messages = [{"role": "user", "content": "{{content}}"}, {"role": "assistant", "content": "{{content}}"}]
595:     assistant_slot = tokenizer.apply_chat_template(messages, add_generation_prompt=False, tokenize=False)
596:     assistant_slot = assistant_slot[len(prefix) + len(user_slot) :]
597:     template_class = ReasoningTemplate if "<think>" in assistant_slot else Template
598:     assistant_slot = assistant_slot.replace("<think>", "").replace("</think>", "").lstrip("\n")  # remove thought tags
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`llamafactory-checkpoint-rce` / `inkblade/modules/llamafactory-checkpoint-rce/template.json`；checkpoint weights_only=True；WebUI 回环+鉴权；trust_remote_code 默认 False；`lab/upstream_verify/cases/llamafactory/llamafactory-template-py-apply-chat-template-dynamic-l595-regex/result.json`

#### L5-051 · `megatron-checkpointing-py-wandb-checkpoint-hook-l1093-regex` · Megatron-LM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Megatron-LM | core_v0.19.2 | 配置面/CLI: `megatron/training/checkpointing.py:1093` | `megatron/training/checkpointing.py:1093`；静态规则命中，需人工确认可达性：checkpoint 回调把路径与元数据交给外部记录端，路径未做边界校验 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
megatron/training/checkpointing.py:1093
1091:
1092:         def wandb_finalize_fn():
1093:             wandb_utils.on_save_checkpoint_success(
1094:                 checkpoint_name, get_checkpoint_tracker_filename(save_dir), save_dir, iteration
1095:             )
1096:
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`megatron-checkpoint-rce` / `inkblade/modules/megatron-checkpoint-rce/template.json`；先人工复核该静态命中；确认可达后再按组件基线收窄；不要直接当漏洞修复；`lab/upstream_verify/cases/megatron/megatron-checkpointing-py-wandb-checkpoint-hook-l1093-regex/result.json`

#### L5-052 · `megatron-checkpointing-py-wandb-checkpoint-hook-l2725-regex` · Megatron-LM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Megatron-LM | core_v0.19.2 | 配置面/CLI: `megatron/training/checkpointing.py:2725` | `megatron/training/checkpointing.py:2725`；静态规则命中，需人工确认可达性：checkpoint 回调把路径与元数据交给外部记录端，路径未做边界校验 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
megatron/training/checkpointing.py:2725
2723:     # Additional callback for wandb (last rank)
2724:     if not torch.distributed.is_initialized() or is_last_rank():
2725:         wandb_utils.on_load_checkpoint_success(checkpoint_name, load_dir)
2726:
2727:     torch.cuda.empty_cache()
2728:
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`megatron-checkpoint-rce` / `inkblade/modules/megatron-checkpoint-rce/template.json`；先人工复核该静态命中；确认可达后再按组件基线收窄；不要直接当漏洞修复；`lab/upstream_verify/cases/megatron/megatron-checkpointing-py-wandb-checkpoint-hook-l2725-regex/result.json`

#### L5-053 · `msswift-base-py-apply-chat-template-dynamic-l1283-regex` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 配置面/CLI: `swift/template/base.py:1283` | `swift/template/base.py:1283`；聊天模板从数据或配置动态加载，模板内容可触发代码路径 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
swift/template/base.py:1283
1281:         kwargs.update(self.chat_template_kwargs)
1282:         kwargs.update(inputs.chat_template_kwargs)
1283:         text = self.tokenizer.apply_chat_template(
1284:             messages, tokenize=False, add_generation_prompt=add_generation_prompt, **kwargs)
1285:         answer_len = 1 if self.is_training else 0
1286:         return [text], [1.], answer_len
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；trust_remote_code 默认 False；dataset pickle 禁用；device_groups 白名单；media 路径限制；`lab/upstream_verify/cases/msswift/msswift-base-py-apply-chat-template-dynamic-l1283-regex/result.json`

#### L5-054 · `msswift-loader-py-load-dataset-any-l109-regex` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 配置面/CLI: `swift/dataset/loader.py:109` | `swift/dataset/loader.py:109`；数据集加载接受任意路径或格式，解析器与代码执行相邻 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
swift/dataset/loader.py:109
107:                 while True:
108:                     try:
109:                         dataset = hub.load_dataset(
110:                             dataset_id,
111:                             subset.subset,
112:                             split,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；trust_remote_code 默认 False；dataset pickle 禁用；device_groups 白名单；media 路径限制；`lab/upstream_verify/cases/msswift/msswift-loader-py-load-dataset-any-l109-regex/result.json`

#### L5-055 · `msswift-loader-py-load-dataset-any-l253-regex` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 配置面/CLI: `swift/dataset/loader.py:253` | `swift/dataset/loader.py:253`；数据集加载接受任意路径或格式，解析器与代码执行相邻 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
swift/dataset/loader.py:253
251:
252:
253: def load_dataset(
254:     datasets: Union[List[str], str],
255:     *,
256:     split_dataset_ratio: float = 0.,
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；trust_remote_code 默认 False；dataset pickle 禁用；device_groups 白名单；media 路径限制；`lab/upstream_verify/cases/msswift/msswift-loader-py-load-dataset-any-l253-regex/result.json`

#### L5-056 · `msswift-loader-py-load-dataset-any-l338-regex` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 配置面/CLI: `swift/dataset/loader.py:338` | `swift/dataset/loader.py:338`；数据集加载接受任意路径或格式，解析器与代码执行相邻 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
swift/dataset/loader.py:338
336:     Examples:
337:         >>> # Load single dataset
338:         >>> train_ds, val_ds = load_dataset('AI-ModelScope/alpaca-gpt4-data-zh', split_dataset_ratio=0.1)
339:
340:         >>> # Load multiple datasets
341:         >>> train_ds, _ = load_dataset(
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；trust_remote_code 默认 False；dataset pickle 禁用；device_groups 白名单；media 路径限制；`lab/upstream_verify/cases/msswift/msswift-loader-py-load-dataset-any-l338-regex/result.json`

#### L5-057 · `msswift-loader-py-load-dataset-any-l341-regex` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 配置面/CLI: `swift/dataset/loader.py:341` | `swift/dataset/loader.py:341`；数据集加载接受任意路径或格式，解析器与代码执行相邻 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
swift/dataset/loader.py:341
339:
340:         >>> # Load multiple datasets
341:         >>> train_ds, _ = load_dataset(
342:         ...     ['AI-ModelScope/alpaca-gpt4-data-zh#500', 'swift/self-cognition#500'],
343:         ...     model_name=('我的模型', 'MyModel'),
344:         ...     model_author=('作者', 'Author')
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；trust_remote_code 默认 False；dataset pickle 禁用；device_groups 白名单；media 路径限制；`lab/upstream_verify/cases/msswift/msswift-loader-py-load-dataset-any-l341-regex/result.json`

#### L5-058 · `msswift-loader-py-load-dataset-any-l59-regex` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 配置面/CLI: `swift/dataset/loader.py:59` | `swift/dataset/loader.py:59`；数据集加载接受任意路径或格式，解析器与代码执行相邻 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
swift/dataset/loader.py:59
57:         with safe_ddp_context(None, True):
58:             kwargs['cache_dir'] = os.path.join(get_cache_dir(), 'datasets')
59:             dataset = hf_load_dataset(file_type, data_files=dataset_path, **kwargs)
60:         if self.columns:
61:             dataset = RowPreprocessor.safe_rename_columns(dataset, self.columns)
62:         dataset = dataset_meta.preprocess_func(
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；trust_remote_code 默认 False；dataset pickle 禁用；device_groups 白名单；media 路径限制；`lab/upstream_verify/cases/msswift/msswift-loader-py-load-dataset-any-l59-regex/result.json`

#### L5-059 · `msswift-sft-py-load-dataset-any-l84-regex` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | v4.6.0 | 配置面/CLI: `swift/pipelines/train/sft.py:84` | `swift/pipelines/train/sft.py:84`；数据集加载接受任意路径或格式，解析器与代码执行相邻 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
swift/pipelines/train/sft.py:84
82:         # The random shuffling of the training set occurs in the dataloader of the trainer.
83:         args = self.args
84:         train_dataset, val_dataset = args.load_dataset()
85:         if args.truncation_strategy == 'split':
86:             logger.info(f'train_dataset: {train_dataset}')
87:             logger.info(f'val_dataset: {val_dataset}')
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`msswift-dataset-pickle-rce` / `inkblade/modules/msswift-dataset-pickle-rce/template.json`；trust_remote_code 默认 False；dataset pickle 禁用；device_groups 白名单；media 路径限制；`lab/upstream_verify/cases/msswift/msswift-sft-py-load-dataset-any-l84-regex/result.json`


## 6. 租户与隔离层：分区不等于清零

**层是什么**：GPU 隔离有三层：硬件分区（MIG）、软件上下文（MPS）、调度器配额（HAMi/cGPU/分数卡）。三层都不是默认安全边界：MIG 只切资源不切身份，MPS 默认假设单用户，池化调度器把隔离决策放在 Kubernetes RBAC 之外。释放不等于清零，残留显存、MPS context、显存快照会把上一个租户的模型/进程信息留给下一个租户。

### 6.1 名词与架构前置：GPU 租户：分区、上下文与残留

GPU 共享有三层：硬件分区（MIG）、软件上下文（MPS/vGPU/时间片）、调度器配额（HAMi/cGPU/分数卡）。三层都不是默认安全边界；释放不等于清零，分配记录不等于隔离证明。

**类比**：像合租公寓按房间/时段分床位，但退租不换床单；下一个租客还能看到上一位的枕头。

```text
physical GPU
  ├─ MIG instance 1g.10gb ── tenant A
  ├─ MIG instance 2g.20gb ── tenant B
  └─ MPS server / pipe ───── tenant A + B (shared context)
             │
             ▼
   [ pool scheduler: HAMi / cGPU / OrionX ]
             │ allocate / release / migrate
             ▼
   [ residue: VRAM snapshot / context / temp volume ]
             │
             ▼
   next tenant can read previous marker
```

**术语速查（12 条）**

| 术语 | 白话解释 |
|---|---|
| MIG | 把一张 GPU 切成多个 GPU instance 的硬件分区；切资源不切身份，profile 错配会改写邻居边界。 |
| MPS | CUDA Multi-Process Service；多进程共享一个 context/pipe，默认假设是单用户。 |
| time-slicing | 按时间片轮转共享 GPU；上下文切换残留与时间侧信道是主要风险。 |
| vGPU | 虚拟 GPU 实例；调度器把物理卡切片给多个租户，释放路径必须销毁实例。 |
| HAMi | Kubernetes GPU 池化调度器；admin API 与租户过滤是隔离决策的实际执行点。 |
| cGPU | 容器级 GPU 隔离/分数卡方案；配额、上下文与指标面需要与 K8s RBAC 对齐。 |
| GPU 池化调度 | 把物理卡按显存/算力切片并跨 namespace 分配；分配、释放、迁移三个动作都要鉴权。 |
| 显存残留 | 释放后未清零的 VRAM/快照/临时卷；下一个租户可读前一个租户的模型或激活。 |
| 隔离边界 | 从“同卡”到“同 MIG 实例”到“同 context”的层级；边界越细，越需要生命周期证明。 |
| CUDA context | 进程在 GPU 上的执行上下文；MPS 共享 context 时，client/pid 可能跨租户可见。 |
| MIG profile | 1g/2g/3g/7g 等切片档位；请求档位与设备实际档位不一致就是隔离降级。 |
| DCGM | GPU 指标采集器；进程名、namespace、模型标签是无鉴权时的租户画像源。 |

**前置知识 × 危害细化**

| 漏洞 | 前置知识（要懂什么） | 危害细化（训练/推理/合规） | 正文 |
|---|---|---|---|
| MIG profile 错配 | 懂 MIG 档位与在线重配语义 | 邻居边界降级、跨租户干扰 | 第 6 层逐条 |
| MPS context 共享 | 懂 MPS server/pipe 与 context | 进程/上下文泄露、时间片侧信道 | 第 6 层逐条 |
| 释放后残留 | 懂分配/释放/清零三步 | 模型/激活/快照泄露、持久化投毒 | 第 6 层逐条 |
| 池调度 admin 无鉴权 | 懂 HAMi/cGPU admin API 与租户作用域 | 跨租户 allocate/migrate、设备占用 | 第 6 层逐条 |
| 指标跨租户 | 懂 DCGM/EPP 指标粒度 | 租户画像、缓存状态侧信道 | 第 6 层逐条 |


**漏洞类别**

- MIG profile 错配：请求档位与设备实际值不一致，已分配设备可在线重配，邻居边界被改写。
- MPS context 共享：多租户共用一个 MPS server/pipe，client/pid/context 可见。
- GPU 残留：释放后显存/快照未清零，后续租户可读前租户 marker/模型。
- GPU 池化调度器：HAMi/cGPU 的 admin API 无鉴权或只按 namespace 过滤，可跨租户 allocate/migrate。
- cache_salt 策略：salt 可选或 key_scope=global，缓存条目之间没有租户隔断。
- 路由/GPU 指标：per-tenant 队列深度、命中率、进程名与模型标签无鉴权暴露。

**代表漏洞**

| # | 组件 / 版本区间 | 根因锚点（file:line 或配置面） | 前置 → 影响 | 模板键 |
|---|---|---|---|---|
| 1 | MIG（A100/H100/H200/GB200） | 请求 profile 与 `nvidia-smi mig -lgip` 实际值不一致；已分配 GPU instance 可在线重配 | GPU 共享集群 → MIG 边界降级、邻居实例受影响 | `mig-profile-mismatch`、`gpu-dra-mig-policy` |
| 2 | MPS（CUDA Multi-Process Service） | 多租户共用一个 MPS server/pipe；`/gpu/mps/status` 暴露 client/pid/context | 同卡多租户 → 进程/上下文泄露、时间片侧信道 | `mps-context-shared` |
| 3 | GPU 残留（池化/共享 GPU） | 释放路径只回收分配记录，不清零显存/快照；`/gpu/residue` 仍返回他租户 marker | 后续租户 → 读前租户模型/激活/进程信息 | `gpu-tenant-residue`、`gpu-memory-residue-isolation` |
| 4 | HAMi / cGPU / OrionX | 池调度 admin API 无鉴权；租户过滤只在 UI；allocate/migrate 不校验归属 | 调度器 API 可达 → 占用/迁移他租户设备 | `hami-scheduler-auth-gap`、`cgpu-isolation-audit`、`gpu-pool-scheduler-unauth` |
| 5 | cache_salt（vLLM APC / 网关缓存） | `cache_salt` 未启用，`key_scope=global`；租户 B 同 prefix 无 salt 复用 | 同实例多租户 → `cached_tokens>0`、前缀成员推断 | `cache-salt-policy-audit`、`approx-cache-cross-tenant-chain` |
| 6 | EPP / DCGM 指标 | `/router/metrics` 的 `per_tenant` 含他租户 KV 利用率/命中率/前缀样本；DCGM 暴露进程名/namespace | 指标面可达 → 租户画像、缓存状态侧信道 | `router-cache-metrics-leak`、`gpu-metrics-tenant-leak` |

**检测方法**

先读分配生命周期：`/gpu/pools`、`/gpu/mig/profiles`、`/gpu/mps/status`、`/gpu/residue`。`gpu-pool-scheduler-unauth` 看 admin API 是否无鉴权、能否 allocate/migrate；`gpu-tenant-residue` 做 allocate → 写 benign marker → release → 读回，断言 marker/sha256 一致；`gpu-memory-residue-isolation` 是写类芯片模块，走备份校验；`mig-profile-mismatch` 对比 requested/active；`mps-context-shared` 看 client/pid 跨租户可见。cache_salt 用 `cache-salt-policy-audit` 做配置面 + 行为面双确认；指标用 `router-cache-metrics-leak`、`gpu-metrics-tenant-leak` 抓 `per_tenant`。证据是 marker 读回、sha256、profile 差分、context 列表与指标 JSON。

**修复建议**

MIG：profile 以设备实际值为准，已分配设备禁止在线重配，释放即销毁 instance。MPS：一租户一 server/pipe 或至少按租户隔离 context；指标按租户过滤。残留：释放路径清零显存/快照/临时卷，读回 404。池化：admin API mTLS + 租户作用域，allocate/migrate 校验 tenant/namespace/allocation_id。cache_salt：每租户独立 salt，键含 tenant，近似缓存先按租户过滤。指标：per-tenant 视图只给本租户，管理面单独鉴权。

**边界**

没有真实 nvidia-smi/NVML/MIG/MPS；池化与残留结论来自 `lab/gpu_cloud_sim.py` 的 HTTP 双态与 fixture，`gpu-memory-residue-isolation` 只写 benign marker；MIG/MPS 的真实硬件行为、清零语义与邻居干扰必须在授权实验室复核。cache_salt 与指标结论是 HTTP 语义同构，不代表真实 vLLM/SGLang 的键派生实现。

**本节引用条目**：`CGPU-ADV-2026-01`、`HAMI-ADV-2026-01`、`dradriver-process-go-exec-command-l94-regex`、`CVE-2024-0133`、`CVE-2025-23267`、`CVE-2026-15978`、`CVE-2026-92972`。根因、代码片段、危害与修复见附录 A 对应行；重点条目另见附录 B/C。

### 6.2 逐条攻击面与演示（6 条）

#### L6-001 · `CGPU-ADV-2026-01` · cGPU

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| cGPU | cGPU 各版本（隔离依赖驱动/运行时策略） | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；策略型 GPU 隔离边界（无独立 CVE） | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
绕过显存/算力配额或读取残留显存（策略面
无公开 CVE）
审计记录：厂商固件/运行时路径，无逐字上游源码
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:M / A:L / 训练:L / 租户:H / 合规:H（缓存/显存残留跨租户可读，命中率与时序还会泄露其他租户的请求模式）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`cgpu-isolation-audit` / `inkblade/modules/cgpu-isolation-audit/template.json`；池调度 admin 鉴权；释放清零；`lab/upstream_verify/cases/cgpu/CGPU-ADV-2026-01/result.json`

#### L6-002 · `CVE-2024-0132` · NVIDIA toolkit

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| NVIDIA toolkit | Toolkit <=1.16.1；GPU Operator <=24.6.1 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；TOCTOU 容器逃逸 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
TOCTOU 挂载宿主文件系统 → 代码执行/逃逸/信息泄露
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`nvidia-toolkit-escape-detect` / `inkblade/modules/nvidia-toolkit-escape-detect/template.json`；toolkit 升级；privileged 设备白名单；hook 路径校验；`lab/upstream_verify/cases/nvidia/CVE-2024-0132/result.json`

#### L6-003 · `CVE-2024-0133` · NVIDIA toolkit

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| NVIDIA toolkit | Toolkit <=1.16.1 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；容器镜像在宿主创建空文件 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
宿主文件系统空文件创建 → 数据篡改/DoS
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:L / I:L / A:H / 训练:H / 租户:M / 合规:M（资源耗尽或步时劣化直接打断训练/推理，但不必然泄露数据）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`nvidia-toolkit-escape-detect` / `inkblade/modules/nvidia-toolkit-escape-detect/template.json`；toolkit 升级；privileged 设备白名单；hook 路径校验；`lab/upstream_verify/cases/nvidia/CVE-2024-0133/result.json`

#### L6-004 · `CVE-2025-23266` · NVIDIA toolkit

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| NVIDIA toolkit | Toolkit <=1.17.7；GPU Operator <=25.3.0 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；NVIDIAScape hook 路径劫持提权 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
hook 搜索路径劫持 → 宿主 root 代码执行与逃逸
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`gpu-operator-driver-audit` / `inkblade/modules/gpu-operator-driver-audit/template.json`；toolkit 升级；privileged 设备白名单；hook 路径校验；`lab/upstream_verify/cases/nvidia/CVE-2025-23266/result.json`

#### L6-005 · `CVE-2025-23267` · NVIDIA toolkit

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| NVIDIA toolkit | Toolkit <=1.17.7 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；update-ldcache 链接跟随 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
符号链接跟随 → 宿主文件篡改/DoS
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:M / A:L / 训练:L / 租户:H / 合规:H（缓存/显存残留跨租户可读，命中率与时序还会泄露其他租户的请求模式）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`nvidia-toolkit-escape-detect` / `inkblade/modules/nvidia-toolkit-escape-detect/template.json`；toolkit 升级；privileged 设备白名单；hook 路径校验；`lab/upstream_verify/cases/nvidia/CVE-2025-23267/result.json`

#### L6-006 · `HAMI-ADV-2026-01` · HAMi

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| HAMi | 所有版本（v2.10 及更早；/filter /bind /webhook 无鉴权） | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；scheduler/device-plugin HTTP 面未认证 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
直接调用 /filter /bind 或伪造 vGPU 分配 → 跨租户 GPU 资源劫持/配额绕过
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`hami-scheduler-auth-gap` / `inkblade/modules/hami-scheduler-auth-gap/template.json`；scheduler API mTLS + 租户作用域；`lab/upstream_verify/cases/hami/HAMI-ADV-2026-01/result.json`


## 7. 供应链与身份层：加载即执行

**层是什么**：模型加载不是“读文件”，而是“执行仓库里的代码”：`trust_remote_code` 会 import 自定义 modeling 文件，未固定 revision 会把上游新提交带进下次调度，checkpoint 反序列化会把权重目录变成代码入口。身份侧同理：IRSA/Workload Identity 的 trust policy 一旦通配，任意 Pod 都能换成云角色；IMDS 只差一个请求就把节点凭据交出去。

**漏洞类别**

- `trust_remote_code`：默认/硬编码/从上层传播，模型仓库代码被当成本地代码执行。
- revision 漂移：`revision=None` 或浮动 tag，同一模型名下次调度可能指向新代码。
- 签名与证明 false trust：只看 JWT 存在、不绑 nonce、不校验 `dbgstat/secboot/overall-att-result`。
- SBOM / 固件：ML 镜像三层物料缺失，固件清单用 HMAC fixture 冒充厂商 PKI。
- IRSA / Workload Identity 通配：trust policy Principal `*`、缺少 ExternalId/OIDC subject 约束。
- IMDS / 凭据：IMDSv1、hop limit 2、安全组放行 169.254.169.254，Pod 内直接取云角色。

**代表漏洞**

| # | 组件 / 版本区间 | 根因锚点（file:line 或配置面） | 前置 → 影响 | 模板键 |
|---|---|---|---|---|
| 1 | transformers / vllm-omni / ms-swift / LLaMA-Factory | `transformers/dynamic_module_utils.py::get_class_from_dynamic_module`；`vllm-omni/api_server.py:654` 强制 True；`ModelLoader.default_trust_remote_code=True`；`webui/chatter.py:139,183,329` | 模型仓库可控 + 加载 → 仓库代码在服务进程执行 | `trust-remote-code-supply-chain`、`msswift-trust-remote-code` |
| 2 | revision pinning（多框架） | `revision=None`（`openjev/encoders.py:465-497`）；LLaMA-Factory/TRL loader 多处缺 revision | 上游分支/tag 漂移 → 下次调度执行新代码 | `supply-chain-pinning` |
| 3 | GPU CC / TEE 证明链 | 只验 JWT 存在、不绑 `eat_nonce`、不校验 `x-nvidia-overall-att-result`/`dbgstat`/`secboot` | 自称 CC 的 GPU → 密钥/模型交给不可信执行环境 | `gpu-cc-attestation-chain`、`confidential-containers-attestation`、`tpm-attestation-audit` |
| 4 | SBOM / 固件供应链 | 固件清单 HMAC fixture；ML 镜像缺框架/CUDA/模型三层物料；签名链未固定根 | 固件/镜像替换 → 节点看起来正常但引导链已变 | `hardware-supply-chain`、`firmware-signature-inventory` |
| 5 | IRSA / Workload Identity | trust policy `Principal: "*"`、无 `sts:ExternalId`、OIDC `sub`/`aud` 未限制 | 任意 Pod → 跨账户角色 → 权重桶 | `cloud-irsa-trust-wildcard`、`cloud-cross-tenant-role-assume` |
| 6 | IMDS（AWS/GCP/Azure/阿里/腾讯） | IMDSv1、hop limit 2、安全组 0.0.0.0/0、Pod 可直达 169.254.169.254 | Pod 内请求 → 节点角色凭据 → 云资源 | `ssrf-imds-credential`、`multi-cloud-imds-credentials`、`cloud-sg-imds-exposure` |
| 7 | Pod 内凭据（HF_TOKEN/云 key/SA token） | env/Secret 注入 HF_TOKEN、AWS_*、存储 key；SA token automount；镜像 pull secret 可读 | 已有 Pod → 私有模型仓库/权重桶直下 | `secret-scanner`、`cloud-token-harvest`、`supply-chain-credential-theft` |

**检测方法**

模型加载侧：`trust-remote-code-supply-chain` 读 import 轨迹与仓库/ revision；`supply-chain-pinning` 读 manifest 的 revision/commit；`model-watermark-backdoor-audit` 看权重/水印异常。证明侧：`gpu-cc-attestation-chain` 验 JWKS 签名、`eat_nonce`、`dbgstat`、`secboot`、`overall-att-result`；`confidential-containers-attestation` 看 CoCo/ Trustee 声明链；`tpm-attestation-audit` 看 PCR/dbx。身份侧：`cloud-irsa-trust-wildcard` 读 trust policy；`ssrf-imds-credential` 做出站可达性与凭据范围；`cloud-sg-imds-exposure` 读 SG/IMDS 配置。证据是导入模块、revision 对照、验签结果、trust policy 图、IMDS 响应与凭据 scope。

**修复建议**

`trust_remote_code` 默认 False，模型仓库固定 commit + 内容哈希，加载前做代码签名/白名单；revision 固定到 commit，升级走双人复核与回滚。CC：JWKS 固定源、nonce 一次性、claims 策略写死、失败 fail-closed。SBOM：镜像三层物料 + 固件厂商非对称签名 + 公钥指纹。IRSA：Principal 收敛到角色 ARN、强制 ExternalId/OIDC subject、角色权限最小化。IMDS：IMDSv2 + hop limit 1、Pod 出站拒绝链路本地、SA token 按需投影。凭据：env/Secret 最小化、HF_TOKEN 按租户、定期轮换。

**边界**

没有 NRAS 生产 JWT、没有真实 H100/H200/GB200 CC 设备、没有真实 BMC/固件 PKI；CC/固件结论只证明验签与 claims 逻辑，不证明设备可信。IRSA/IMDS 是契约级仿真，没有真实 STS/S3/IMDS 调用；`trust_remote_code` 的动态复现是函数级/服务级 marker，不是每个模型仓库的实测。revision 漂移结论是静态清单，不能替代客户实际 manifest。

**本节引用条目**：`transformers-dynamic-module-utils-py-dynamic-import-l248-ast`、`llamafactory-loader-py-missing-revision-l104-regex`、`trl-sft-py-trust-remote-code-propagated-l78-regex`、`msswift-loader-py-load-dataset-any-l59-regex`、`CVE-2025-32434`、`OPENBMC-BMCWEB-REDfish-HW`、`CVE-2024-37061`、`CVE-2025-23266`、`LITELLM-DEFAULT-KEY`。根因、代码片段、危害与修复见附录 A 对应行；重点条目另见附录 B/C。

### 7.1 逐条攻击面与演示（14 条）

#### L7-001 · `transformers-dynamic-module-utils-py-dynamic-import-l248-ast` · transformers

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| transformers | 4.57.1 | 模型仓库: dynamic_module_utils.py:248 | `transformers/dynamic_module_utils.py:248`；按仓库内容动态导入模块，代码来源未做签名与哈希校验 | trust_remote_code | 需本地（需模型仓库可控） | 服务进程 |

**根因片段**

```text
transformers/dynamic_module_utils.py:248
246:     for imp in imports:
247:         try:
248:             importlib.import_module(imp)
249:         except ImportError as exception:
250:             logger.warning(f"Encountered exception while importing {imp}: {exception}")
251:             # Some packages can fail with an ImportError because of a dependency issue.
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-transformers-dynamic-module-utils-py-dynamic-imp"
SPEC = {'id': 'transformers-dynamic-module-utils-py-dynamic-import-l248-ast', 'kind': 'import', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

import-time marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-transformers-dynamic-module-utils-py-dynamic-imp`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/transformers-dynamic-module-utils-py-dynamic-import-l248-ast/poc.py`；上游 pin: `transformers/dynamic_module_utils.py:248`

**清理**

`python demos/transformers-dynamic-module-utils-py-dynamic-import-l248-ast/poc.py --cleanup`；删除 `demos/.work/transformers-dynamic-module-utils-py-dynamic-import-l248-ast/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/transformers-dynamic-module-utils-py-dynamic-import-l248-ast/poc.py`（sha256 `2d400b04a64ead89db892462b6b6e0bf1785226b38c8a327c25bd3de0bda6492`）

- **检测/修复/证据**：`trust-remote-code-supply-chain` / `inkblade/modules/trust-remote-code-supply-chain/template.json`；默认关闭 trust_remote_code；模型仓库固定 commit + 签名；`lab/upstream_verify/cases/transformers/transformers-dynamic-module-utils-py-dynamic-import-l248-ast/result.json`

#### L7-002 · `transformers-dynamic-module-utils-py-dynamic-import-l248-regex` · transformers

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| transformers | 4.57.1 | 模型仓库: dynamic_module_utils.py:248 | `transformers/dynamic_module_utils.py:248`；按仓库内容动态导入模块，代码来源未做签名与哈希校验 | trust_remote_code | 需本地（需模型仓库可控） | 服务进程 |

**根因片段**

```text
transformers/dynamic_module_utils.py:248
246:     for imp in imports:
247:         try:
248:             importlib.import_module(imp)
249:         except ImportError as exception:
250:             logger.warning(f"Encountered exception while importing {imp}: {exception}")
251:             # Some packages can fail with an ImportError because of a dependency issue.
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-transformers-dynamic-module-utils-py-dynamic-imp"
SPEC = {'id': 'transformers-dynamic-module-utils-py-dynamic-import-l248-regex', 'kind': 'import', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

import-time marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-transformers-dynamic-module-utils-py-dynamic-imp`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/transformers-dynamic-module-utils-py-dynamic-import-l248-regex/poc.py`；上游 pin: `transformers/dynamic_module_utils.py:248`

**清理**

`python demos/transformers-dynamic-module-utils-py-dynamic-import-l248-regex/poc.py --cleanup`；删除 `demos/.work/transformers-dynamic-module-utils-py-dynamic-import-l248-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/transformers-dynamic-module-utils-py-dynamic-import-l248-regex/poc.py`（sha256 `7e8c004d72fc08bb711ac64e03aaf35e8f04738af6058c22cb1e1d009ba275c2`）

- **检测/修复/证据**：`trust-remote-code-supply-chain` / `inkblade/modules/trust-remote-code-supply-chain/template.json`；默认关闭 trust_remote_code；模型仓库固定 commit + 签名；`lab/upstream_verify/cases/transformers/transformers-dynamic-module-utils-py-dynamic-import-l248-regex/result.json`

#### L7-003 · `msswift-trust-remote-code` · ms-swift

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| ms-swift | 4.5.3 / fbc61cf | 模型仓库: ms-swift custom module | `swift/model/loader.py（入口/函数级，无行号）`；ms-swift default_trust_remote_code=True + WebUI/deploy fail-open -> malicious model RCE | trust_remote_code | 需本地（需模型仓库可控） | 服务进程 |

**根因片段**

```text
swift/model/loader.py（入口/函数级，无行号）
无逐字上游源码；按审计记录与配置面判定
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-msswift-trust-remote-code"
SPEC = {'id': 'msswift-trust-remote-code', 'kind': 'import', 'payload': 'INKBLADE-BENIGN-DEMO'}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

import-time marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-msswift-trust-remote-code`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/msswift-trust-remote-code/poc.py`；上游 pin: `n/a（advisory）`

**清理**

`python demos/msswift-trust-remote-code/poc.py --cleanup`；删除 `demos/.work/msswift-trust-remote-code/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：`demos/msswift-trust-remote-code/poc.py`（sha256 `0b54465f16d1d0ad4a92cd7f462ba6f27d97d2148a0924a15119a1d11c3ea86a`）

- **检测/修复/证据**：`msswift-trust-remote-code` / `inkblade/modules/msswift-trust-remote-code/template.json`；默认 trust_remote_code=False；模型 revision 固定；`projects/repro-2026-10/MSW-1-msswift-trust-remote-code/LATEST-RESULT.md`

#### L7-004 · `CVE-2026-4993` · W&B

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| W&B | OpenUI 0.0.0 - 1.0 | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；LITELLM_MASTER_KEY 硬编码凭据 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
Catalog metadata is inconsistent (LITELLM_MASTER_KEY under wandb); advisory-level triage only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:L / A:L / 训练:L / 租户:M / 合规:H（出站请求或凭据泄露把集群边界延伸到云 IAM 与对象存储）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`litellm-default-key-exfil` / `inkblade/modules/litellm-default-key-exfil/template.json`；移除默认 master key；首启生成；按租户发 key；`lab/upstream_verify/cases/wandb/CVE-2026-4993/result.json`

#### L7-005 · `LITELLM-DEFAULT-KEY` · LiteLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LiteLLM | LITELLM_MASTER_KEY 未设置或使用文档示例 sk-1234/sk-litellm-master-key | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；默认/未设置 master key（sk-1234） | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
Default/master-key misconfiguration is deployment-dependent; no upstream version boundary
static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`litellm-default-key-exfil` / `inkblade/modules/litellm-default-key-exfil/template.json`；移除默认 master key；首启生成；按租户发 key；`lab/upstream_verify/cases/litellm/LITELLM-DEFAULT-KEY/result.json`

#### L7-006 · `trl-data-utils-py-missing-revision-l352-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/data_utils.py:352` | `trl/data_utils.py:352`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/data_utils.py:352
350:     >>> from transformers import AutoTokenizer
351:
352:     >>> tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3-mini-128k-instruct")
353:     >>> example = {
354:     ...     "prompt": [{"role": "user", "content": "What color is the sky?"}],
355:     ...     "completion": [{"role": "assistant", "content": "It is blue."}],
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-data-utils-py-missing-revision-l352-regex/result.json`

#### L7-007 · `trl-sft-py-trust-remote-code-propagated-l78-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/scripts/sft.py:78` | `trl/scripts/sft.py:78`；trust_remote_code 从上层参数传播到模型加载，模型仓库代码被当成本地代码执行 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/scripts/sft.py:78
76:     model_init_kwargs = dict(
77:         revision=model_args.model_revision,
78:         trust_remote_code=training_args.trust_remote_code,
79:         attn_implementation=model_args.attn_implementation,
80:         dtype=model_args.dtype,
81:     )
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-sft-py-trust-remote-code-propagated-l78-regex/result.json`

#### L7-008 · `trl-sft-trainer-py-missing-revision-l310-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/trainer/sft_trainer.py:310` | `trl/trainer/sft_trainer.py:310`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/trainer/sft_trainer.py:310
308:     >>> from transformers import AutoProcessor
309:
310:     >>> processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-7B-Instruct")
311:     >>> collator = DataCollatorForVisionLanguageModeling(processor)
312:     >>> examples = [
313:     ...     {"images": [Image.open("image_0.png")], "messages": [{"role": "user", "content": "What is this?"}]},
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-sft-trainer-py-missing-revision-l310-regex/result.json`

#### L7-009 · `trl-sft-trainer-py-missing-revision-l714-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/trainer/sft_trainer.py:714` | `trl/trainer/sft_trainer.py:714`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/trainer/sft_trainer.py:714
713:         if processing_class is None:
714:             processing_class = AutoProcessor.from_pretrained(
715:                 get_config_model_id(model.config), revision=model_revision, trust_remote_code=args.trust_remote_code
716:             )
717:
718:         # Handle pad token for processors or tokenizers
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-sft-trainer-py-missing-revision-l714-regex/result.json`

#### L7-010 · `trl-sft-trainer-py-trust-remote-code-propagated-l715-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/trainer/sft_trainer.py:715` | `trl/trainer/sft_trainer.py:715`；trust_remote_code 从上层参数传播到模型加载，模型仓库代码被当成本地代码执行 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/trainer/sft_trainer.py:715
713:         if processing_class is None:
714:             processing_class = AutoProcessor.from_pretrained(
715:                 get_config_model_id(model.config), revision=model_revision, trust_remote_code=args.trust_remote_code
716:             )
717:
718:         # Handle pad token for processors or tokenizers
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-sft-trainer-py-trust-remote-code-propagated-l715-regex/result.json`

#### L7-011 · `trl-utils-py-missing-revision-l1354-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/trainer/utils.py:1354` | `trl/trainer/utils.py:1354`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/trainer/utils.py:1354
1352:     if architecture is None:
1353:         # Best effort to infer architecture from config, but we fall back to AutoModelForCausalLM if we can't find it
1354:         config = AutoConfig.from_pretrained(model_id, trust_remote_code=kwargs.get("trust_remote_code", False))
1355:         architecture = getattr(transformers, config.architectures[0], None)
1356:         if architecture is None:
1357:             # Remote-code checkpoint: the architecture name lives in the dynamic module, not in
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-utils-py-missing-revision-l1354-regex/result.json`

#### L7-012 · `trl-utils-py-missing-revision-l1366-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/trainer/utils.py:1366` | `trl/trainer/utils.py:1366`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/trainer/utils.py:1366
1364:             else:
1365:                 architecture = AutoModelForCausalLM
1366:     model = architecture.from_pretrained(model_id, **kwargs)
1367:     # transformers 5.3.0 skips tying remote-code tied embeddings, leaving them on meta (transformers#44469)
1368:     if Version(transformers.__version__) == Version("5.3.0"):
1369:         model.tie_weights()
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-utils-py-missing-revision-l1366-regex/result.json`

#### L7-013 · `trl-utils-py-missing-revision-l1431-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/trainer/utils.py:1431` | `trl/trainer/utils.py:1431`；模型加载未固定 revision，上游分支漂移会把新代码带进下次调度 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/trainer/utils.py:1431
1429:     >>> import torch
1430:
1431:     >>> model = AutoPeftModelForCausalLM.from_pretrained("path/to/model")
1432:     >>> input_ids = torch.tensor([[1, 2, 3]])
1433:     >>> with use_adapter(model, "adapter_name"):
1434:     ...     outputs = model(input_ids)
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-utils-py-missing-revision-l1431-regex/result.json`

#### L7-014 · `trl-utils-py-trust-remote-code-propagated-l1354-regex` · TRL

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| TRL | v1.16.0 | 配置面/CLI: `trl/trainer/utils.py:1354` | `trl/trainer/utils.py:1354`；trust_remote_code 从上层参数传播到模型加载，模型仓库代码被当成本地代码执行 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
trl/trainer/utils.py:1354
1352:     if architecture is None:
1353:         # Best effort to infer architecture from config, but we fall back to AutoModelForCausalLM if we can't find it
1354:         config = AutoConfig.from_pretrained(model_id, trust_remote_code=kwargs.get("trust_remote_code", False))
1355:         architecture = getattr(transformers, config.architectures[0], None)
1356:         if architecture is None:
1357:             # Remote-code checkpoint: the architecture name lives in the dynamic module, not in
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:M / 合规:H（模型仓库或 checkpoint 是代码供应链的一部分，加载即执行且难以追溯）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`trl-serve-dev-mode` / `inkblade/modules/trl-serve-dev-mode/template.json`；vllm-serve 默认回环 + key；dev-mode 显式；revision 固定；`lab/upstream_verify/cases/trl/trl-utils-py-trust-remote-code-propagated-l1354-regex/result.json`


## 8. 缓存安全层：命中就是泄露

**层是什么**：推理缓存把“相同前缀”当成“相同计算”，命中就跳过 prefill。多租户共享实例时，缓存键如果不含 tenant/salt，租户 B 的相同前缀就会命中租户 A 的条目；近似/语义缓存更宽，相似度阈值内直接返回他租户响应。逐出只释放索引，不保证清零；远程 KV 池、PD 通道、EPP 指标与 TTFT 时序把缓存状态变成可观测侧信道。

### 8.1 名词与架构前置：缓存：命中、复用与残留

推理缓存把“相同前缀”当成“相同计算”：命中就跳过 prefill，直接复用 KV。收益来自复用，风险也来自复用——缓存键一旦不含租户/盐，命中就等价于跨租户读状态。

**类比**：像共享自习室的储物柜：柜号只按书包花色算，不看是谁的卡；同花色书包就能开同一个柜。

```text
client A ──prefix P──> [ gateway ] ──key=hash(P)+tenant+salt──> [ cache index ]
                                                             │ hit
                                                             ▼
                                              [ KV blocks / response ] ──> A
client B ──prefix P──> [ gateway ] ──key=hash(P)──────────────┘
                                                             │ miss? 否：命中 A 的块
                                                             ▼
                                              [ 读到 A 的 KV / 响应 / 残留 ]
```

**术语速查（14 条）**

| 术语 | 白话解释 |
|---|---|
| KV cache | 推理时缓存的 key/value 张量；每个 token 一层，序列越长占用越大，是缓存泄露的载体。 |
| prefix cache | 按 token 前缀哈希复用 KV 的机制；命中跳过 prefill，键的隔离强度决定租户边界。 |
| radix tree | SGLang RadixAttention 用的前缀树；共享节点省显存，但树命中统计会暴露“谁来过”。 |
| PagedAttention | 把 KV 切成固定大小 block、按页表映射的显存管理法；块 ID 可枚举时也是越权入口。 |
| semantic cache | 按语义相似度而非精确 token 命中；阈值越宽，越容易把别人的答案当成自己的。 |
| approximate cache | 近似缓存/向量检索缓存的统称；先检索后按租户过滤的顺序错了就会跨租户。 |
| cache key | 缓存条目的身份；正确形式是 hash(prefix)+tenant+salt，缺一项都不是租户隔离。 |
| cache salt | 请求级盐，参与缓存键派生；服务端强制才有效，请求可选就等于可关闭。 |
| TTL | 条目存活时间；TTL 太长放大残留窗口，太短降低命中率，安全与成本在这里拉扯。 |
| eviction | 逐出策略（LRU/LFU/容量压力）；只释放索引不清零，块仍可能被下一个租户读到。 |
| hit / miss | 命中/未命中；命中差异会同时改变 TTFT、计费、日志与可观测指标。 |
| TTFT | Time To First Token；命中通常显著下降，因此时延差可以反推前缀成员关系。 |
| remote KV pool | Mooncake/LMCache 风格的跨实例 KV 池；块 ID、命名空间、后端 ACL 三者共同构成边界。 |
| PD KV transfer | Prefill 节点把 KV 块传给 Decode 节点的通道；NIXL/RDMA 常缺 mTLS 与块归属校验。 |

**前置知识 × 危害细化**

| 漏洞 | 前置知识（要懂什么） | 危害细化（训练/推理/合规） | 正文 |
|---|---|---|---|
| 跨租户前缀命中 | 懂 prefix cache 键派生与 cached_tokens 语义 | KV/响应泄露、成员推断、计费污染 | 第 8 层逐条 |
| 近似缓存误命中 | 懂向量相似度阈值与租户过滤顺序 | 商业数据/系统提示泄露、错误归因 | 第 8 层逐条 |
| 逐出残留 | 懂 LRU 索引与显存清零的差别 | 前租户模型/激活残留、持久化投毒 | 第 8 层逐条 |
| 远程 KV 池越权 | 懂块 ID、命名空间与后端 ACL | 跨租户 KV 读写、推理操纵 | 第 8 层逐条 |
| TTFT 侧信道 | 懂命中/未命中时延分布与统计功效 | 前缀字典提取、成员确认、隐蔽侦察 | 第 8 层逐条 |


**漏洞类别**

- 跨租户前缀缓存：键只取 token 哈希，缺 tenant/salt；`cached_tokens` 与响应内容泄露。
- 近似/语义缓存误命中：相似度阈值按命中率调，不按租户过滤；`matched.tenant` 直接指向受害者。
- cache_salt 策略：salt 可选、key_scope=global，整个租户隔断只剩一个配置项。
- 逐出残留：LRU 逐出释放索引，块仍可读；洪泛后 `/cache/residue` 返回他租户 marker。
- 远程 KV 池 / PD 通道：Mooncake/LMCache/NIXL 块 ID 可猜、命名空间不校验、通道无 mTLS。
- EPP 指标 / TTFT 时序：per-tenant 命中率、前缀样本、首 token 时延差可做成员推断与字典提取。

**代表漏洞**

| # | 组件 / 版本区间 | 根因锚点（file:line 或配置面） | 前置 → 影响 | 模板键 |
|---|---|---|---|---|
| 1 | vLLM APC / SGLang RadixAttention（多租户共享实例） | 缓存键仅 token 内容哈希；`cache_salt` 可选；Radix tree 跨租户共享 | 同实例多租户 → 同 prefix 命中、`cached_tokens>0` | `prefix-cache-cross-tenant-leak`、`long-context-cache-leak` |
| 2 | GPTCache 风格近似/语义缓存 | 相似度阈值（如 0.85）内的条目直接返回；检索未先按 tenant 过滤 | 同前缀/近义请求 → 读回他租户响应与 marker | `similarity-cache-false-hit`、`approx-cache-cross-tenant-chain` |
| 3 | cache_salt（vLLM / 网关） | `cache_salt_policy.enabled=false`、`key_scope=global`；请求可不带 salt | 配置面可达 → 关闭/绕过 salt，跨租户复用 | `cache-salt-policy-audit` |
| 4 | 逐出与残留（prefix cache + KV 池） | LRU 逐出只释放索引；块内存/对象未 zeroize；`/cache/residue` 无租户校验 | 洪泛触发逐出 → 读回前租户块 | `cache-eviction-residue`、`kv-cache-integrity-poison` |
| 5 | 远程 KV 池（Mooncake/LMCache 风格） | 块 ID 可猜；命名空间只按字符串前缀；读接口不校验 requester | 池端点可达 → 读他租户块、pinned 持久化 | `remote-kv-pool-isolation`、`cache-poison-persistence` |
| 6 | PD KV 通道（llm-d/vLLM PD + NIXL） | KV transfer 无 mTLS/token；block ID 可枚举；写不校验归属 | prefill/decode 网络可达 → KV 读/写、推理操纵 | `prefill-decode-kv-channel-unauth`、`pd-kv-poison`（链） |
| 7 | EPP / 路由器指标 | `/router/metrics` 的 `per_tenant` 含 KV 利用率、命中率、独立前缀数、前缀样本 | 指标面可达 → 缓存状态侧信道、前缀字典收敛 | `router-cache-metrics-leak`、`cache-sidechannel-chain`（链） |
| 8 | TTFT 时序（vLLM prefix cache） | 命中与未命中的首 token 时延差；采样不足时容易被负载噪声淹没 | 同 token 数/同 batch 交替请求 → 成员推断/前缀长度 | `cache-timing-sidechannel`、`vllm-timing-oracle` |

**检测方法**

配置面 + 行为面双确认：`cache-salt-policy-audit` 先读 `/config` 的 salt 策略，再用租户 B 同 prefix 看 `usage.cached_tokens`；`similarity-cache-false-hit` 做正对照 + 单 token 变异，要求 `matched.tenant != requester` 且 marker 出现在响应；`cache-eviction-residue` 先洪泛看 `evictions_delta`，再读 `/cache/residue`；`remote-kv-pool-isolation` 做本租户对照 + 受害块读，403 与 200 都要有；`prefill-decode-kv-channel-unauth` 做读握手 + 池计数器；`router-cache-metrics-leak` 抓 `per_tenant`。TTFT 判定：同 token 数、同 batch、交替发送，每组至少 30 样本；p95 差异超过噪声带且与缓存命中计数相关才报，否则是负载噪声。

**修复建议**

缓存键 = `hash(prefix) + tenant + cache_salt`，salt 由服务端强制而非请求可选；近似/语义缓存先按 tenant 过滤再做相似度排序；逐出即 zeroize，`/cache/residue` 只返回本租户或 404；远程 KV 池按租户命名空间 + 块归属校验，读接口鉴权；PD 通道 mTLS + 每租户 token + 块 ID 不可枚举；EPP 指标按租户过滤，管理面单独鉴权；TTFT 监控加噪声带与命中计数关联，不把单次抖动当发现。

**边界**

缓存结论来自 `lab/cache_sim.py` 的本机真实 HTTP 双态，TTFT 是确定性仿真计时（命中 22–31ms / 未命中 185–274ms），不是 GPU 实测；远程 KV 池按 Mooncake/LMCache 的“块存储 + 传输”抽象建模，不绑定具体 RPC；不声称对真实 vLLM/SGLang/GPTCache/Mooncake 生产实例的未授权利用。真实环境需按机型/负载重新标定 `min_effect_ms` 与 `alpha`。

**本节引用条目**：`CVE-2025-32444`、`CVE-2025-47277`、`CVE-2025-29783`、`CVE-2025-59425`、`CVE-2026-15978`、`CVE-2026-92972`、`CVE-2026-3060`、`CVE-2025-23267`。根因、代码片段、危害与修复见附录 A 对应行；重点条目另见附录 B/C。

### 8.2 逐条攻击面与演示（2 条）

#### L8-001 · `CVE-2025-59425` · vLLM

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| vLLM | < 0.11.0rc2 | 配置面/CLI: `vllm/v0.8.4/vllm/entrypoints/openai/api_server.py:848` | `vllm/v0.8.4/vllm/entrypoints/openai/api_server.py:848`；API key 校验时序侧信道 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
vllm/v0.8.4/vllm/entrypoints/openai/api_server.py:848
846:             if not url_path.startswith("/v1"):
847:                 return await call_next(request)
848:             if request.headers.get("Authorization") != "Bearer " + token:
849:                 return JSONResponse(content={"error": "Unauthorized"},
850:                                     status_code=401)
851:             return await call_next(request)
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`vllm-timing-oracle` / `inkblade/modules/vllm-timing-oracle/template.json`；cache key 加 tenant/salt；TTFT 监控加噪声带；限制 logprobs/echo；`lab/upstream_verify/cases/vllm/CVE-2025-59425/result.json`

#### L8-002 · `CVE-2026-15978` · SGLang

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| SGLang | <= 0.5.15 | 配置面/CLI: `sglang/v0.5.10/python/sglang/srt/entrypoints/http_server.py:225` | `sglang/v0.5.10/python/sglang/srt/entrypoints/http_server.py:225`；无 API key 时模型权重外泄 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
sglang/v0.5.10/python/sglang/srt/entrypoints/http_server.py:225
223:     # API key authentication is not supported in multi-tokenizer mode
224:     assert (
225:         server_args.api_key is None
226:     ), "API key is not supported in multi-tokenizer mode"
227:
228:     # Create a new ipc name for the current process
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`sglang-weight-exfil` / `inkblade/modules/sglang-weight-exfil/template.json`；权重导出鉴权；权重目录只读；路径前缀白名单；`lab/upstream_verify/cases/sglang/CVE-2026-15978/result.json`


## 9. 跨组合层：单看都合规

**层是什么**：组合层的规则只有一条：两个组件同时成立才算问题的，只报一次，报在组合上；不拆成两条低危重复项。单看 vLLM 插件路由、SGLang 权重同步、KubeRay RBAC、共享 PVC、Multus 网卡，每一件都可能是“设计如此”；凑在一起才出现“绕过鉴权 + 写权重”“宽 RBAC + 无鉴权控制面”“策略旁路 + 直接内存访问”。

**漏洞类别**

- 鉴权组合：插件路由 × 网关、PD leader 路由 × LWS、InferencePool fail-open × 租户基线缺失。
- 权限组合：KubeRay/LWS/vLLM operator 宽 RBAC × 训练 actor 控制面。
- 数据组合：共享 PVC/HF 缓存 × 模型加载、SGLang 权重同步 × slime 补丁。
- 网络组合：Multus/SR-IOV/RDMA × NetworkPolicy、VPC-CNI × 安全组、IB 平网 × NCCL。
- 硬件组合：GB200 NVL72 × DRA/IMEX、GPU 池化 × MIG 残留、硬件路线 × 特权姿态。
- 缓存组合：长上下文 × 前缀缓存、PD 分离 × NIXL、TTFT × EPP 指标。

**代表漏洞**

| # | 组合签名 | 为何只有组合成立 | 模块键 | 附录条目 |
|---|---|---|---|---|
| 1 | vLLM + vllm-jev | 插件路由单看没问题；与网关同网时绕过 API key | `vllm-plugin-auth-bypass` | `CVE-2025-32444`、`CVE-2025-47277` |
| 2 | SGLang + slime pull_weights | 补丁栈把权重同步变成无鉴权写，跨租户落盘 | `slime-weight-pull-poison` | `CVE-2026-15978`、`CVE-2026-92972` |
| 3 | SGLang + LWS PD | leader 路由 + PD KV 通道叠加成推理操纵；LWS 集群级 Secrets 放大横向 | `lws-secrets-lateral`、`inference-gateway-pd` | `LWS-ADV-2026-01`、`CVE-2026-92972` |
| 4 | verl/SkyRL + KubeRay | 训练 actor 与 Ray dashboard 共享扁平网络；dashboard 可提交 Job | `kuberay-operator-escalation`、`ray-dashboard-job` | `CVE-2023-48022`、`KUBERAY-ADV-2026-01` |
| 5 | vLLM + production-stack operator | operator RBAC 放大 vLLM 面；enablePD 另开 hostPID/hostIPC | `vllm-operator-rbac-escalation` | `CVE-2025-23266`、`CVE-2024-0132` |
| 6 | AReaL/SGLang + NCCL/RDMA | 控制面可达 + 集合通信默认信任 → 梯度/权重注入 | `areal-awex-nccl-injection`、`nccl-collective-join` | `CVE-2025-47277`、`NCCL-NCCLPLUGIN-HW` |
| 7 | 共享 PVC + HF 缓存 | 缓存可写 + 模型加载被信任 → 一人投毒、全集群中招 | `shared-volume-weight-copy`、`trust-remote-code-supply-chain` | `CVE-2025-32434`、`transformers-dynamic-module-utils-py-dynamic-import-l248-ast` |
| 8 | 硬件路线 + 特权姿态 | 文档生成器按硬件自动 emit privileged/seccomp off，单点污染全站 | `privileged-gpu-pod-escape`、`privileged-workloads` | `CVE-2024-0132`、`CVE-2025-23266` |
| 9 | Multus + SR-IOV + RDMA | 策略旁路 + 直接内存访问；NetworkPolicy 不覆盖第二张网卡 | `multus-sriov-rdma-bypass`、`network-policy-coverage` | `CVE-2025-23267`、`CVE-2024-0133` |
| 10 | IB 平网无 Partition | 无 Partition + NCCL 无认证 → 加入/窃听/注入 | `fabric-topology-isolation`、`nccl-collective-join` | `NCCL-NCCLPLUGIN-HW`、`UCX-UCT-HW` |
| 11 | GB200 + DRA/IMEX | 新硬件默认开内存共享；DRA claim 不带租户策略 | `fabric-topology-isolation`、`gpu-network-operator-posture` | `CVE-2024-0132`、`dradriver-process-go-exec-command-l94-regex` |
| 12 | llm-d/vLLM PD + NIXL | KV 传输库跨信任域暴露；块 ID 可枚举 | `inference-gateway-pd`、`remote-kv-pool-isolation` | `CVE-2026-3060`、`CVE-2025-47277` |
| 13 | EKS VPC-CNI + 安全组 | VPC 路由/安全组与 K8s 策略两套控制面，一次漂移 | `cni-stack-capability`、`cloud-integration-fingerprint` | `CVE-2025-33180`、`GHSA-h26v-922j-28cg` |
| 14 | InferencePool fail-open | 网关 fail-open + 租户基线缺失 → 故障域放大到所有租户 | `inference-gateway-pd`、`inference-tenant-isolation-baseline` | `CVE-2026-92972`、`CVE-2026-15978` |

**检测方法**

组合检测不是“多跑几个模板”，而是先做组件指纹，再查签名表：`inkblade/core/data/combo-matrix.json` 定义 14 条签名，每条要求 components 全部命中才产出组合发现；命中后 runner 把被解释的组件级 finding 折叠进组合，避免重复计数。证据必须能分成两段：组件 A 的面（路由/RBAC/挂载）+ 组件 B 的行为（写后读回/鉴权差分/通道可达）。只有一段证据时，退回组件级报告。

**修复建议**

组合修复优先拆信任链：插件路由纳入 API key 守卫；PD leader 路由加 mTLS + 租户；KubeRay/LWS/vLLM operator 收窄 RBAC；共享 PVC 按租户前缀 + 只读；Multus 第二张网卡纳入策略；IB 加 Partition；InferencePool 改 FailClosed + 租户基线。不要用“再加一个 WAF”掩盖组合根因。

**边界**

14 条签名是当前声明，不代表所有组合都已动态复现；组合矩阵的 components 指纹来自配置/清单，不是运行时依赖图。部分组合（GB200 + DRA/IMEX、Multus + SR-IOV + RDMA）只有配置/仿真证据，没有真实硬件；组合不成立时，组件级发现仍独立成立，不能被“组合未命中”吞掉。

**本节引用条目**：`CVE-2023-48022`、`KUBERAY-ADV-2026-01`、`LWS-ADV-2026-01`、`CVE-2026-92972`、`CVE-2025-32444`、`CVE-2026-3059`、`CVE-2026-40217`、`CVE-2025-3466`、`CVE-2024-0520`、`CVE-2013-4786`。根因、代码片段、危害与修复见附录 A 对应行；重点条目另见附录 B/C。

### 9.1 逐条攻击面与演示（5 条）

#### L9-001 · `KUBERAY-ADV-2026-01` · KubeRay

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| KubeRay | 所有 KubeRay 版本（底层 Ray<2.52 或未启用 token） | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；KubeRay 管理的 Ray 集群暴露 Dashboard 未授权面 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
KubeRay-managed Ray exposure is a deployment pattern
not a single upstream sink; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`ray-job-marker-rce` / `inkblade/modules/ray-job-marker-rce/template.json`；ClusterRole 收窄到 namespace；去掉 roles/rolebindings/secrets 集群级写；dashboard 鉴权；`lab/upstream_verify/cases/kuberay/KUBERAY-ADV-2026-01/result.json`

#### L9-002 · `LWS-ADV-2026-01` · LWS

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| LWS | 所有 LWS 版本（依赖 CRD 模板与网络策略） | 配置面/CLI: `advisory（上游安全文档，无源码行）` | `advisory（上游安全文档，无源码行）`；LWS leader/worker 拓扑信任与地址注入面 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
advisory（上游安全文档，无源码行）
LWS leader/worker address trust is a topology/CRD issue; static-only.
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — pinned upstream source or advisory is available

**攻击效果**

N/A（pinned upstream source or advisory is available）

**复现环境**

static：pinned upstream source or advisory is available

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — pinned upstream source or advisory is available

- **检测/修复/证据**：`lws-leader-endpoint-audit` / `inkblade/modules/lws-leader-endpoint-audit/template.json`；secrets 读收窄；webhook automount=false；leader 端点鉴权；`lab/upstream_verify/cases/lws/LWS-ADV-2026-01/result.json`

#### L9-003 · `dradriver-process-go-exec-command-l94-regex` · DRA driver

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| DRA driver | v0.5.1 | 配置面/CLI: `cmd/compute-domain-daemon/process.go:94` | `cmd/compute-domain-daemon/process.go:94`；以请求可控参数拼接 exec.Command，缺少参数化与白名单 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
cmd/compute-domain-daemon/process.go:94
92:     // parent. In practice, individual log lines typically stay intact (data
93:     // written in one write() syscall typically is written as an atomic unit).
94:     cmd := exec.Command(m.cmd[0], m.cmd[1:]...)
95:     cmd.Stdout = os.Stdout
96:     cmd.Stderr = os.Stderr
97:     err := cmd.Start()
```

**攻击代码**

N/A — write access to the compute-domain daemon ConfigMap / plugin config

**攻击效果**

N/A（write access to the compute-domain daemon ConfigMap / plugin config）

**复现环境**

static：write access to the compute-domain daemon ConfigMap / plugin config

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — write access to the compute-domain daemon ConfigMap / plugin config

- **检测/修复/证据**：`gpu-dra-mig-policy` / `inkblade/modules/gpu-dra-mig-policy/template.json`；compute-domain daemon 命令白名单；DRA claim 租户策略；设备独占；`lab/upstream_verify/cases/dradriver/dradriver-process-go-exec-command-l94-regex/result.json`

#### L9-004 · `gpuoperator-0500-daemonset-yaml-elevated-pod-spec-l108-regex` · GPU Operator

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| GPU Operator | v26.7.2 | 配置面/CLI: `manifests/state-driver/0500_daemonset.yaml:108` | `manifests/state-driver/0500_daemonset.yaml:108`；DaemonSet/Pod 以特权、hostPath 或 hostPID 运行，节点边界被抹平 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
manifests/state-driver/0500_daemonset.yaml:108
106:       hostPID: true
107:       {{- if and .Driver.Spec.HostNetwork (deref .Driver.Spec.HostNetwork) }}
108:       hostNetwork: true
109:       dnsPolicy: ClusterFirstWithHostNet
110:       {{- end }}
111:       {{- if .Driver.Spec.PodSecurityContext }}
```

**攻击代码**

N/A — GPU operator deployed with driver DaemonSet

**攻击效果**

N/A（GPU operator deployed with driver DaemonSet）

**复现环境**

static：GPU operator deployed with driver DaemonSet

**清理**

无写入；不需要清理

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：N/A — GPU operator deployed with driver DaemonSet

- **检测/修复/证据**：`gpu-operator-driver-audit` / `inkblade/modules/gpu-operator-driver-audit/template.json`；driver DaemonSet 去 privileged/hostNetwork；hostPath 只读白名单；PodSecurity restricted；`lab/upstream_verify/cases/gpuoperator/gpuoperator-0500-daemonset-yaml-elevated-pod-spec-l108-regex/result.json`

#### L9-005 · `gpuoperator-main-go-exec-command-l669-regex` · GPU Operator

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| GPU Operator | v26.7.2 | 配置面/CLI: `cmd/nvidia-validator/main.go:669` | `cmd/nvidia-validator/main.go:669`；以请求可控参数拼接 exec.Command，缺少参数化与白名单 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
cmd/nvidia-validator/main.go:669
667:
668: func runCommand(command string, args []string, silent bool) error {
669:     cmd := exec.Command(command, args...)
670:     if !silent {
671:         cmd.Stdout = os.Stdout
672:         cmd.Stderr = os.Stderr
```

**攻击代码**

N/A — validator pod compromised or validator spec command injection

**攻击效果**

N/A（validator pod compromised or validator spec command injection）

**复现环境**

static：validator pod compromised or validator spec command injection

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — validator pod compromised or validator spec command injection

- **检测/修复/证据**：`gpu-operator-driver-audit` / `inkblade/modules/gpu-operator-driver-audit/template.json`；driver DaemonSet 去 privileged/hostNetwork；hostPath 只读白名单；PodSecurity restricted；`lab/upstream_verify/cases/gpuoperator/gpuoperator-main-go-exec-command-l669-regex/result.json`


## 10. 防护绕过层：看得见与看不见

**层是什么**：第十层不是“再找一个漏洞”，而是回答“防守方到底看见了什么”。同样一个 benign marker，在 Kyverno 的 enforce 命名空间会被拒，在豁免命名空间会被放行；Falco 能看见改名执行，却可能看不见 `/tmp` 写入；Trivy 能扫出 CVE，却看不见改名工具、深层删除、压缩样本。防护产品的“已部署”不等于“已覆盖”，更不等于“能挡住”。

**漏洞类别**

- 准入策略：Kyverno/Gatekeeper 的豁免命名空间、Audit 模式、注解绕过、mutation 顺序、子资源缺口。
- 运行时：Falco/Tetragon/KubeArmor 的 driver 未加载、策略未挂载命名空间、hostNetwork、短生命周期进程、改名执行。
- 镜像扫描：Trivy/veinmind 的分层覆盖、改名工具、压缩样本、白名单样本名、内容/哈希识别缺失。
- 主机代理：Elkeid/AgentSmith/Wazuh 的内核头缺失、agent 离线、规则集缺口、改名执行。
- WAF：ModSecurity/Coraza/雷池的编码、分块、Unicode、超长请求归一化差异。
- 网络可视化：Hubble/Calico 对 hostNetwork、多网卡、短生命周期流的采样缺口。

**代表漏洞**

| 产品 | 模块 | 部署/版本 | 检出 | 盲区/绕过 | 硬化 |
|---|---|---|---|---|---|
| Kyverno | `defense-bypass-admission` | v1.19.2，ValidatingPolicy + CEL，Deny | 3 次拒绝：privileged、hostPath、automount | `default` 命名空间的 privileged Pod 被放行（策略只匹配 `defense-lab`） | 策略覆盖全部命名空间；Audit 仅限过渡期；清理绕过注解；审计 mutation 顺序与子资源 |
| Gatekeeper | `defense-bypass-admission` | 未单独部署（与 Kyverno 同族评估） | — | 未验证 ConstraintTemplate/Constraint 的豁免与 dryrun | 单独部署后重放同一组 probe；检查 constraint 的 match/exclude |
| Falco | `defense-bypass-falco` | 0.45.1，modern_ebpf，DaemonSet 1/1 | 1 次：改名执行（Executing binary not part of base image） | `/tmp`、`/bin`、`/etc` marker 写入无告警；0.45.1 自带规则无 `Write below etc`/`Write below binary dir` | 补写路径规则；ephemeral 宏；driver 健康检查；改名执行启发式 |
| Tetragon | `defense-bypass-tetragon` | N/A：内核 LSM 无 `bpf` | — | BPF-LSM 不可用，TracingPolicy 无法 enforce | 换带 BPF-LSM 的内核；策略覆盖 hostNetwork/短生命周期 |
| KubeArmor | `defense-bypass-kubearmor` | N/A：无 BPF-LSM/AppArmor | — | 无 LSM，posture 无法落地 | 内核启用 LSM；默认兜底策略；未打 posture 注解视为 block |
| Trivy | `defense-bypass-imagescan` | 0.76.1，vuln+secret，DB 1.5GB | 0 个 benign 样本；对照 `alpine:3.10` 检出 1 CRITICAL | 普通 marker、改名 busybox、深层删除 secret、tar.gz 内 secret 全部 0 finding | 全层解析；内容/哈希识别改名；压缩递归；收窄排除清单 |
| veinmind | `defense-bypass-veinmind` | N/A：镜像未拉取 | — | 无扫描结果，不能把 fixture 当实测 | 拉取镜像；补分层/压缩样本；与 Trivy 交叉验证 |
| Elkeid | `defense-bypass-elkeid` | N/A：无内核头，`elkeid.ko` 无法构建 | — | 无 manager/agent，规则集无法验证 | 提供内核构建树；manager + agent 一起部署；补 ephemeral 事件 |
| AgentSmith-HIDS | `defense-bypass-agentsmith` | N/A：无 `smith.ko`、无内核头 | — | LKM 未加载，file-create/execve/DNS hook 无法验证 | 内核头 + LKM；file-create kprobe 入规则链；改名执行启发式 |
| Wazuh / osquery | `defense-bypass-hostagent` | N/A：manager/indexer 对 6GB TCG 过重 | — | agent-only 无法验证告警；规则集覆盖未知 | 独立节点跑 manager；监控 `/tmp`、`/dev/shm`；离线即告警 |
| ModSecurity + CRS | `defense-bypass-waf-inference` | CRS 4.30.0，PL1，nginx 1.30.6 | 7 次拦截：URL 编码、双编码、Unicode、大小写、SQLi、chunked、超长（414） | 明文 benign 请求按设计放行；未测 PL2+ 与审计日志 | 解码后再匹配；反分块缓冲；Unicode 规范化；超长直接拒绝 |
| Cilium Hubble / Calico | `defense-bypass-netobserv` | N/A：k3s CNI 是 flannel | — | hostNetwork/多网卡/短流未验证；换 CNI 需重启 | 换 Cilium/Calico；hostNetwork 纳入采集；SR-IOV/RDMA 接口纳入；缩短采样窗口 |

**检测方法**

每个 `defense-bypass-*` 模块固定输出三类结果：detected（哪些技术类别被现有规则看见）、blindspots（动态验证中没有告警的类别及原因）、hardening（可直接落地的规则/配置）。评估分三态：deployed（已部署）、degraded（driver/策略降级）、absent（未部署）；只有 deployed 才能把“没告警”解释为“看不见”，absent 只能记 N/A。证据是产品日志、探针 transcript、命中/未命中矩阵与规则文件版本。

**修复建议**

准入：策略覆盖全部命名空间，Audit 仅限过渡期，清理绕过注解，审计 mutation 顺序与子资源。运行时：driver 健康检查、ephemeral 宏、hostNetwork 策略、改名执行启发式。镜像：全层解析、内容/哈希识别、压缩递归、收窄排除。主机：manager 独立部署、离线即告警、监控 `/tmp`/`/dev/shm`。WAF：解码/反分块/Unicode 规范化/超长拒绝。网络：hostNetwork 与多网卡纳入采集。规则包输出到 Kyverno/Gatekeeper、Sigma/Falco、Suricata/WAF。

**边界**

Defense Lab 是 QEMU TCG 单节点 k3s（6 vCPU/6GB），不是生产规模；4 个产品实机、7 个 N/A，N/A 都有明确原因，不用仿真结果代替。盲区结论只对被测版本/配置成立，不能外推为“该产品可被绕过”。11/11 是 triaged，不是 11 个产品都验证；21 次探针、11 检出、8 绕过、2 对照是当前样本的计数。实验期间 k3s kine/sqlite 在 Trivy DB 下载时崩溃，说明这台 VM 只能承载两个控制面产品 + CLI/容器工具，不是全栈实验室。

**本节引用条目**：`CVE-2026-3059`、`CVE-2025-32434`、`CVE-2024-0520`、`CVE-2023-48022`、`LITELLM-DEFAULT-KEY`、`CVE-2026-40217`、`CVE-2026-28788`、`CVE-2025-33180`。根因、代码片段、危害与修复见附录 A 对应行；重点条目另见附录 B/C。

### 10.1 逐条攻击面与演示（6 条）

#### L10-001 · `cephcsi-httpserver-go-pprof-exposed-l37-regex` · Ceph CSI

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Ceph CSI | v3.18.1 | GET /debug/pprof/cmdline (9100/tcp) | `internal/util/httpserver.go:37`；pprof-exposed-go 在外部可控输入上缺少边界校验或鉴权 | n/a | 无 | ClusterIP/宿主 |

**根因片段**

```text
internal/util/httpserver.go:37
34:
35: func addPath(name string, handler http.Handler) {
36:     http.Handle(name, handler)
37:     log.DebugLogMsg("DEBUG: registered profiling handler on /debug/pprof/%s\n", name)
38: }
39:
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-cephcsi-httpserver-go-pprof-exposed-l37-regex"
SPEC = {'id': 'cephcsi-httpserver-go-pprof-exposed-l37-regex', 'kind': 'pprof', 'method': 'GET', 'route': '/debug/pprof/cmdline', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'cephcsi-httpserver-go-pprof-exposed-l37-regex'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + profile marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-cephcsi-httpserver-go-pprof-exposed-l37-regex`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/cephcsi-httpserver-go-pprof-exposed-l37-regex/poc.py`；上游 pin: `internal/util/httpserver.go:37`

**清理**

`python demos/cephcsi-httpserver-go-pprof-exposed-l37-regex/poc.py --cleanup`；删除 `demos/.work/cephcsi-httpserver-go-pprof-exposed-l37-regex/`；仿真服务随脚本退出停止

**危害**

C:M / I:H / A:M / 训练:H / 租户:H / 合规:M（任意路径写可替换权重、checkpoint 或配置，训练恢复时加载被污染内容）

- **演示脚本**：`demos/cephcsi-httpserver-go-pprof-exposed-l37-regex/poc.py`（sha256 `e90d62c46f63ee37157d989c7ec0487aa325a138a33939718012a8379b6a6887`）

- **检测/修复/证据**：`storage-protocol-csi` / `inkblade/modules/storage-protocol-csi/template.json`；node plugin 去 privileged；hostPath 只读白名单；metrics/pprof 鉴权或关闭；`lab/upstream_verify/cases/cephcsi/cephcsi-httpserver-go-pprof-exposed-l37-regex/result.json`

#### L10-002 · `juicefscsi-controller-manager-go-go-bind-all-l71-regex` · JuiceFS CSI

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| JuiceFS CSI | v0.33.1 | GET /debug/pprof/cmdline (9100/tcp) | `cmd/app/controller_manager.go:71`；服务默认监听 0.0.0.0，未限制管理面来源 | n/a | 无 | ClusterIP/宿主 |

**根因片段**

```text
cmd/app/controller_manager.go:71
69:         Scheme: scheme,
70:         Metrics: metricsserver.Options{
71:             BindAddress: "0.0.0.0:8084",
72:         },
73:         LeaderElection:             leaderElection,
74:         LeaderElectionID:           "csi-controller.juicefs.com",
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-juicefscsi-controller-manager-go-go-bind-all-l71"
SPEC = {'id': 'juicefscsi-controller-manager-go-go-bind-all-l71-regex', 'kind': 'pprof', 'method': 'GET', 'route': '/debug/pprof/cmdline', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'juicefscsi-controller-manager-go-go-bind-all-l71-regex'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + profile marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-juicefscsi-controller-manager-go-go-bind-all-l71`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/juicefscsi-controller-manager-go-go-bind-all-l71-regex/poc.py`；上游 pin: `cmd/app/controller_manager.go:71`

**清理**

`python demos/juicefscsi-controller-manager-go-go-bind-all-l71-regex/poc.py --cleanup`；删除 `demos/.work/juicefscsi-controller-manager-go-go-bind-all-l71-regex/`；仿真服务随脚本退出停止

**危害**

C:M / I:M / A:L / 训练:M / 租户:M / 合规:M（影响取决于部署面与相邻控制面，需按附录证据逐条复核）

- **演示脚本**：`demos/juicefscsi-controller-manager-go-go-bind-all-l71-regex/poc.py`（sha256 `3e143f80a752ad8f4e5994d013b41a5929662e96a60437acfdd71aea5c910436`）

- **检测/修复/证据**：`observability-exposure` / `inkblade/modules/observability-exposure/template.json`；controller metrics 绑定回环；管理面鉴权；node plugin 最小权限；`lab/upstream_verify/cases/juicefscsi/juicefscsi-controller-manager-go-go-bind-all-l71-regex/result.json`

#### L10-003 · `kueue-server-go-pprof-exposed-l30-regex` · Kueue

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Kueue | v0.20.3 | GET /debug/pprof/cmdline (9100/tcp) | `cmd/kueueviz/backend/config/server.go:30`；pprof-exposed-go + default-disabled auth 在外部可控输入上缺少边界校验或鉴权 | n/a | 无 | ClusterIP/宿主 |

**根因片段**

```text
cmd/kueueviz/backend/config/server.go:30
28:     "kueueviz/middleware"
29:
30:     _ "net/http/pprof"
31: )
32:
33: const (
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-kueue-server-go-pprof-exposed-l30-regex"
SPEC = {'id': 'kueue-server-go-pprof-exposed-l30-regex', 'kind': 'pprof', 'method': 'GET', 'route': '/debug/pprof/cmdline', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'kueue-server-go-pprof-exposed-l30-regex'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + profile marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-kueue-server-go-pprof-exposed-l30-regex`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/kueue-server-go-pprof-exposed-l30-regex/poc.py`；上游 pin: `cmd/kueueviz/backend/config/server.go:30`

**清理**

`python demos/kueue-server-go-pprof-exposed-l30-regex/poc.py --cleanup`；删除 `demos/.work/kueue-server-go-pprof-exposed-l30-regex/`；仿真服务随脚本退出停止

**危害**

C:H / I:H / A:M / 训练:M / 租户:H / 合规:H（匿名或默认凭据直达控制面，可读写权重、缓存与训练状态）

- **演示脚本**：`demos/kueue-server-go-pprof-exposed-l30-regex/poc.py`（sha256 `08beb3c15897425c7d93aeb0e4aaf1d79663cfef4c293d3e9d8f2c7fdc660b8b`）

- **检测/修复/证据**：`observability-exposure` / `inkblade/modules/observability-exposure/template.json`；管理面默认拒绝；每租户独立凭据；管理端口只开在运维网；对匿名请求返回 401 而非 200；`lab/upstream_verify/cases/kueue/kueue-server-go-pprof-exposed-l30-regex/result.json`

#### L10-004 · `volcano-scheduler-server-go-pprof-exposed-l162-regex` · Volcano

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| Volcano | v1.16.0 | GET /debug/pprof/cmdline (9100/tcp) | `cmd/scheduler/app/server.go:162`；pprof-exposed-go 在外部可控输入上缺少边界校验或鉴权 | n/a | 无 | ClusterIP/宿主 |

**根因片段**

```text
cmd/scheduler/app/server.go:162
160:
161:     if opt.EnablePprof {
162:         mux.HandleFunc("/debug/pprof/", pprof.Index)
163:         mux.HandleFunc("/debug/pprof/cmdline", pprof.Cmdline)
164:         mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
165:         mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
```

**攻击代码**

```python
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
from _lib.demo import cli, run_demo
MARKER = "INKBLADE-BENIGN-volcano-scheduler-server-go-pprof-exposed-l162-r"
SPEC = {'id': 'volcano-scheduler-server-go-pprof-exposed-l162-regex', 'kind': 'pprof', 'method': 'GET', 'route': '/debug/pprof/cmdline', 'payload': {'probe': 'INKBLADE-BENIGN', 'id': 'volcano-scheduler-server-go-pprof-exposed-l162-regex'}, 'expect_status': 200}
def demo(args):
    # target=127.0.0.1:<port>; args.target 默认 127.0.0.1:0
    result = run_demo(SPEC, target=args.target, marker=args.marker)
    assert result["status"] == 200
    assert args.marker in result.get("body", "") or result.get("marker") == args.marker
    print(result["status"], result.get("body", "")[:160])
    return 0
```

**攻击效果**

200 + profile marker

预期输出样例：`200` + marker `INKBLADE-BENIGN-volcano-scheduler-server-go-pprof-exposed-l162-r`（脚本会 assert status=200 且 marker 出现在响应中）。

**复现环境**

本地仿真环境：`python demos/volcano-scheduler-server-go-pprof-exposed-l162-regex/poc.py`；上游 pin: `cmd/scheduler/app/server.go:162`

**清理**

`python demos/volcano-scheduler-server-go-pprof-exposed-l162-regex/poc.py --cleanup`；删除 `demos/.work/volcano-scheduler-server-go-pprof-exposed-l162-regex/`；仿真服务随脚本退出停止

**危害**

C:L / I:L / A:H / 训练:H / 租户:M / 合规:M（资源耗尽或步时劣化直接打断训练/推理，但不必然泄露数据）

- **演示脚本**：`demos/volcano-scheduler-server-go-pprof-exposed-l162-regex/poc.py`（sha256 `703d09f7fc808ea43fb3b6ea7a09270c64ea474252983cd89d51f886b24a39de`）

- **检测/修复/证据**：`observability-exposure` / `inkblade/modules/observability-exposure/template.json`；按最小权限与 fail-closed 原则收窄入口；补鉴权、输入校验、只读挂载与审计告警；`lab/upstream_verify/cases/volcano/volcano-scheduler-server-go-pprof-exposed-l162-regex/result.json`

#### L10-005 · `CVE-2025-23374` · SONiC

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| SONiC | prior to 4.4.1 / 4.2.3 | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；日志敏感信息泄露 | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
日志写入敏感信息 → 凭据/配置泄露
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:L / A:L / 训练:L / 租户:M / 合规:H（出站请求或凭据泄露把集群边界延伸到云 IAM 与对象存储）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`sonic-config-plane-write` / `inkblade/modules/sonic-config-plane-write/template.json`；交换机管理面限源；禁用 SNMP v1/v2c public；PFC/ECN/ACL 基线；`lab/upstream_verify/cases/sonic/CVE-2025-23374/result.json`

#### L10-006 · `GHSA-h26v-922j-28cg` · SONiC

**打了哪里**

| 组件 | 版本区间 | 入口 | 根因 file:line | 可控参数/请求体字段 | 认证前置 | 网络位置 |
|---|---|---|---|---|---|---|
| SONiC | master 修复前构建（具体 tag 未标注） | 配置面/CLI: `n/a (vendor firmware / Linux runtime)` | `n/a (vendor firmware / Linux runtime)`；rsyslog 配置注入（welf_firewall_name） | n/a（静态/配置面） | 无/需本地访问 | 配置面/宿主 |

**根因片段**

```text
n/a (vendor firmware / Linux runtime)
换行/特殊字符注入 rsyslog 指令 → root 上下文配置执行（可写文件/执行命令）
审计记录：厂商固件/运行时路径，无逐字上游源码
审计记录：按配置面/权限面判定，未执行内存或设备操作
```

**攻击代码**

N/A — vendor hardware or Linux runtime required

**攻击效果**

N/A（vendor hardware or Linux runtime required）

**复现环境**

unsupported：vendor hardware or Linux runtime required

**清理**

无写入；不需要清理

**危害**

C:H / I:H / A:M / 训练:H / 租户:H / 合规:H（代码执行发生在训练/推理进程内，可直接读写权重、梯度、KV 与云凭据）

- **演示脚本**：N/A — vendor hardware or Linux runtime required

- **检测/修复/证据**：`sonic-rsyslog-injection` / `inkblade/modules/sonic-rsyslog-injection/template.json`；交换机管理面限源；禁用 SNMP v1/v2c public；PFC/ECN/ACL 基线；`lab/upstream_verify/cases/sonic/GHSA-h26v-922j-28cg/result.json`


## 跨层攻击链

单层发现回答“这里有没有问题”；攻击链回答“从已有 Pod 走到哪里”。下表只写阶段与证据锚点，不写利用步骤。

| 链 | 阶段/原语 | 附录条目 |
|---|---|---|
| C1 平网 → 管理面 → 权重投毒 | A1 平网 + SGLang/slime 管理面 fail-open + `/pull_weights` 路径可控 | `CVE-2026-15978`、`CVE-2026-92972`、`CVE-2025-32444` |
| C2 Ray Dashboard → 集群控制 | Ray dashboard 无 token 提交 Job → head 任意命令 → KubeRay 宽 RBAC/特权 Pod | `CVE-2023-48022`、`KUBERAY-ADV-2026-01`、`CVE-2023-48023` |
| C3 NCCL → 梯度注入 | 加入集合通信组 → 发送/替换张量 → 梯度或权重污染 | `NCCL-NCCLPLUGIN-HW`、`UCX-UCT-HW`、`CVE-2025-47277` |
| C4 共享 PVC + 模型加载 → 供应链投毒 | 共享卷可写 + `trust_remote_code`/checkpoint `torch.load` → 一人投毒、全集群加载者执行 | `CVE-2025-32434`、`llamafactory-checkpoint-py-torch-load-unsafe-l136-ast`、`msswift-indexed-dataset-py-pickle-loads-l112-ast` |
| C5 SSRF/SA token → 云元数据 | 媒体 URL 或 image_url 出站 → IMDS/云元数据 → 角色凭据 → 对象存储 | `CVE-2024-0520`、`LITELLM-DEFAULT-KEY`、`CVE-2025-23266` |
| C6 监控面 → 精准打点 | DCGM/Prometheus/MLflow/Jupyter 无鉴权 → 暴露面地图 → 选择 C1–C5 入口 | `CVE-2026-53995`、`CVE-2024-37061`、`kueue-server-go-pprof-exposed-l30-regex` |
| C7 pickle 通道 → 未授权 RCE | 平网 + checkpoint/KV/ZMQ `recv_pyobj` → 反序列化执行 | `CVE-2026-3059`、`CVE-2026-3060`、`CVE-2025-32444` |
| 夺权链（七阶段） | 入口 → SA token → RoleBinding/ClusterRoleBinding → 特权 Pod → 节点 root → 集群级证明 → 清理 | `CVE-2023-48022`、`KUBERAY-ADV-2026-01`、`CVE-2013-4786` |
| 缓存侧信道链 | TTFT 两档差分 → 成员推断 → EPP per-tenant 指标 → 前缀字典收敛 | `CVE-2025-59425`、`CVE-2026-15978`、`CVE-2026-92972` |
| PD KV 投毒链 | KV 通道未鉴权 → 块 ID 枚举 → 写入 → 独立读回 sha256 一致 → 推理操纵 | `CVE-2026-3060`、`CVE-2025-47277`、`CVE-2025-32444` |

组合签名不是“再加一条链”，而是去重规则：两个组件同时成立才算问题的，只报一次，报在组合上。第 9 节列了当前 14 条签名；组合不成立时，组件级发现各自独立。

## 术语表

| 术语 | 一句话解释 |
|---|---|
| Rail | GPU 服务器内 GPU↔NIC↔leaf 的固定编号绑定；rail-optimized 让同一 rank 的集合通信走同一条轨。 |
| PD 分离 | Prefill/Decode 分离部署；prefill 节点算完 KV 后把块搬给 decode 节点，通道常无 mTLS。 |
| KV cache | 推理时缓存的 key/value 张量；按 token 前缀复用，跨租户是否隔离取决于键里有没有 tenant/salt。 |
| IMEX | NVIDIA 多节点 NVLink 显存共享服务，把远端 GPU 显存映射进本地进程地址空间。 |
| ComputeDomain | Kubernetes CRD，把一组 Pod 划进同一 IMEX 域；域选择器就是租户边界。 |
| DRA | Dynamic Resource Allocation；ResourceClaim 描述设备请求，可携带 MIG/IMEX 策略。 |
| MIG | GPU 硬件分区，把一张卡切成多个 GPU instance；分区不等于清零。 |
| MPS | CUDA Multi-Process Service；多进程共享一个 GPU context/pipe，默认假设是单用户。 |
| MoE / EP | 混合专家/专家并行；加入 EP 组默认被信任，专家分片可被替换。 |
| NCCL | NVIDIA 集合通信库；bootstrap/rendezvous 设计上不认证，能加入组就能收发张量。 |
| RDMA | 远程直接内存访问；绕过内核网络栈，也绕过 NetworkPolicy。 |
| IB / SM / Partition | InfiniBand、子网管理器与分区；SM 是 Kubernetes 之外的信任域，Partition 是 RDMA 的租户边界。 |
| PFC / ECN | RoCE 的无损以太流控与拥塞通知；配置是全局的，一个坏队列能拖住整片 fabric。 |
| SHARP | 交换机在网聚合；reduce 发生在交换机内，主机策略看不到会话成员。 |
| TTFT | Time To First Token；前缀命中时显著下降，可被用作缓存成员/前缀长度的侧信道。 |
| cache_salt | 请求级缓存盐；参与缓存键派生，是多租户前缀隔离的关键参数。 |
| EPP | Endpoint Picker / 推理路由扩展；暴露 per-tenant 队列深度、命中率与前缀样本。 |
| HAMi / cGPU | GPU 池化/分数卡调度器；隔离决策在 Kubernetes RBAC 之外。 |
| IRSA / Workload Identity | Kubernetes SA 换取云角色的联邦机制；trust policy 通配会把任意 Pod 变成云主体。 |
| IMDS | 云实例元数据服务；一个请求就能拿到节点角色凭据。 |
| BMC / Redfish / IPMI | 带外管理面；默认凭据、cipher 0、IPMI over LAN 都绕过 K8s。 |
| DPU / SmartNIC | 卸载网络/存储/安全策略的网卡；offload 后策略执行点可能不在你管的集群里。 |
| SR-IOV / Multus / macvlan | 多网卡与直通形态；策略钩子通常只覆盖主 CNI，直通流量绕过。 |
| CNI | 容器网络接口；托管云的 VPC 路由与集群 NetworkPolicy 是两套控制面，会漂移。 |
| CSI | 容器存储接口；node plugin 常以特权运行并挂宿主根目录。 |
| Operator | 用 CRD 管理有状态应用的控制器；它的 ClusterRole 往往比业务 Pod 大得多。 |
| RBAC | Kubernetes 角色/绑定；`bind`/`escalate`/`impersonate` 与 secrets 读是提权原语。 |
| SA token | ServiceAccount 令牌；automount 默认开启时，Pod 内可直接调用 apiserver。 |
| Attestation | 远程证明；GPU CC/TEE/TPM 的 claims 必须绑 nonce 并验签，否则是 false trust。 |
| SBOM / AI-BOM | 软件/模型物料清单；ML 镜像包含框架、CUDA、模型三层物料。 |
| LoRA / adapter | 低秩适配器；请求可控路径加载 adapter 等于加载代码/行为。 |
| Checkpoint / optimizer state | 训练状态；体量大、可写、加载时被信任，是投毒与 RCE 的共同入口。 |
| WebDataset / Arrow | 数据集分片与列式格式；解析器与代码执行相邻，常被当数据而不是代码审。 |
| Guardrail | 推理网关的内容护栏；只检查首条消息或只识别 user 角色时可被多消息绕过。 |
| HIDS / LSM | 主机入侵检测与 Linux 安全模块；driver 未加载或策略未覆盖命名空间时界面仍显示“已部署”。 |
| prefix cache | 按 token 前缀哈希复用 KV 的机制；命中跳过 prefill，键的隔离强度决定租户边界。 |
| radix tree | SGLang RadixAttention 用的前缀树；共享节点省显存，但树命中统计会暴露“谁来过”。 |
| PagedAttention | 把 KV 切成固定大小 block、按页表映射的显存管理法；块 ID 可枚举时也是越权入口。 |
| semantic cache | 按语义相似度而非精确 token 命中；阈值越宽，越容易把别人的答案当成自己的。 |
| approximate cache | 近似缓存/向量检索缓存的统称；先检索后按租户过滤的顺序错了就会跨租户。 |
| cache key | 缓存条目的身份；正确形式是 hash(prefix)+tenant+salt，缺一项都不是租户隔离。 |
| cache salt | 请求级盐，参与缓存键派生；服务端强制才有效，请求可选就等于可关闭。 |
| TTL | 条目存活时间；TTL 太长放大残留窗口，太短降低命中率，安全与成本在这里拉扯。 |
| eviction | 逐出策略（LRU/LFU/容量压力）；只释放索引不清零，块仍可能被下一个租户读到。 |
| hit / miss | 命中/未命中；命中差异会同时改变 TTFT、计费、日志与可观测指标。 |
| remote KV pool | Mooncake/LMCache 风格的跨实例 KV 池；块 ID、命名空间、后端 ACL 三者共同构成边界。 |
| PD KV transfer | Prefill 节点把 KV 块传给 Decode 节点的通道；NIXL/RDMA 常缺 mTLS 与块归属校验。 |
| context window | 模型单次可处理的最大 token 数（128K/1M）；准入必须按实际 token，不是声明值。 |
| token | 模型的最小输入单位；字节数≠token 数，按字符估算会给超窗留下空间。 |
| prefill | 一次性计算整段 prompt 的阶段；算力密集、决定 TTFT，也是 KV 分配的起点。 |
| decode | 逐 token 生成阶段；每步追加 KV，长输出把显存占用线性拉长。 |
| attention 复杂度 | 标准 attention 对序列长度是 O(n²)；FlashAttention/稀疏化降低常数但不改变增长趋势。 |
| RoPE | 旋转位置编码；把位置写进 Q/K 的旋转角，外推能力决定超长窗口是否还可信。 |
| 位置外推 | YaRN/NTK/线性缩放等把训练窗口拉长的方法；外推过头会输出退化而非直接报错。 |
| KV 增长 | KV 字节随层数×头数×维度×token 数增长；1M 窗口下单请求可达 GB 级。 |
| context flooding | 用大量超长请求占满 prefill 队列/KV 配额；单请求成本低，集群影响大。 |
| attention sink | 模型把大量注意力放在首 token 的现象；滑窗/截断会改变 sink，导致行为漂移。 |
| 滑窗 / 截断 | 只保留最近 N 个 token 或截断超长输入；静默截断会让模型“看不见”关键指令。 |
| cache 复用 | 长上下文与 prefix cache 叠加时，前缀命中既省算力也放大跨租户泄露面。 |
| ring attention | Context Parallel 下 KV 沿 ring 逐跳传递；环成员就是信任边界。 |
| context limit bypass | 声明窗口与实际 token 不一致仍被接受；后果是队列 DoS 与 KV 放大。 |
| 反向代理 | 网关站在模型前面转发请求；它看到的身份头不一定可信，除非入口剥离了外部同名头。 |
| 模型路由/别名 | 把公共模型名映射到具体后端；别名可写且无 allowlist 时，流量可被整体劫持。 |
| master key | 网关的最高权限密钥；示例默认值未轮换时，等于把管理面交给任何读到示例的人。 |
| virtual key | 按租户/项目签发的子密钥；必须绑定租户、额度、模型白名单，否则只是换名的 master key。 |
| 租户 | 计费、配额、缓存、日志的最小隔离单位；请求头里的 tenant 不能替代服务端身份。 |
| 配额/限流 | 按 key/租户/模型限制 QPS 与 token；按 X-Forwarded-For 分桶可被轮换伪造绕过。 |
| 语义缓存 | 网关侧按相似度复用响应；键不含租户/模型/策略版本时会跨租户命中。 |
| guardrail | 内容护栏；只检查首条消息、只识别 user 角色时可被多消息/角色分层绕过。 |
| InferencePool | Gateway API Inference Extension 的推理后端池；EPP 在其上做端点选择。 |
| llm-d | Kubernetes 上的分布式推理编排；PD 分离、KV 感知路由与 InferencePool 常一起出现。 |
| FailOpen | 鉴权/策略组件故障时放行；可用性优先的默认值会把故障放大成全网越权。 |
| provider key | 上游模型厂商密钥；泄露等于计费面、模型清单与配额控制权一起丢失。 |
| X-Forwarded-For | 代理链客户端 IP 头；可伪造，不能作为配额或审计的唯一身份。 |
| time-slicing | 按时间片轮转共享 GPU；上下文切换残留与时间侧信道是主要风险。 |
| vGPU | 虚拟 GPU 实例；调度器把物理卡切片给多个租户，释放路径必须销毁实例。 |
| HAMi | Kubernetes GPU 池化调度器；admin API 与租户过滤是隔离决策的实际执行点。 |
| cGPU | 容器级 GPU 隔离/分数卡方案；配额、上下文与指标面需要与 K8s RBAC 对齐。 |
| GPU 池化调度 | 把物理卡按显存/算力切片并跨 namespace 分配；分配、释放、迁移三个动作都要鉴权。 |
| 显存残留 | 释放后未清零的 VRAM/快照/临时卷；下一个租户可读前一个租户的模型或激活。 |
| 隔离边界 | 从“同卡”到“同 MIG 实例”到“同 context”的层级；边界越细，越需要生命周期证明。 |
| CUDA context | 进程在 GPU 上的执行上下文；MPS 共享 context 时，client/pid 可能跨租户可见。 |
| MIG profile | 1g/2g/3g/7g 等切片档位；请求档位与设备实际档位不一致就是隔离降级。 |
| DCGM | GPU 指标采集器；进程名、namespace、模型标签是无鉴权时的租户画像源。 |
| TDX | Intel Trust Domain Extensions；把 VM 放进受保护的 TD，证明报价要绑 nonce/measurement。 |
| SEV-SNP | AMD 安全加密虚拟化；report 由 VCEK 签名，验签要走到 ASK/ARK 根。 |
| NVIDIA CC | GPU Confidential Computing；CC-On/DevTools 的差别必须由 claims 证明，不看自报。 |
| attestation | 远程证明：把“我在什么环境运行”变成可验签的 claims；不绑 nonce 就可重放。 |
| NRAS | NVIDIA Remote Attestation Service；提供 GPU EAT/JWT 与 JWKS，是 GPU CC 的信任源。 |
| PCS/KDS | AMD 的证书服务；VCEK/ASK/ARK 链从 KDS 取，缓存不等于实时信任。 |
| SPDM | DMTF 的设备安全协议；证书、测量、会话能力决定 PCIe 设备能否被证明。 |
| IOMMU/SMMU | 把设备 DMA 限制在授权地址空间；iommu=off/pt 或 identity 组会放大 DMA 越权。 |
| TPM / measured boot | 用 PCR 记录引导链；PCR 偏移或 dbx 缺失意味着“看起来正常但引导链已变”。 |
| 固件签名 | 厂商用非对称私钥签固件；HMAC fixture 不能冒充厂商 PKI。 |
| 微码 | CPU 微码 revision 低于厂商基线时，已知硬件缺陷可能未修。 |
| EAT/JWT | 实体证明令牌；验签、过期、issuer/audience 与 claims 策略缺一不可。 |
| nonce | 一次性挑战；不绑 nonce 的证明可被旧 JWT 重放。 |
| dbgstat/secboot | GPU CC claims：调试是否关闭、安全启动是否成立；不看这两项就是 false trust。 |
| CXL IDE | CXL 链路上的完整性与数据加密；CXL 设备才有的面，普通 GPU 集群无此面。 |
| rail | GPU 服务器内 GPU↔NIC↔leaf 的固定编号绑定；错轨会把集合通信挤到错误平面。 |
| 多平面 | 用多个并行 fabric 平面分担流量；平面间路由/隔离错配会绕过按轨策略。 |
| fat-tree | 三层 CLOS 拓扑；spine/leaf 的 oversubscription 决定拥塞与故障域。 |
| RoCEv2 | 在以太网上跑 RDMA；依赖 PFC/ECN 做无损，配置是全局的。 |
| PFC | Priority Flow Control；暂停帧可止血也可形成风暴，watchdog 关闭时更危险。 |
| ECN | 显式拥塞通知；与 PFC 配合做无损，缺失时靠丢包回退会拖垮吞吐。 |
| NCCL ring/tree | NCCL 的两种集合通信算法；ring 省带宽、tree 低时延，bootstrap 不认证。 |
| IB SM | InfiniBand 子网管理器；在 K8s 之外，默认分区 `*` 会把信任域放大到全 fabric。 |
| IB Partition | IB 的租户隔离单位（PKey）；成员不按租户收敛时，RDMA 就是平网。 |
| NetworkPolicy | K8s 的 L3/L4 策略；只覆盖主 CNI，hostNetwork/SR-IOV/RDMA 不经过它。 |
| SR-IOV | 把一张网卡切成多个 VF 直通给 Pod；绕过 kube-proxy 与策略钩子。 |
| Multus | 给 Pod 挂多张网卡；第二张网卡的策略覆盖常被忽略。 |
| NVLink | GPU 间高带宽互联；NVSwitch/IMEX 把单机信任域扩展到机架。 |

共 112 条（含六块前置新增 77 条）。术语只解释本文用到的含义，不替代厂商文档。

## 证据索引

路径均为仓库相对路径；不写本地盘符、用户名或绝对路径。

| 内容 | 路径 |
|---|---|
| registry 总账 | `inkblade/core/exploit-registry.json` |
| 零日储备总账 | `inkblade/core/zeroday-registry.json` |
| 上游 case 与根因 | `lab/upstream_verify/cases/*/*/manifest.json` |
| 上游源码快照 | `lab/upstream_verify/upstream/` |
| 286 模板 | `inkblade/modules/*/template.json` |
| 模块元数据 | `inkblade/modules/*/module.json` |
| 攻击链定义 | `inkblade/chains/*.json` |
| 模板动态验证 | `docs/PROBE-COVERAGE.md`、`reports/probe-coverage/evidence.json` |
| 缓存靶场与实效 | `lab/cache_sim.py`、`reports/samples/cache-security/effects.json` |
| 长上下文/PD 靶场 | `lab/longctx_sim.py`、`docs/LONG-CONTEXT.md` |
| fabric 靶场 | `lab/fabric_dos_sim.py`、`docs/FABRIC-ATTACK-SURFACE.md` |
| GPU 池化/云租户靶场 | `lab/gpu_cloud_sim.py`、`docs/GPU-CLOUD-TENANCY.md` |
| AI 网关靶场 | `lab/ai_gateway_sim.py`、`docs/AI-GATEWAY.md` |
| 硬件/芯片 fixture | `lab/hardware-fixtures/`、`docs/CHIP-SECURITY-SCOPE.md` |
| 防护实验室 | `lab/defense-lab/`、`docs/DEFENSE-LAB-RESULTS.md`、`reports/samples/defense-lab/` |
| 夺权链 PROOF | `reports/samples/kill-chain/proof.json`、`docs/KILL-CHAIN.md` |
| 提权矩阵 | `inkblade/core/data/privesc-matrix.json`、`docs/PRIVESC-MATRIX.md` |
| 组合签名 | `inkblade/core/data/combo-matrix.json` |

## 规模

| 指标 | 数值 | 说明 |
|---|---:|---|
| 模板 | 286 | `inkblade/modules/*/template.json` 计数 |
| 模块目录 | 287 | 286 模板 + 1 bootstrap |
| registry 条目 | 152 | 有代码锚点的可利用性核验 |
| 零日储备 | 39 | 按根因/组件去重 |
| 攻击链 | 29 | `inkblade/chains/*.json` |
| 规则 | 121 | Sigma 94 / Falco 11 / Suricata 8 / 准入 5 / netpol 1 / vpc-sg 1 / ib 1 |
| 写类模板 | 67 | `meta.writes=true` |

## 附录 A：152 条总索引

只给 ID、组件、所属层、一句话与状态；原理、入口、攻击代码、效果、复现环境、清理与危害都在正文对应锚点。

| ID | 组件 | 层级 | 一句话 | 状态 |
|---|---|---|---|---|
| `CVE-2025-29783` | vLLM | 1 · 架构层 | Mooncake ZMQ/TCP 不安全反序列化 | verified |
| `CVE-2025-32444` | vLLM | 1 · 架构层 | Mooncake KV 管道 pickle 反序列化 RCE | verified |
| `CVE-2025-47277` | vLLM | 1 · 架构层 | PyNcclPipe KV 传输 RCE | verified |
| `CVE-2026-3059` | SGLang | 1 · 架构层 | 多模态 ZMQ broker pickle RCE | verified |
| `CVE-2026-3060` | SGLang | 1 · 架构层 | Encoder PD 分离模块 pickle RCE | verified |
| `CVE-2026-92972` | SGLang | 1 · 架构层 | PD 分离 PUT /route 路由表投毒 | verified |
| `NCCL-NCCLPLUGIN-HW` | NCCL | 1 · 架构层 | NCCL collective library/plugin loading (hardware fabric path) | unsupported |
| `UCX-UCT-HW` | UCX | 1 · 架构层 | UCX/UCT transport library (hardware fabric path) | unsupported |
| `CVE-2026-7301` | SGLang | 1 · 架构层 | 多模态 scheduler ROUTER 绑定 0.0.0.0 + pickle | static |
| `ucxpy-server-py-pickle-loads-l42-regex` | UCX-Py | 1 · 架构层 | ucx-py: pickle-loads @ debug-tests/server.py:42 | static |
| `CVE-2023-48022` | Ray | 2 · 产品与框架层 | ShadowRay：Dashboard 未授权 Job 提交 RCE（Ray 2.8.0 实机复现） | verified |
| `CVE-2023-48023` | Ray | 2 · 产品与框架层 | Ray /log_proxy SSRF（Ray 2.8.0 实机复现） | verified |
| `CVE-2026-40217` | LiteLLM | 2 · 产品与框架层 | /guardrails/test_custom_code 字节码改写 RCE | verified |
| `CVE-2026-42203` | LiteLLM | 2 · 产品与框架层 | /prompts/test 模板注入 RCE | verified |
| `CVE-2026-53995` | MLflow | 2 · 产品与框架层 | FileStore trace ID 路径穿越任意写 | verified |
| `CVE-2024-10220` | Kubernetes | 2 · 产品与框架层 | gitRepo volume 任意命令执行 | static |
| `CVE-2024-3177` | Kubernetes | 2 · 产品与框架层 | envFrom 绕过 mountable secrets 策略 | static |
| `CVE-2025-3466` | Dify | 2 · 产品与框架层 | 代码节点沙箱逃逸（parseInt 覆写） | static |
| `CVE-2025-56520` | Dify | 2 · 产品与框架层 | RemoteFileUploadApi SSRF | static |
| `CVE-2025-63387` | Dify | 2 · 产品与框架层 | /console/api/system-features 未授权访问 | static |
| `CVE-2025-64496` | Open WebUI | 2 · 产品与框架层 | Direct Connections SSE 代码注入 | static |
| `CVE-2026-28786` | Open WebUI | 2 · 产品与框架层 | 语音转写文件名路径/错误信息泄露 | static |
| `CVE-2026-28788` | Open WebUI | 2 · 产品与框架层 | 批量检索端点任意文件覆盖 | static |
| `CVE-2026-32981` | Ray | 2 · 产品与框架层 | Ray Dashboard 静态文件路径穿越（2.8.0 实机复核：不可复现） | static |
| `CVE-2026-35029` | LiteLLM | 2 · 产品与框架层 | /config/update 缺失管理员授权 → RCE | static |
| `CVE-2026-42208` | LiteLLM | 2 · 产品与框架层 | API key 校验 SQL 注入 | static |
| `CVE-2026-47102` | LiteLLM | 2 · 产品与框架层 | /user/update 自提权至 proxy_admin | static |
| `CVE-2026-7302` | SGLang | 2 · 产品与框架层 | 多模态上传路径穿越任意文件写 | static |
| `llamafactory-app-py-bind-all-interfaces-l130-regex` | LLaMA-Factory | 2 · 产品与框架层 | llamafactory: bind-all-interfaces @ app.py:130 | exposure |
| `llamafactory-app-py-go-bind-all-l130-regex` | LLaMA-Factory | 2 · 产品与框架层 | llamafactory: go-bind-all @ app.py:130 | exposure |
| `llamafactory-interface-py-bind-all-interfaces-l103-regex` | LLaMA-Factory | 2 · 产品与框架层 | llamafactory: bind-all-interfaces @ interface.py:103 | exposure |
| `llamafactory-interface-py-bind-all-interfaces-l94-regex` | LLaMA-Factory | 2 · 产品与框架层 | llamafactory: bind-all-interfaces @ interface.py:94 | exposure |
| `llamafactory-interface-py-go-bind-all-l103-regex` | LLaMA-Factory | 2 · 产品与框架层 | llamafactory: go-bind-all @ interface.py:103 | exposure |
| `llamafactory-interface-py-go-bind-all-l94-regex` | LLaMA-Factory | 2 · 产品与框架层 | llamafactory: go-bind-all @ interface.py:94 | exposure |
| `trl-data-utils-py-apply-chat-template-dynamic-l167-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:167 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l194-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:194 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l213-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:213 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l226-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:226 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l238-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:238 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l250-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:250 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l269-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:269 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l277-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:277 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l303-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:303 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l357-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:357 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l362-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:362 | static |
| `trl-data-utils-py-apply-chat-template-dynamic-l395-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ data_utils.py:395 | static |
| `trl-sft-py-load-dataset-any-l96-regex` | TRL | 2 · 产品与框架层 | trl: load-dataset-any @ sft.py:96 | static |
| `trl-sft-trainer-py-apply-chat-template-dynamic-l394-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ sft_trainer.py:394 | static |
| `trl-sft-trainer-py-apply-chat-template-dynamic-l436-regex` | TRL | 2 · 产品与框架层 | trl: apply-chat-template-dynamic @ sft_trainer.py:436 | static |
| `trl-sft-trainer-py-load-dataset-any-l527-regex` | TRL | 2 · 产品与框架层 | trl: load-dataset-any @ sft_trainer.py:527 | static |
| `CVE-2013-4786` | BMC/Redfish | 3 · 组件与 Operator 层 | RAKP 密码哈希泄露（可离线爆破） | unsupported |
| `CVE-2017-12542` | BMC/Redfish | 3 · 组件与 Operator 层 | 认证绕过 + 远程代码执行 | unsupported |
| `CVE-2020-15257` | containerd | 3 · 组件与 Operator 层 | containerd-shim abstract socket 逃逸 | unsupported |
| `CVE-2022-0492` | Linux kernel | 3 · 组件与 Operator 层 | cgroup release_agent 逃逸 | unsupported |
| `CVE-2023-34329` | BMC/Redfish | 3 · 组件与 Operator 层 | HTTP 头伪造认证绕过 | unsupported |
| `CVE-2024-21626` | runc | 3 · 组件与 Operator 层 | Leaky Vessels 文件描述符泄漏容器逃逸 | unsupported |
| `CVE-2025-31133` | runc | 3 · 组件与 Operator 层 | masked path /dev/null 符号链接竞态逃逸 | unsupported |
| `OPENBMC-BMCWEB-REDfish-HW` | BMC/Redfish | 3 · 组件与 Operator 层 | OpenBMC bmcweb/Redfish + IPMI-BT service plane (BMC firmware path) | unsupported |
| `cephcsi-cephcsi-go-bind-all-l255-regex` | Ceph CSI | 3 · 组件与 Operator 层 | ceph-csi: go-bind-all @ cmd/cephcsi.go:255 | static |
| `CVE-2025-33180` | Cumulus/NVUE | 4 · 网络与 fabric 层 | NVUE 低权限命令注入 | unsupported |
| `CVE-2025-38741` | SONiC | 4 · 网络与 fabric 层 | SSH 硬编码密钥 | unsupported |
| `CVE-2026-24184` | Cumulus/NVUE | 4 · 网络与 fabric 层 | LLDP 守护进程缓冲区溢出 | unsupported |
| `sonicrestapi-default-go-exec-command-l1881-regex` | SONiC REST API | 4 · 网络与 fabric 层 | sonic-restapi: exec-command-go @ go-server-server/go/default.go:1881 | static |
| `CVE-2024-0520` | MLflow | 5 · 数据与权重层 | HTTP dataset 路径穿越/命令注入 RCE | verified |
| `CVE-2024-43497` | DeepSpeed | 5 · 数据与权重层 | 检查点/配置命令注入 RCE | verified |
| `CVE-2025-32434` | PyTorch | 5 · 数据与权重层 | torch.load weights_only 绕过 RCE | verified |
| `CVE-2026-65110` | Megatron-LM | 5 · 数据与权重层 | 检查点加载 RCE | verified |
| `deepspeed-stage3-py-torch-load-any-l3660-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: torch-load-any @ stage3.py:3660 | verified |
| `deepspeed-stage3-py-torch-load-any-l3770-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: torch-load-any @ stage3.py:3770 | verified |
| `deepspeed-stage3-py-torch-load-unsafe-l3660-ast` | DeepSpeed | 5 · 数据与权重层 | deepspeed: torch-load-unsafe @ stage3.py:3660 | verified |
| `deepspeed-stage3-py-torch-load-unsafe-l3660-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: torch-load-unsafe @ stage3.py:3660 | verified |
| `deepspeed-stage3-py-torch-load-unsafe-l3770-ast` | DeepSpeed | 5 · 数据与权重层 | deepspeed: torch-load-unsafe @ stage3.py:3770 | verified |
| `llamafactory-checkpoint-py-torch-load-unsafe-l136-ast` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: torch-load-unsafe @ v1/core/utils/checkpoint.py:136 | verified |
| `llamafactory-checkpoint-py-torch-load-unsafe-l136-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: torch-load-unsafe @ v1/core/utils/checkpoint.py:136 | verified |
| `llamafactory-checkpoint-py-torch-load-unsafe-l334-ast` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: torch-load-unsafe @ v1/core/utils/checkpoint.py:334 | verified |
| `llamafactory-checkpoint-py-torch-load-unsafe-l334-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: torch-load-unsafe @ v1/core/utils/checkpoint.py:334 | verified |
| `megatron-checkpointing-py-torch-load-any-l1739-regex` | Megatron-LM | 5 · 数据与权重层 | megatron: torch-load-any @ checkpointing.py:1739 | verified |
| `msswift-indexed-dataset-py-pickle-loads-l112-ast` | ms-swift | 5 · 数据与权重层 | msswift: pickle-loads @ swift/dataset/indexed_dataset.py:112 | verified |
| `msswift-indexed-dataset-py-pickle-loads-l112-regex` | ms-swift | 5 · 数据与权重层 | msswift: pickle-loads @ swift/dataset/indexed_dataset.py:112 | verified |
| `msswift-indexed-dataset-py-pickle-loads-l129-ast` | ms-swift | 5 · 数据与权重层 | msswift: pickle-loads @ swift/dataset/indexed_dataset.py:129 | verified |
| `msswift-indexed-dataset-py-pickle-loads-l129-regex` | ms-swift | 5 · 数据与权重层 | msswift: pickle-loads @ swift/dataset/indexed_dataset.py:129 | verified |
| `msswift-torch-utils-py-pickle-loads-l340-ast` | ms-swift | 5 · 数据与权重层 | msswift: pickle-loads @ swift/utils/torch_utils.py:340 | verified |
| `msswift-torch-utils-py-pickle-loads-l340-regex` | ms-swift | 5 · 数据与权重层 | msswift: pickle-loads @ swift/utils/torch_utils.py:340 | verified |
| `megatron-checkpointing-py-torch-load-any-l2796-regex` | Megatron-LM | 5 · 数据与权重层 | megatron: torch-load-any @ checkpointing.py:2796 (sink unreachable) | unsupported |
| `CVE-2024-37061` | MLflow | 5 · 数据与权重层 | 恶意 MLproject 代码执行 | static |
| `CVE-2025-23354` | Megatron-LM | 5 · 数据与权重层 | ensemble_classifier 脚本注入 | static |
| `CVE-2025-33247` | Megatron-LM | 5 · 数据与权重层 | 量化配置加载 RCE | static |
| `deepspeed-engine-py-env-rank-read-l1964-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: env-rank-read @ engine.py:1964 | static |
| `deepspeed-engine-py-env-rank-read-l1966-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: env-rank-read @ engine.py:1966 | static |
| `deepspeed-engine-py-eval-call-l2889-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: eval-call @ engine.py:2889 | static |
| `deepspeed-multinode-runner-py-subprocess-popen-l457-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: subprocess-popen @ multinode_runner.py:457 | static |
| `deepspeed-runner-py-subprocess-popen-l489-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: subprocess-popen @ runner.py:489 | static |
| `deepspeed-runner-py-subprocess-popen-l504-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: subprocess-popen @ runner.py:504 | static |
| `deepspeed-runner-py-subprocess-popen-l619-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: subprocess-popen @ runner.py:619 | static |
| `deepspeed-runner-py-subprocess-popen-l625-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: subprocess-popen @ runner.py:625 | static |
| `deepspeed-stage3-py-torch-load-any-l3616-regex` | DeepSpeed | 5 · 数据与权重层 | deepspeed: torch-load-any @ stage3.py:3616 | static |
| `llamafactory-fsdp2-py-torch-load-any-l517-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: torch-load-any @ v1/plugins/.../fsdp2.py:517 | static |
| `llamafactory-loader-py-eval-call-l211-ast` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: eval-call @ loader.py:211 | static |
| `llamafactory-loader-py-eval-call-l211-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: eval-call @ loader.py:211 | static |
| `llamafactory-loader-py-missing-revision-l104-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: missing-revision @ loader.py:104 | static |
| `llamafactory-loader-py-missing-revision-l128-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: missing-revision @ loader.py:128 | static |
| `llamafactory-loader-py-missing-revision-l172-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: missing-revision @ loader.py:172 | static |
| `llamafactory-loader-py-missing-revision-l186-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: missing-revision @ loader.py:186 | static |
| `llamafactory-loader-py-missing-revision-l78-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: missing-revision @ loader.py:78 | static |
| `llamafactory-loader-py-missing-revision-l86-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: missing-revision @ loader.py:86 | static |
| `llamafactory-loader-py-missing-revision-l98-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: missing-revision @ loader.py:98 | static |
| `llamafactory-loader-py-trust-remote-code-propagated-l170-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: trust-remote-code-propagated @ loader.py:170 | static |
| `llamafactory-template-py-apply-chat-template-dynamic-l584-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: apply-chat-template-dynamic @ template.py:584 | static |
| `llamafactory-template-py-apply-chat-template-dynamic-l587-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: apply-chat-template-dynamic @ template.py:587 | static |
| `llamafactory-template-py-apply-chat-template-dynamic-l591-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: apply-chat-template-dynamic @ template.py:591 | static |
| `llamafactory-template-py-apply-chat-template-dynamic-l595-regex` | LLaMA-Factory | 5 · 数据与权重层 | llamafactory: apply-chat-template-dynamic @ template.py:595 | static |
| `megatron-checkpointing-py-wandb-checkpoint-hook-l1093-regex` | Megatron-LM | 5 · 数据与权重层 | megatron: wandb-checkpoint-hook @ checkpointing.py:1093 | static |
| `megatron-checkpointing-py-wandb-checkpoint-hook-l2725-regex` | Megatron-LM | 5 · 数据与权重层 | megatron: wandb-checkpoint-hook @ checkpointing.py:2725 | static |
| `msswift-base-py-apply-chat-template-dynamic-l1283-regex` | ms-swift | 5 · 数据与权重层 | msswift: apply-chat-template-dynamic @ base.py:1283 | static |
| `msswift-loader-py-load-dataset-any-l109-regex` | ms-swift | 5 · 数据与权重层 | msswift: load-dataset-any @ loader.py:109 | static |
| `msswift-loader-py-load-dataset-any-l253-regex` | ms-swift | 5 · 数据与权重层 | msswift: load-dataset-any @ loader.py:253 | static |
| `msswift-loader-py-load-dataset-any-l338-regex` | ms-swift | 5 · 数据与权重层 | msswift: load-dataset-any @ loader.py:338 | static |
| `msswift-loader-py-load-dataset-any-l341-regex` | ms-swift | 5 · 数据与权重层 | msswift: load-dataset-any @ loader.py:341 | static |
| `msswift-loader-py-load-dataset-any-l59-regex` | ms-swift | 5 · 数据与权重层 | msswift: load-dataset-any @ loader.py:59 | static |
| `msswift-sft-py-load-dataset-any-l84-regex` | ms-swift | 5 · 数据与权重层 | msswift: load-dataset-any @ sft.py:84 | static |
| `CGPU-ADV-2026-01` | cGPU | 6 · 租户与隔离层 | 策略型 GPU 隔离边界（无独立 CVE） | unsupported |
| `CVE-2024-0132` | NVIDIA toolkit | 6 · 租户与隔离层 | TOCTOU 容器逃逸 | unsupported |
| `CVE-2024-0133` | NVIDIA toolkit | 6 · 租户与隔离层 | 容器镜像在宿主创建空文件 | unsupported |
| `CVE-2025-23266` | NVIDIA toolkit | 6 · 租户与隔离层 | NVIDIAScape hook 路径劫持提权 | unsupported |
| `CVE-2025-23267` | NVIDIA toolkit | 6 · 租户与隔离层 | update-ldcache 链接跟随 | unsupported |
| `HAMI-ADV-2026-01` | HAMi | 6 · 租户与隔离层 | scheduler/device-plugin HTTP 面未认证 | unsupported |
| `transformers-dynamic-module-utils-py-dynamic-import-l248-ast` | transformers | 7 · 供应链与身份层 | transformers: dynamic-import @ transformers/dynamic_module_utils.py:248 | verified |
| `transformers-dynamic-module-utils-py-dynamic-import-l248-regex` | transformers | 7 · 供应链与身份层 | transformers: dynamic-import @ transformers/dynamic_module_utils.py:248 | verified |
| `CVE-2026-4993` | W&B | 7 · 供应链与身份层 | LITELLM_MASTER_KEY 硬编码凭据 | static |
| `LITELLM-DEFAULT-KEY` | LiteLLM | 7 · 供应链与身份层 | 默认/未设置 master key（sk-1234） | static |
| `trl-data-utils-py-missing-revision-l352-regex` | TRL | 7 · 供应链与身份层 | trl: missing-revision @ data_utils.py:352 | static |
| `trl-sft-py-trust-remote-code-propagated-l78-regex` | TRL | 7 · 供应链与身份层 | trl: trust-remote-code-propagated @ sft.py:78 | static |
| `trl-sft-trainer-py-missing-revision-l310-regex` | TRL | 7 · 供应链与身份层 | trl: missing-revision @ sft_trainer.py:310 | static |
| `trl-sft-trainer-py-missing-revision-l714-regex` | TRL | 7 · 供应链与身份层 | trl: missing-revision @ sft_trainer.py:714 | static |
| `trl-sft-trainer-py-trust-remote-code-propagated-l715-regex` | TRL | 7 · 供应链与身份层 | trl: trust-remote-code-propagated @ sft_trainer.py:715 | static |
| `trl-utils-py-missing-revision-l1354-regex` | TRL | 7 · 供应链与身份层 | trl: missing-revision @ utils.py:1354 | static |
| `trl-utils-py-missing-revision-l1366-regex` | TRL | 7 · 供应链与身份层 | trl: missing-revision @ utils.py:1366 | static |
| `trl-utils-py-missing-revision-l1431-regex` | TRL | 7 · 供应链与身份层 | trl: missing-revision @ utils.py:1431 | static |
| `trl-utils-py-trust-remote-code-propagated-l1354-regex` | TRL | 7 · 供应链与身份层 | trl: trust-remote-code-propagated @ utils.py:1354 | static |
| `CVE-2025-59425` | vLLM | 8 · 缓存安全层 | API key 校验时序侧信道 | static |
| `CVE-2026-15978` | SGLang | 8 · 缓存安全层 | 无 API key 时模型权重外泄 | static |
| `KUBERAY-ADV-2026-01` | KubeRay | 9 · 跨组合层 | KubeRay 管理的 Ray 集群暴露 Dashboard 未授权面 | static |
| `LWS-ADV-2026-01` | LWS | 9 · 跨组合层 | LWS leader/worker 拓扑信任与地址注入面 | static |
| `dradriver-process-go-exec-command-l94-regex` | DRA driver | 9 · 跨组合层 | dra-driver: exec-command-go @ cmd/compute-domain-daemon/process.go:94 | static |
| `gpuoperator-0500-daemonset-yaml-elevated-pod-spec-l108-regex` | GPU Operator | 9 · 跨组合层 | gpu-operator: elevated-pod-spec @ manifests/state-driver/0500_daemonset.yaml:108 | static |
| `gpuoperator-main-go-exec-command-l669-regex` | GPU Operator | 9 · 跨组合层 | gpu-operator: exec-command-go @ cmd/nvidia-validator/main.go:669 | static |
| `cephcsi-httpserver-go-pprof-exposed-l37-regex` | Ceph CSI | 10 · 防护绕过层 | ceph-csi: pprof-exposed-go @ internal/util/httpserver.go:37 | verified |
| `juicefscsi-controller-manager-go-go-bind-all-l71-regex` | JuiceFS CSI | 10 · 防护绕过层 | juicefs-csi: go-bind-all @ cmd/app/controller_manager.go:71 | verified |
| `kueue-server-go-pprof-exposed-l30-regex` | Kueue | 10 · 防护绕过层 | kueue kueueviz: pprof-exposed-go + default-disabled auth @ backend/config/server.go:30 | verified |
| `volcano-scheduler-server-go-pprof-exposed-l162-regex` | Volcano | 10 · 防护绕过层 | volcano: pprof-exposed-go @ cmd/scheduler/app/server.go:162 | verified |
| `CVE-2025-23374` | SONiC | 10 · 防护绕过层 | 日志敏感信息泄露 | unsupported |
| `GHSA-h26v-922j-28cg` | SONiC | 10 · 防护绕过层 | rsyslog 配置注入（welf_firewall_name） | unsupported |

## 附录 B：37 verified + 6 exposure 索引

这 43 条全部在正文有六段结构与本地 demo；本附录只给索引、正文锚点与 demo 路径。

| # | ID | 组件 | 层级 | 正文锚点 | 状态 | 演示 |
|---|---|---|---|---|---|---|
| 1 | `CVE-2025-29783` | vLLM | 1 | `L1-001` | verified | `demos/CVE-2025-29783/poc.py` |
| 2 | `CVE-2025-32444` | vLLM | 1 | `L1-002` | verified | `demos/CVE-2025-32444/poc.py` |
| 3 | `CVE-2025-47277` | vLLM | 1 | `L1-003` | verified | `demos/CVE-2025-47277/poc.py` |
| 4 | `CVE-2026-3059` | SGLang | 1 | `L1-004` | verified | `demos/CVE-2026-3059/poc.py` |
| 5 | `CVE-2026-3060` | SGLang | 1 | `L1-005` | verified | `demos/CVE-2026-3060/poc.py` |
| 6 | `CVE-2026-92972` | SGLang | 1 | `L1-006` | verified | `demos/CVE-2026-92972/poc.py` |
| 7 | `CVE-2023-48022` | Ray | 2 | `L2-001` | verified | `demos/CVE-2023-48022/poc.py` |
| 8 | `CVE-2023-48023` | Ray | 2 | `L2-002` | verified | `demos/CVE-2023-48023/poc.py` |
| 9 | `CVE-2026-40217` | LiteLLM | 2 | `L2-003` | verified | `demos/CVE-2026-40217/poc.py` |
| 10 | `CVE-2026-42203` | LiteLLM | 2 | `L2-004` | verified | `demos/CVE-2026-42203/poc.py` |
| 11 | `CVE-2026-53995` | MLflow | 2 | `L2-005` | verified | `demos/CVE-2026-53995/poc.py` |
| 12 | `llamafactory-app-py-bind-all-interfaces-l130-regex` | LLaMA-Factory | 2 | `L2-048` | exposure | N/A |
| 13 | `llamafactory-app-py-go-bind-all-l130-regex` | LLaMA-Factory | 2 | `L2-049` | exposure | N/A |
| 14 | `llamafactory-interface-py-bind-all-interfaces-l103-regex` | LLaMA-Factory | 2 | `L2-050` | exposure | N/A |
| 15 | `llamafactory-interface-py-bind-all-interfaces-l94-regex` | LLaMA-Factory | 2 | `L2-051` | exposure | N/A |
| 16 | `llamafactory-interface-py-go-bind-all-l103-regex` | LLaMA-Factory | 2 | `L2-052` | exposure | N/A |
| 17 | `llamafactory-interface-py-go-bind-all-l94-regex` | LLaMA-Factory | 2 | `L2-053` | exposure | N/A |
| 18 | `CVE-2024-0520` | MLflow | 5 | `L5-001` | verified | `demos/CVE-2024-0520/poc.py` |
| 19 | `CVE-2024-43497` | DeepSpeed | 5 | `L5-002` | verified | `demos/CVE-2024-43497/poc.py` |
| 20 | `CVE-2025-32434` | PyTorch | 5 | `L5-003` | verified | `demos/CVE-2025-32434/poc.py` |
| 21 | `CVE-2026-65110` | Megatron-LM | 5 | `L5-004` | verified | `demos/CVE-2026-65110/poc.py` |
| 22 | `deepspeed-stage3-py-torch-load-any-l3660-regex` | DeepSpeed | 5 | `L5-005` | verified | `demos/deepspeed-stage3-py-torch-load-any-l3660-regex/poc.py` |
| 23 | `deepspeed-stage3-py-torch-load-any-l3770-regex` | DeepSpeed | 5 | `L5-006` | verified | `demos/deepspeed-stage3-py-torch-load-any-l3770-regex/poc.py` |
| 24 | `deepspeed-stage3-py-torch-load-unsafe-l3660-ast` | DeepSpeed | 5 | `L5-007` | verified | `demos/deepspeed-stage3-py-torch-load-unsafe-l3660-ast/poc.py` |
| 25 | `deepspeed-stage3-py-torch-load-unsafe-l3660-regex` | DeepSpeed | 5 | `L5-008` | verified | `demos/deepspeed-stage3-py-torch-load-unsafe-l3660-regex/poc.py` |
| 26 | `deepspeed-stage3-py-torch-load-unsafe-l3770-ast` | DeepSpeed | 5 | `L5-009` | verified | `demos/deepspeed-stage3-py-torch-load-unsafe-l3770-ast/poc.py` |
| 27 | `llamafactory-checkpoint-py-torch-load-unsafe-l136-ast` | LLaMA-Factory | 5 | `L5-010` | verified | `demos/llamafactory-checkpoint-py-torch-load-unsafe-l136-ast/poc.py` |
| 28 | `llamafactory-checkpoint-py-torch-load-unsafe-l136-regex` | LLaMA-Factory | 5 | `L5-011` | verified | `demos/llamafactory-checkpoint-py-torch-load-unsafe-l136-regex/poc.py` |
| 29 | `llamafactory-checkpoint-py-torch-load-unsafe-l334-ast` | LLaMA-Factory | 5 | `L5-012` | verified | `demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-ast/poc.py` |
| 30 | `llamafactory-checkpoint-py-torch-load-unsafe-l334-regex` | LLaMA-Factory | 5 | `L5-013` | verified | `demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-regex/poc.py` |
| 31 | `megatron-checkpointing-py-torch-load-any-l1739-regex` | Megatron-LM | 5 | `L5-014` | verified | `demos/megatron-checkpointing-py-torch-load-any-l1739-regex/poc.py` |
| 32 | `msswift-indexed-dataset-py-pickle-loads-l112-ast` | ms-swift | 5 | `L5-015` | verified | `demos/msswift-indexed-dataset-py-pickle-loads-l112-ast/poc.py` |
| 33 | `msswift-indexed-dataset-py-pickle-loads-l112-regex` | ms-swift | 5 | `L5-016` | verified | `demos/msswift-indexed-dataset-py-pickle-loads-l112-regex/poc.py` |
| 34 | `msswift-indexed-dataset-py-pickle-loads-l129-ast` | ms-swift | 5 | `L5-017` | verified | `demos/msswift-indexed-dataset-py-pickle-loads-l129-ast/poc.py` |
| 35 | `msswift-indexed-dataset-py-pickle-loads-l129-regex` | ms-swift | 5 | `L5-018` | verified | `demos/msswift-indexed-dataset-py-pickle-loads-l129-regex/poc.py` |
| 36 | `msswift-torch-utils-py-pickle-loads-l340-ast` | ms-swift | 5 | `L5-019` | verified | `demos/msswift-torch-utils-py-pickle-loads-l340-ast/poc.py` |
| 37 | `msswift-torch-utils-py-pickle-loads-l340-regex` | ms-swift | 5 | `L5-020` | verified | `demos/msswift-torch-utils-py-pickle-loads-l340-regex/poc.py` |
| 38 | `transformers-dynamic-module-utils-py-dynamic-import-l248-ast` | transformers | 7 | `L7-001` | verified | `demos/transformers-dynamic-module-utils-py-dynamic-import-l248-ast/poc.py` |
| 39 | `transformers-dynamic-module-utils-py-dynamic-import-l248-regex` | transformers | 7 | `L7-002` | verified | `demos/transformers-dynamic-module-utils-py-dynamic-import-l248-regex/poc.py` |
| 40 | `cephcsi-httpserver-go-pprof-exposed-l37-regex` | Ceph CSI | 10 | `L10-001` | verified | `demos/cephcsi-httpserver-go-pprof-exposed-l37-regex/poc.py` |
| 41 | `juicefscsi-controller-manager-go-go-bind-all-l71-regex` | JuiceFS CSI | 10 | `L10-002` | verified | `demos/juicefscsi-controller-manager-go-go-bind-all-l71-regex/poc.py` |
| 42 | `kueue-server-go-pprof-exposed-l30-regex` | Kueue | 10 | `L10-003` | verified | `demos/kueue-server-go-pprof-exposed-l30-regex/poc.py` |
| 43 | `volcano-scheduler-server-go-pprof-exposed-l162-regex` | Volcano | 10 | `L10-004` | verified | `demos/volcano-scheduler-server-go-pprof-exposed-l162-regex/poc.py` |

## 附录 C：零日储备 39 条索引

本附录只给索引、披露状态、正文锚点与 demo 路径；demo 只演示本地仿真环境里的原语，不提供真实目标利用链。

| # | ID | 组件 | 层级 | 正文锚点 | 披露状态 | 演示 |
|---|---|---|---|---|---|---|
| 1 | `vllm-jev-plugin-auth-bypass` | vllm-jev | 2 | `L2-033` | undisclosed | `demos/vllm-jev-plugin-auth-bypass/poc.py` |
| 2 | `djev-open-proxy` | djev | 2 | `L2-014` | undisclosed | `demos/djev-open-proxy/poc.py` |
| 3 | `slime-pull-weights` | slime | 2 | `L2-028` | undisclosed | `demos/slime-pull-weights/poc.py` |
| 4 | `sglang-omni-admin-failopen` | sglang-omni | 2 | `L2-023` | undisclosed | `demos/sglang-omni-admin-failopen/poc.py` |
| 5 | `skyrl-vllm-devmode` | skyrl | 2 | `L2-027` | undisclosed | `demos/skyrl-vllm-devmode/poc.py` |
| 6 | `skyrl-tinker-api` | skyrl | 2 | `L2-026` | undisclosed | `demos/skyrl-tinker-api/poc.py` |
| 7 | `trl-vllm-serve-devmode` | TRL | 2 | `L2-030` | undisclosed | `demos/trl-vllm-serve-devmode/poc.py` |
| 8 | `areal-unauth-engine-control` | areal | 2 | `L2-008` | undisclosed | `demos/areal-unauth-engine-control/poc.py` |
| 9 | `areal-dataservice-pickle` | areal | 2 | `L2-007` | undisclosed | `demos/areal-dataservice-pickle/poc.py` |
| 10 | `openrlhf-serve-rm` | openrlhf | 2 | `L2-020` | undisclosed | `demos/openrlhf-serve-rm/poc.py` |
| 11 | `msswift-trust-remote-code` | ms-swift | 7 | `L7-003` | undisclosed | `demos/msswift-trust-remote-code/poc.py` |
| 12 | `verl-prime-code-exec` | verl | 2 | `L2-032` | undisclosed | `demos/verl-prime-code-exec/poc.py` |
| 13 | `verl-checkpoint-pickle` | verl | 5 | `L5-022` | undisclosed | `demos/verl-checkpoint-pickle/poc.py` |
| 14 | `skyrl-fetch-weights` | skyrl | 2 | `L2-025` | undisclosed | `demos/skyrl-fetch-weights/poc.py` |
| 15 | `openrlhf-vllm-insecure` | openrlhf | 2 | `L2-021` | undisclosed | `demos/openrlhf-vllm-insecure/poc.py` |
| 16 | `areal-v2-worker` | areal | 2 | `L2-009` | undisclosed | `demos/areal-v2-worker/poc.py` |
| 17 | `slime-torch-load` | slime | 2 | `L2-029` | undisclosed | `demos/slime-torch-load/poc.py` |
| 18 | `openjev-clef-release-module` | openjev | 2 | `L2-019` | undisclosed | `demos/openjev-clef-release-module/poc.py` |
| 19 | `msswift-eval-escape` | ms-swift | 2 | `L2-016` | undisclosed | `demos/msswift-eval-escape/poc.py` |
| 20 | `areal-awex` | areal | 2 | `L2-006` | undisclosed | `demos/areal-awex/poc.py` |
| 21 | `onejev-media-ssrf` | onejev | 2 | `L2-018` | undisclosed | `demos/onejev-media-ssrf/poc.py` |
| 22 | `llm2jev-image-file` | llm2jev | 2 | `L2-015` | undisclosed | `demos/llm2jev-image-file/poc.py` |
| 23 | `siliconlab-credential-exfil` | siliconlab | 2 | `L2-024` | undisclosed | N/A |
| 24 | `verl-hdfs-command-injection` | verl | 2 | `L2-031` | undisclosed | `demos/verl-hdfs-command-injection/poc.py` |
| 25 | `dify-shellctl-unauth-rce` | Dify | 2 | `L2-012` | undisclosed | `demos/dify-shellctl-unauth-rce/poc.py` |
| 26 | `dify-agent-auth-failopen` | Dify | 2 | `L2-010` | undisclosed | `demos/dify-agent-auth-failopen/poc.py` |
| 27 | `dify-stub-jwe-default-key` | Dify | 2 | `L2-013` | undisclosed | `demos/dify-stub-jwe-default-key/poc.py` |
| 28 | `dify-home-snapshot-cross-tenant` | Dify | 2 | `L2-011` | undisclosed | `demos/dify-home-snapshot-cross-tenant/poc.py` |
| 29 | `openwebui-code-interpreter-bypass` | Open WebUI | 2 | `L2-022` | undisclosed | `demos/openwebui-code-interpreter-bypass/poc.py` |
| 30 | `vllm-rl-dev-auth-bypass` | vLLM | 2 | `L2-034` | undisclosed | `demos/vllm-rl-dev-auth-bypass/poc.py` |
| 31 | `deepspeed-autoep-unsafe-load` | DeepSpeed | 5 | `L5-021` | undisclosed | `demos/deepspeed-autoep-unsafe-load/poc.py` |
| 32 | `msswift-media-local-read` | ms-swift | 2 | `L2-017` | undisclosed | `demos/msswift-media-local-read/poc.py` |
| 33 | `deepspeed-stage3-py-torch-load-any-l3660-regex` | DeepSpeed | 5 | `L5-005` | undisclosed | `demos/deepspeed-stage3-py-torch-load-any-l3660-regex/poc.py` |
| 34 | `deepspeed-stage3-py-torch-load-any-l3770-regex` | DeepSpeed | 5 | `L5-006` | undisclosed | `demos/deepspeed-stage3-py-torch-load-any-l3770-regex/poc.py` |
| 35 | `llamafactory-checkpoint-py-torch-load-unsafe-l334-ast` | LLaMA-Factory | 5 | `L5-012` | undisclosed | `demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-ast/poc.py` |
| 36 | `megatron-checkpointing-py-torch-load-any-l1739-regex` | Megatron-LM | 5 | `L5-014` | undisclosed | `demos/megatron-checkpointing-py-torch-load-any-l1739-regex/poc.py` |
| 37 | `msswift-indexed-dataset-py-pickle-loads-l112-ast` | ms-swift | 5 | `L5-015` | undisclosed | `demos/msswift-indexed-dataset-py-pickle-loads-l112-ast/poc.py` |
| 38 | `msswift-indexed-dataset-py-pickle-loads-l129-ast` | ms-swift | 5 | `L5-017` | undisclosed | `demos/msswift-indexed-dataset-py-pickle-loads-l129-ast/poc.py` |
| 39 | `msswift-torch-utils-py-pickle-loads-l340-ast` | ms-swift | 5 | `L5-019` | undisclosed | `demos/msswift-torch-utils-py-pickle-loads-l340-ast/poc.py` |

## 附录 D：static 与 unsupported 原因索引

这些条目在正文对应层仍给六段结构，攻击代码统一为 N/A 并写原因；本附录只做原因索引。

| ID | 组件 | 层级 | 状态 | 原因 |
|---|---|---|---|---|
| `NCCL-NCCLPLUGIN-HW` | NCCL | 1 | unsupported | NCCL v2.32.3-1: pure C/CUDA; plugin .so loading (NCCL_IB_HCA / NCCL_PLUGIN) needs the hardware path. Marked unsupported; attack-surface conclusions live in the fabric modules (nccl-collective-join, ib-subnet-manager-hija |
| `UCX-UCT-HW` | UCX | 1 | unsupported | UCX v1.22.0: C transport library. The ucx-py binding was mined separately (see ucxpy cases); the core library is hardware-bound and marked unsupported. |
| `CVE-2026-7301` | SGLang | 1 | static | v0.5.10 normalizes broker to 127.0.0.1; the catalog's 0.0.0.0 claim is not reproduced at this tag. |
| `ucxpy-server-py-pickle-loads-l42-regex` | UCX-Py | 1 | static | ucx-py debug-tests server deserialises a client-supplied cloudpickle payload (cloudpickle.loads(func)) with no authentication: any peer reaching the debug endpoint gets arbitrary code execution by design of the debug too |
| `CVE-2024-10220` | Kubernetes | 2 | static | kubelet gitRepo volume exec needs a Linux kubelet and API server; no cluster on Windows, static-only. |
| `CVE-2024-3177` | Kubernetes | 2 | static | envFrom mountable-secret bypass needs a Linux kubelet; static-only. |
| `CVE-2025-3466` | Dify | 2 | static | Dify code-node sandbox escape needs the dify-sandbox service/Node runtime; static-only. |
| `CVE-2025-56520` | Dify | 2 | static | RemoteFileUploadApi SSRF needs the Dify API stack; static-only. |
| `CVE-2025-63387` | Dify | 2 | static | System-features unauthenticated endpoint needs the Dify console/API stack; static-only. |
| `CVE-2025-64496` | Open WebUI | 2 | static | Direct Connections SSE injection needs the Open WebUI frontend/service; static-only. |
| `CVE-2026-28786` | Open WebUI | 2 | static | Transcription filename/error leak needs the Open WebUI service; static-only. |
| `CVE-2026-28788` | Open WebUI | 2 | static | Batch-retrieval overwrite needs Open WebUI API/DB; static-only. |
| `CVE-2026-32981` | Ray | 2 | static | Advisory-only case; no upstream sink was located for it. Live check on the pinned 2.8.0 dashboard: http_server_head.py installs path_clean_middleware (line 130) which resolves the request path and rejects anything outsid |
| `CVE-2026-35029` | LiteLLM | 2 | static | Handler itself has no admin check, but non-admin route guards may block; low-priv DB-backed key not built, static-only. |
| `CVE-2026-42208` | LiteLLM | 2 | static | SQL injection claim not resolved to a concrete unparameterized sink in 1.82.0; advisory-level static triage only. |
| `CVE-2026-47102` | LiteLLM | 2 | static | Self-promotion path requires a DB-backed low-privilege user; not reproduced without Prisma/Postgres, static-only. |
| `CVE-2026-7302` | SGLang | 2 | static | Filename join lacks normalization; static-only because the upload route needs a full encoder service. |
| `trl-data-utils-py-apply-chat-template-dynamic-l167-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l194-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l213-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l226-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l238-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l250-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l269-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l277-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l303-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l357-regex` | TRL | 2 | static | Documentation/example line, no runtime sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l362-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-data-utils-py-apply-chat-template-dynamic-l395-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-sft-py-load-dataset-any-l96-regex` | TRL | 2 | static | Dataset loading is intended functionality; remote dataset trust is a documented boundary. |
| `trl-sft-trainer-py-apply-chat-template-dynamic-l394-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-sft-trainer-py-apply-chat-template-dynamic-l436-regex` | TRL | 2 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `trl-sft-trainer-py-load-dataset-any-l527-regex` | TRL | 2 | static | Dataset loading is intended functionality; remote dataset trust is a documented boundary. |
| `CVE-2013-4786` | BMC/Redfish | 3 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2017-12542` | BMC/Redfish | 3 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2020-15257` | containerd | 3 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2022-0492` | Linux kernel | 3 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2023-34329` | BMC/Redfish | 3 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2024-21626` | runc | 3 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2025-31133` | runc | 3 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `OPENBMC-BMCWEB-REDfish-HW` | BMC/Redfish | 3 | unsupported | OpenBMC/BTI/Redfish: bmcweb (C++), phosphor daemons and the IPMI BT interface are firmware/hardware paths; explicitly unsupported on this host. Existing BMC-surface conclusions live in the bmc-ipmi-exposure and redfish-d |
| `cephcsi-cephcsi-go-bind-all-l255-regex` | Ceph CSI | 3 | static | cephcsi defaults MetricsIP to 0.0.0.0; the same default-mux listener serves the unauthenticated pprof endpoints verified dynamically in cephcsi-httpserver-go-pprof-exposed-l37-regex. This entry pins the bind-all default  |
| `CVE-2025-33180` | Cumulus/NVUE | 4 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2025-38741` | SONiC | 4 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2026-24184` | Cumulus/NVUE | 4 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `sonicrestapi-default-go-exec-command-l1881-regex` | SONiC REST API | 4 | static | SONiC REST PingPost builds the ping argv from request JSON (ip_address, count '-c ' concatenation, vnet_id). argv-list exec means no shell metacharacters, but option injection into ping and unauthenticated-by-default RES |
| `megatron-checkpointing-py-torch-load-any-l2796-regex` | Megatron-LM | 5 | unsupported | torch.load at checkpointing.py:2796 is a real unpinned sink, but its only caller load_biencoder_checkpoint passes args.use_distributed_optimizer positionally into get_checkpoint_name(release=...) and also passes release= |
| `CVE-2024-37061` | MLflow | 5 | static | Malicious MLproject execution is the documented project runner trust model; no safe-vs-vulnerable boundary reproduced, static-only. |
| `CVE-2025-23354` | Megatron-LM | 5 | static | ensemble_classifier script injection needs a Megatron training/checkpoint config; no dynamic path imported, static-only. |
| `CVE-2025-33247` | Megatron-LM | 5 | static | Quantization config loading needs a full Megatron training run; static-only. |
| `deepspeed-engine-py-env-rank-read-l1964-regex` | DeepSpeed | 5 | static | Rule hit is a legitimate framework call; no untrusted-data sink is reached. |
| `deepspeed-engine-py-env-rank-read-l1966-regex` | DeepSpeed | 5 | static | Rule hit is a legitimate framework call; no untrusted-data sink is reached. |
| `deepspeed-engine-py-eval-call-l2889-regex` | DeepSpeed | 5 | static | Rule hit is a legitimate framework call; no untrusted-data sink is reached. |
| `deepspeed-multinode-runner-py-subprocess-popen-l457-regex` | DeepSpeed | 5 | static | Rule hit is a legitimate framework call; no untrusted-data sink is reached. |
| `deepspeed-runner-py-subprocess-popen-l489-regex` | DeepSpeed | 5 | static | Rule hit is a legitimate framework call; no untrusted-data sink is reached. |
| `deepspeed-runner-py-subprocess-popen-l504-regex` | DeepSpeed | 5 | static | Rule hit is a legitimate framework call; no untrusted-data sink is reached. |
| `deepspeed-runner-py-subprocess-popen-l619-regex` | DeepSpeed | 5 | static | Rule hit is a legitimate framework call; no untrusted-data sink is reached. |
| `deepspeed-runner-py-subprocess-popen-l625-regex` | DeepSpeed | 5 | static | Rule hit is a legitimate framework call; no untrusted-data sink is reached. |
| `deepspeed-stage3-py-torch-load-any-l3616-regex` | DeepSpeed | 5 | static | Unsafe torch.load without weights_only; duplicate of CVE-2026-65110 at a newer tag. 0.19.2 import needs triton/GPU on this host, so the candidate itself is not dynamically reproduced. |
| `llamafactory-fsdp2-py-torch-load-any-l517-regex` | LLaMA-Factory | 5 | static | FSDP2 plugin loads full-checkpoint state with torch.load(ckpt_file, map_location='cpu') and no weights_only pin. On torch>=2.6 the weights_only default is True, so the unpickling surface is closed on current stacks; on t |
| `llamafactory-loader-py-eval-call-l211-ast` | LLaMA-Factory | 5 | static | False positive: the matched text is model.eval(), not Python eval(). |
| `llamafactory-loader-py-eval-call-l211-regex` | LLaMA-Factory | 5 | static | False positive: the matched text is model.eval(), not Python eval(). |
| `llamafactory-loader-py-missing-revision-l104-regex` | LLaMA-Factory | 5 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `llamafactory-loader-py-missing-revision-l128-regex` | LLaMA-Factory | 5 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `llamafactory-loader-py-missing-revision-l172-regex` | LLaMA-Factory | 5 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `llamafactory-loader-py-missing-revision-l186-regex` | LLaMA-Factory | 5 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `llamafactory-loader-py-missing-revision-l78-regex` | LLaMA-Factory | 5 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `llamafactory-loader-py-missing-revision-l86-regex` | LLaMA-Factory | 5 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `llamafactory-loader-py-missing-revision-l98-regex` | LLaMA-Factory | 5 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `llamafactory-loader-py-trust-remote-code-propagated-l170-regex` | LLaMA-Factory | 5 | static | Explicit trust_remote_code opt-in; requires a malicious model repository and user consent. Not a vulnerability by itself. |
| `llamafactory-template-py-apply-chat-template-dynamic-l584-regex` | LLaMA-Factory | 5 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `llamafactory-template-py-apply-chat-template-dynamic-l587-regex` | LLaMA-Factory | 5 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `llamafactory-template-py-apply-chat-template-dynamic-l591-regex` | LLaMA-Factory | 5 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `llamafactory-template-py-apply-chat-template-dynamic-l595-regex` | LLaMA-Factory | 5 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `megatron-checkpointing-py-wandb-checkpoint-hook-l1093-regex` | Megatron-LM | 5 | static | Rule hit is a legitimate framework call; no untrusted-data sink is reached. |
| `megatron-checkpointing-py-wandb-checkpoint-hook-l2725-regex` | Megatron-LM | 5 | static | Rule hit is a legitimate framework call; no untrusted-data sink is reached. |
| `msswift-base-py-apply-chat-template-dynamic-l1283-regex` | ms-swift | 5 | static | Chat-template rendering is data transformation inside the tokenizer; no code-execution sink. |
| `msswift-loader-py-load-dataset-any-l109-regex` | ms-swift | 5 | static | Dataset loading is intended functionality; remote dataset trust is a documented boundary. |
| `msswift-loader-py-load-dataset-any-l253-regex` | ms-swift | 5 | static | Dataset loading is intended functionality; remote dataset trust is a documented boundary. |
| `msswift-loader-py-load-dataset-any-l338-regex` | ms-swift | 5 | static | Dataset loading is intended functionality; remote dataset trust is a documented boundary. |
| `msswift-loader-py-load-dataset-any-l341-regex` | ms-swift | 5 | static | Dataset loading is intended functionality; remote dataset trust is a documented boundary. |
| `msswift-loader-py-load-dataset-any-l59-regex` | ms-swift | 5 | static | Dataset loading is intended functionality; remote dataset trust is a documented boundary. |
| `msswift-sft-py-load-dataset-any-l84-regex` | ms-swift | 5 | static | Dataset loading is intended functionality; remote dataset trust is a documented boundary. |
| `CGPU-ADV-2026-01` | cGPU | 6 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2024-0132` | NVIDIA toolkit | 6 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2024-0133` | NVIDIA toolkit | 6 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2025-23266` | NVIDIA toolkit | 6 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2025-23267` | NVIDIA toolkit | 6 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `HAMI-ADV-2026-01` | HAMi | 6 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `CVE-2026-4993` | W&B | 7 | static | Catalog metadata is inconsistent (LITELLM_MASTER_KEY under wandb); advisory-level triage only. |
| `LITELLM-DEFAULT-KEY` | LiteLLM | 7 | static | Default/master-key misconfiguration is deployment-dependent; no upstream version boundary, static-only. |
| `trl-data-utils-py-missing-revision-l352-regex` | TRL | 7 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `trl-sft-py-trust-remote-code-propagated-l78-regex` | TRL | 7 | static | Explicit trust_remote_code opt-in; requires a malicious model repository and user consent. Not a vulnerability by itself. |
| `trl-sft-trainer-py-missing-revision-l310-regex` | TRL | 7 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `trl-sft-trainer-py-missing-revision-l714-regex` | TRL | 7 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `trl-sft-trainer-py-trust-remote-code-propagated-l715-regex` | TRL | 7 | static | Explicit trust_remote_code opt-in; requires a malicious model repository and user consent. Not a vulnerability by itself. |
| `trl-utils-py-missing-revision-l1354-regex` | TRL | 7 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `trl-utils-py-missing-revision-l1366-regex` | TRL | 7 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `trl-utils-py-missing-revision-l1431-regex` | TRL | 7 | static | Missing revision pin is a supply-chain hygiene gap; no direct exploit primitive. |
| `trl-utils-py-trust-remote-code-propagated-l1354-regex` | TRL | 7 | static | Explicit trust_remote_code opt-in; requires a malicious model repository and user consent. Not a vulnerability by itself. |
| `CVE-2025-59425` | vLLM | 8 | static | String comparison of API key is not constant-time; timing oracle not reproduced, so static-only. |
| `CVE-2026-15978` | SGLang | 8 | static | API-key fail-open branch is visible; weight exfiltration needs a live GPU server, so static-only. |
| `KUBERAY-ADV-2026-01` | KubeRay | 9 | static | KubeRay-managed Ray exposure is a deployment pattern, not a single upstream sink; static-only. |
| `LWS-ADV-2026-01` | LWS | 9 | static | LWS leader/worker address trust is a topology/CRD issue; static-only. |
| `dradriver-process-go-exec-command-l94-regex` | DRA driver | 9 | static | The compute-domain daemon executes m.cmd from its config (ConfigMap-sourced). The sink is real but the input is admin-controlled config, not tenant PVC data; recorded as a config-trust boundary for DRA deployments, plus  |
| `gpuoperator-0500-daemonset-yaml-elevated-pod-spec-l108-regex` | GPU Operator | 9 | static | The NVIDIA driver DaemonSet combines hostNetwork: true, privileged containers and hostPath mounts of /, /dev, /sys, kernel modules and container runtime sockets - the canonical privileged-node posture. Any container esca |
| `gpuoperator-main-go-exec-command-l669-regex` | GPU Operator | 9 | static | NVIDIA GPU Operator validator pods run privileged with hostPath mounts (see 0500_daemonset posture case) and execute shell/nvidia-smi via runCommand. Callers are fixed in-tree (shell/nvidiaSMIPath), so the exec sink is n |
| `CVE-2025-23374` | SONiC | 10 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |
| `GHSA-h26v-922j-28cg` | SONiC | 10 | unsupported | Hardware/OS-dependent path; not exercised on this host. Not counted as verified. |

共 109 条：87 static + 22 unsupported。static 不等于可利用，unsupported 不等于不存在。

## 附录 E：286 模板索引

按系列给计数与代表键；每个模板都有 `template.json`，由 Rust 探针执行。

| 系列 | 模板数 | 代表键 |
|---|---:|---|
| 侦察 | 67 | `exposure-mapping`、`ai-infra-baseline`、`kubelet-surface` |
| 横向利用 | 66 | `vllm-plugin-auth-bypass`、`areal-setenv-engine-rce`、`nccl-collective-join` |
| 网络架构 | 52 | `prefill-decode-kv-channel-unauth`、`rail-mismatch-forcing`、`sharp-in-network-poison` |
| 权限链 | 43 | `kuberay-operator-escalation`、`lws-secrets-lateral`、`vllm-operator-rbac-escalation` |
| 核心代码 | 22 | `vllm-pickle-pipe-rce`、`msswift-trust-remote-code`、`supply-chain-pinning` |
| 窃取与数据泄露 | 19 | `prefix-cache-cross-tenant-leak`、`cache-timing-sidechannel`、`shared-volume-weight-copy` |
| 混合云 | 11 | `cloud-irsa-trust-wildcard`、`multi-cloud-imds-credentials`、`cloud-bucket-cross-tenant` |
| 情报 | 6 | `data-provenance-audit`、`inference-tenant-isolation-baseline`、`reward-hacking-detect` |
## 附录 F：B/C 攻击演示索引

每个可运行 demo 都只监听 127.0.0.1、写 benign marker、默认 cleanup；N/A 条目写原因。代码块在正文，不在本附录。

| ID | 层级 | 演示 | 状态 | sha256 |
|---|---|---|---|---|
| `CVE-2025-29783` | 1 | `demos/CVE-2025-29783/poc.py` | runnable | `0324dc6fcd6978f9ad991d49852b4eb9e6addd103b3d5766f48d61a7b085abb6` |
| `CVE-2025-32444` | 1 | `demos/CVE-2025-32444/poc.py` | runnable | `d7d963157b72645f6800c7612eb0da5038838303498276a3dee7555bff986026` |
| `CVE-2025-47277` | 1 | `demos/CVE-2025-47277/poc.py` | runnable | `bdc98ee154820ef928a3182e0ba96f830a25132c74df3fe936f65f75ee25a294` |
| `CVE-2026-3059` | 1 | `demos/CVE-2026-3059/poc.py` | runnable | `66f55003e9e2c37f65120687b15b27cf747bf68081f74587edc5bcc089def96f` |
| `CVE-2026-3060` | 1 | `demos/CVE-2026-3060/poc.py` | runnable | `9eb3649fa8c757ed49168e81065fb7b21805ab865cb30e317cd4b87e19a39488` |
| `CVE-2026-92972` | 1 | `demos/CVE-2026-92972/poc.py` | runnable | `34b5e9c83c974234068e85a5dafe809332fed9492a4e4f84f36ca1155b075a23` |
| `CVE-2023-48022` | 2 | `demos/CVE-2023-48022/poc.py` | runnable | `15f080292e1c588e4183c81b51f8ec267ce8d4a0ba12103748a6e543baead6d9` |
| `CVE-2023-48023` | 2 | `demos/CVE-2023-48023/poc.py` | runnable | `19dd74917745379485fc4e9153a080923f8fe76c387ba2afa77339f200981bcd` |
| `CVE-2026-40217` | 2 | `demos/CVE-2026-40217/poc.py` | runnable | `cd2a9d52e7ce9db6cd56dcfa3ba1ff47e5bd2ffc7c46cc8e4014d5eaafb4680f` |
| `CVE-2026-42203` | 2 | `demos/CVE-2026-42203/poc.py` | runnable | `44edc6137ce1e8d4c49708d65a6820c28fa196359a7c2ddc84c3014437d0a8e5` |
| `CVE-2026-53995` | 2 | `demos/CVE-2026-53995/poc.py` | runnable | `df8e6e9655db78d4c65375b0257b34a1988bea2a5724dcce7037db0663cda987` |
| `areal-awex` | 2 | `demos/areal-awex/poc.py` | runnable | `2d6ba566c5a75d47c1157e95e3b4d48bec31d5e3be94df6fe3cee15cf01dbadf` |
| `areal-dataservice-pickle` | 2 | `demos/areal-dataservice-pickle/poc.py` | runnable | `0977b15b262f6326f19465c00c7417af54381de9cfeaba3702c4c3afa340f028` |
| `areal-unauth-engine-control` | 2 | `demos/areal-unauth-engine-control/poc.py` | runnable | `afad46b694830e85dd3ea34fd039b30808d2aff6fbba6ba0dc1b9e9bcbd321ac` |
| `areal-v2-worker` | 2 | `demos/areal-v2-worker/poc.py` | runnable | `938ae4b534d7824a9a8afa6835827813f4266f819c05341c4ca9457944fc4caf` |
| `dify-agent-auth-failopen` | 2 | `demos/dify-agent-auth-failopen/poc.py` | runnable | `96358c86bff2dc00d8cdaa2f4af8ea6368e0c468a33d0a7d454d218ab312621e` |
| `dify-home-snapshot-cross-tenant` | 2 | `demos/dify-home-snapshot-cross-tenant/poc.py` | runnable | `317065e9e59960120c1e7ac1502d0346f860fc7b13a65d473be77090c3190f80` |
| `dify-shellctl-unauth-rce` | 2 | `demos/dify-shellctl-unauth-rce/poc.py` | runnable | `282eb51515afbebf1f876e8a47e29957fac177723bc5bb04673f07ab5f738c61` |
| `dify-stub-jwe-default-key` | 2 | `demos/dify-stub-jwe-default-key/poc.py` | runnable | `c88540e3214f9043f65bb392526f7531cc801f2ffb78a1b09f8d9cc557468e04` |
| `djev-open-proxy` | 2 | `demos/djev-open-proxy/poc.py` | runnable | `e071ee4ca1896a5b3559adc9c1def07c5e11a1087136e45c01ca2c7d3ae5733b` |
| `llamafactory-app-py-bind-all-interfaces-l130-regex` | 2 | — | N/A | — |
| `llamafactory-app-py-go-bind-all-l130-regex` | 2 | — | N/A | — |
| `llamafactory-interface-py-bind-all-interfaces-l103-regex` | 2 | — | N/A | — |
| `llamafactory-interface-py-bind-all-interfaces-l94-regex` | 2 | — | N/A | — |
| `llamafactory-interface-py-go-bind-all-l103-regex` | 2 | — | N/A | — |
| `llamafactory-interface-py-go-bind-all-l94-regex` | 2 | — | N/A | — |
| `llm2jev-image-file` | 2 | `demos/llm2jev-image-file/poc.py` | runnable | `58faf2615670836d99cd8d968808f6b1fbd7a4cc0e5cad75fd716435f5dcdeba` |
| `msswift-eval-escape` | 2 | `demos/msswift-eval-escape/poc.py` | runnable | `27f5a3b892d09aa087974ce4662063e0ec90b64264c786f1473cdcfd0557f820` |
| `msswift-media-local-read` | 2 | `demos/msswift-media-local-read/poc.py` | runnable | `bffbda175498547d86e002eb38b1d35f4a35240b4774b037f4a8ec713b19b670` |
| `onejev-media-ssrf` | 2 | `demos/onejev-media-ssrf/poc.py` | runnable | `e772788276c6d04244350fded06cd1976d9f09ce6603504e457076f47c996cbb` |
| `openjev-clef-release-module` | 2 | `demos/openjev-clef-release-module/poc.py` | runnable | `3601aa01e58a0f037c6a815b8cff3d627defb8e9c2e1ec3eec2edc5f4ff602cb` |
| `openrlhf-serve-rm` | 2 | `demos/openrlhf-serve-rm/poc.py` | runnable | `68bf7bf5bce11b991ac56b5759c7ebaf3857a380a7395b623253aec6c7594c8f` |
| `openrlhf-vllm-insecure` | 2 | `demos/openrlhf-vllm-insecure/poc.py` | runnable | `84ddfb00f00655b2242b124e9595add98280f3435ce5969050fe2a65c15d10c0` |
| `openwebui-code-interpreter-bypass` | 2 | `demos/openwebui-code-interpreter-bypass/poc.py` | runnable | `e94b27a105e671afa94b463b31781b8eb1cfa4f836cfd7a3f16cfc440af3fcdd` |
| `sglang-omni-admin-failopen` | 2 | `demos/sglang-omni-admin-failopen/poc.py` | runnable | `cde4eff95f2a1218affb2ee518b2b7899ae7b0b2fd51bde66e2157a887bb30f6` |
| `siliconlab-credential-exfil` | 2 | — | N/A | — |
| `skyrl-fetch-weights` | 2 | `demos/skyrl-fetch-weights/poc.py` | runnable | `736647e2ae583340c32536ab199fca320195f37f23bd11916f9c3d7935dfd6c7` |
| `skyrl-tinker-api` | 2 | `demos/skyrl-tinker-api/poc.py` | runnable | `1da114c14659dbb7aa15cf9658f0e34e5e98623c9e1134680c1fac43160165e0` |
| `skyrl-vllm-devmode` | 2 | `demos/skyrl-vllm-devmode/poc.py` | runnable | `ac11ab8eb2058973f5f6d1d20040b74ad296abc6f621da6e420b4ffb472861ef` |
| `slime-pull-weights` | 2 | `demos/slime-pull-weights/poc.py` | runnable | `050c01f3e032233a418fcfc0b970932d7feda13549f5df57bcef7d4db4fda952` |
| `slime-torch-load` | 2 | `demos/slime-torch-load/poc.py` | runnable | `a826828d849b43fb92933f16494266ae4f48e0a33f57bb4e684391f7554d85ac` |
| `trl-vllm-serve-devmode` | 2 | `demos/trl-vllm-serve-devmode/poc.py` | runnable | `44f1c8632f261fad60d13ca1bb931a0327812d147f1534667510374692f83cb7` |
| `verl-hdfs-command-injection` | 2 | `demos/verl-hdfs-command-injection/poc.py` | runnable | `0e394a8141f48396508b5f0d03dafbe84817f23a1194beb8c2bf5530377969c8` |
| `verl-prime-code-exec` | 2 | `demos/verl-prime-code-exec/poc.py` | runnable | `d9f7a00039a283bc116a7efd1b258ba8f67bee3e3504df0dccecd3fb1662690a` |
| `vllm-jev-plugin-auth-bypass` | 2 | `demos/vllm-jev-plugin-auth-bypass/poc.py` | runnable | `5662ec3b0759aca43f6dea2174c5cbbc32645837eb8d3fd0bdae781fc296062e` |
| `vllm-rl-dev-auth-bypass` | 2 | `demos/vllm-rl-dev-auth-bypass/poc.py` | runnable | `cee7adfe4a1cd7dc471bc8e505a3fed2826d9af6e8c875fe992116762ab5758e` |
| `CVE-2024-0520` | 5 | `demos/CVE-2024-0520/poc.py` | runnable | `aad323864515ad951c54c76b1c812691e74430b10456dff7345bfa6938496fe2` |
| `CVE-2024-43497` | 5 | `demos/CVE-2024-43497/poc.py` | runnable | `159e00af1be7d042871a1fa93a254704e0ae3b8a655cb59794aaaf3340f04d8b` |
| `CVE-2025-32434` | 5 | `demos/CVE-2025-32434/poc.py` | runnable | `8a354a802cf54034669dcf604df193d738900ef47cb87896c3ab94764bd6ba85` |
| `CVE-2026-65110` | 5 | `demos/CVE-2026-65110/poc.py` | runnable | `c5919998f584f4346db3771d9f2d529b814948b36015cbac372b7cbab716f249` |
| `deepspeed-autoep-unsafe-load` | 5 | `demos/deepspeed-autoep-unsafe-load/poc.py` | runnable | `634981f1cb747b3e12bc14609f245168a7aa2631cf16600c29fc1430a457cdd1` |
| `deepspeed-stage3-py-torch-load-any-l3660-regex` | 5 | `demos/deepspeed-stage3-py-torch-load-any-l3660-regex/poc.py` | runnable | `6e989087d9a49f6bba1cb49778c44c396f21f2801a52b0898972e4e66ec76963` |
| `deepspeed-stage3-py-torch-load-any-l3770-regex` | 5 | `demos/deepspeed-stage3-py-torch-load-any-l3770-regex/poc.py` | runnable | `8ece2d7639a82cf775c44b90eb0ac686a5e5f88ba989c9d7bd4c26fb5ef64584` |
| `deepspeed-stage3-py-torch-load-unsafe-l3660-ast` | 5 | `demos/deepspeed-stage3-py-torch-load-unsafe-l3660-ast/poc.py` | runnable | `7a52c1aec39307d115f18e25c0e0a3019636d2a4f6f9418abbce3c06aaac5cde` |
| `deepspeed-stage3-py-torch-load-unsafe-l3660-regex` | 5 | `demos/deepspeed-stage3-py-torch-load-unsafe-l3660-regex/poc.py` | runnable | `e1defdf4d58ddcc421b297bf4e0d967a875fdfd0174097536016738fe5a094f6` |
| `deepspeed-stage3-py-torch-load-unsafe-l3770-ast` | 5 | `demos/deepspeed-stage3-py-torch-load-unsafe-l3770-ast/poc.py` | runnable | `9c4cd79b96d8fa3ccf6f0718a4ce146160cc6c122a7fccc7fe0b7e51296949e5` |
| `llamafactory-checkpoint-py-torch-load-unsafe-l136-ast` | 5 | `demos/llamafactory-checkpoint-py-torch-load-unsafe-l136-ast/poc.py` | runnable | `456bb10cd4c3906991ff0d9965538047edc21f158b2623cc87f573deeb7abb49` |
| `llamafactory-checkpoint-py-torch-load-unsafe-l136-regex` | 5 | `demos/llamafactory-checkpoint-py-torch-load-unsafe-l136-regex/poc.py` | runnable | `a71813f50c39a210f7c70a6ac5559fa29d9f94f94b276a9dd679adb720a70e53` |
| `llamafactory-checkpoint-py-torch-load-unsafe-l334-ast` | 5 | `demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-ast/poc.py` | runnable | `8b6ee4613cee68373fdb904c823154d326848cde5394318aace5cd448f71f0d3` |
| `llamafactory-checkpoint-py-torch-load-unsafe-l334-regex` | 5 | `demos/llamafactory-checkpoint-py-torch-load-unsafe-l334-regex/poc.py` | runnable | `a44eeaa463219cbf59f32ab32d2d0346182d22ce5eccc5b05f9165258cdb69a0` |
| `megatron-checkpointing-py-torch-load-any-l1739-regex` | 5 | `demos/megatron-checkpointing-py-torch-load-any-l1739-regex/poc.py` | runnable | `fdce4fa53c77ca791ad17c0641f23e260f7e473fb08eb50ffb5ac528552faf05` |
| `msswift-indexed-dataset-py-pickle-loads-l112-ast` | 5 | `demos/msswift-indexed-dataset-py-pickle-loads-l112-ast/poc.py` | runnable | `55c4fd9922a233ce21b95e6e5bc63a8a475ea19ba469fcf47e3ef2738bf7ac05` |
| `msswift-indexed-dataset-py-pickle-loads-l112-regex` | 5 | `demos/msswift-indexed-dataset-py-pickle-loads-l112-regex/poc.py` | runnable | `11f85f8519a88de34883ee5be0288b16144760809843eb848cdaf3725ee3ef7f` |
| `msswift-indexed-dataset-py-pickle-loads-l129-ast` | 5 | `demos/msswift-indexed-dataset-py-pickle-loads-l129-ast/poc.py` | runnable | `4a9d8e96157e339ce70cea449944bf61b75b62c16b405bd8848e460b41b6dd3f` |
| `msswift-indexed-dataset-py-pickle-loads-l129-regex` | 5 | `demos/msswift-indexed-dataset-py-pickle-loads-l129-regex/poc.py` | runnable | `09b9fd42029f78cbc5c2a66cf348fbbd559ea9596e8fd2119d78b46f9d6e91d4` |
| `msswift-torch-utils-py-pickle-loads-l340-ast` | 5 | `demos/msswift-torch-utils-py-pickle-loads-l340-ast/poc.py` | runnable | `d56ed7aee210da8389de34f9eb5e99c07b6adc24a075c2f761e4a20268d82c76` |
| `msswift-torch-utils-py-pickle-loads-l340-regex` | 5 | `demos/msswift-torch-utils-py-pickle-loads-l340-regex/poc.py` | runnable | `db6d09db35a02d560fec8f6adabd82303957d0133b8453829bc76de2b810bf5d` |
| `verl-checkpoint-pickle` | 5 | `demos/verl-checkpoint-pickle/poc.py` | runnable | `01e421b8983787144b2851455ee52735b66c4f1d6059d79e7d3f97cbec698894` |
| `msswift-trust-remote-code` | 7 | `demos/msswift-trust-remote-code/poc.py` | runnable | `0b54465f16d1d0ad4a92cd7f462ba6f27d97d2148a0924a15119a1d11c3ea86a` |
| `transformers-dynamic-module-utils-py-dynamic-import-l248-ast` | 7 | `demos/transformers-dynamic-module-utils-py-dynamic-import-l248-ast/poc.py` | runnable | `2d400b04a64ead89db892462b6b6e0bf1785226b38c8a327c25bd3de0bda6492` |
| `transformers-dynamic-module-utils-py-dynamic-import-l248-regex` | 7 | `demos/transformers-dynamic-module-utils-py-dynamic-import-l248-regex/poc.py` | runnable | `7e8c004d72fc08bb711ac64e03aaf35e8f04738af6058c22cb1e1d009ba275c2` |
| `cephcsi-httpserver-go-pprof-exposed-l37-regex` | 10 | `demos/cephcsi-httpserver-go-pprof-exposed-l37-regex/poc.py` | runnable | `e90d62c46f63ee37157d989c7ec0487aa325a138a33939718012a8379b6a6887` |
| `juicefscsi-controller-manager-go-go-bind-all-l71-regex` | 10 | `demos/juicefscsi-controller-manager-go-go-bind-all-l71-regex/poc.py` | runnable | `3e143f80a752ad8f4e5994d013b41a5929662e96a60437acfdd71aea5c910436` |
| `kueue-server-go-pprof-exposed-l30-regex` | 10 | `demos/kueue-server-go-pprof-exposed-l30-regex/poc.py` | runnable | `08beb3c15897425c7d93aeb0e4aaf1d79663cfef4c293d3e9d8f2c7fdc660b8b` |
| `volcano-scheduler-server-go-pprof-exposed-l162-regex` | 10 | `demos/volcano-scheduler-server-go-pprof-exposed-l162-regex/poc.py` | runnable | `703d09f7fc808ea43fb3b6ea7a09270c64ea474252983cd89d51f886b24a39de` |
