READMESource: main@db90c2a0
dsh-egress-audit
只读的「数据外发」审计面板:显示 DeepSeek Harness 和它加载的插件把数据发往了哪里、发的是哪一类内容、有没有被拦截。
入口在 设置 → 数据外发。
它做什么
- 观测 Harness 宿主进程的出网:
globalThis.fetch、net.Socket#connect(兜底,覆盖直接调用 undici 的代码)、模型流llm/stream、工具调用tools/pre-execute/tools/post-execute。 - 每个目的地给一个分级(官方已知 / 本机 / 外部第三方 / 疑似伪装)和可解释的标记(形近字域名、夹带官方名、形近官方域名、直接用 IP、局域网、明文传输、非常规端口)。
- 在内存里留最近 1 小时的记录,通过
/dsh-egress/snapshot.json以只读 GET 提供给面板。
它不做什么
- 不发起任何自己的网络请求;
- 不写磁盘、不读你的历史/配置/凭证;
- 不保存请求或响应正文,也不保存
Authorization之类的头; - 不拦截、不改写、不重试、不延迟任何流量;
- 面板上的「隐藏」只是把行收起来,记录和计数都不变。
权限与实现说明
审计要看得见别人的出网,就不可能不碰出口。这个插件只做两处包装,均为透传:
| 包装点 | 目的 | 是否改变行为 |
|---|---|---|
globalThis.fetch |
看到请求 URL、方法、发起方、状态码 | 否——原样调用原函数、原样返回响应,不读也不改动响应体 |
net.Socket.prototype.connect |
看到不经过 fetch 的 TCP 连接(例如工具直接调用 undici 的 fetch) |
否——参数原样转发给原函数 |
两处包装都用 Symbol.for(...) 做了幂等标记,重复加载不会叠加;卸载时通过 ctx.effect 的清理函数还原。除此之外插件不 monkey-patch 任何东西,也没有构建期脚本(package.json 里没有 scripts)。
安装
从插件市场安装,或在本机仓库目录执行插件安装(install_bundle,参数是该目录的绝对路径)。
装好后 profile 里记一条 link:<安装目录>:用本地目录安装时该目录不能删,移动后需要重装一次。
运行前提
| 前提 | 说明 |
|---|---|
| DSH 自带运行时(Node ≥ 22.3) | 用到 process.getBuiltinModule;拿不到时连接层兜底自动跳过,其余功能正常 |
webServer 服务 |
面板数据的来源;没有它的环境(纯 CLI)插件不会激活 |
settings.section 槽位 |
由 dsh-web-app 提供,桌面端和 Web 端都有 |
已知盲区
- MCP 子进程、Web Worker、任何子进程:钩子装在宿主进程里,进不去别的进程。
- 走 CONNECT 代理时,连接层只能看到代理地址,真实目的地来自上层语义事件。
- 「是否含对话内容」是启发式判断(模型调用后 8 秒窗口 + 请求体大小),会误标也会漏标。
- 插件归因靠调用栈推断;栈里没有包信息时显示为
unknown/ 运行时包名。
卸载
在插件管理里移除 dsh-egress-audit 即可;它不写任何持久化状态,localStorage 里只存你点过「隐藏」的行。
License
MIT
No comments yet. Be the first to write one.