All plugins

DSH / BUNDLE / BUNDLES

dsh-netguard

v0.1.0JackZo400 / dsh-netguard464d65700f

InstallableBundlesBundles & other modulesCommunity · Topic auto-analysis

Overview

dsh-netguard

给 dsh 的出网护栏:只允许公网 http(s)、按字节上限与超时抓取、重定向每一跳都复查(防 SSRF / DNS rebinding / 云元数据)。一个服务 + 一个默认关闭的工具。

README / EN

Package documentation

Registry summary

给 dsh 的出网护栏:只允许公网 http(s)、按字节上限与超时抓取、重定向每一跳都复查(防 SSRF / DNS rebinding / 云元数据)。一个服务 + 一个默认关闭的工具。

dsh.pub verifies the pinned bundle contract, runtime facts, and distribution semantics. The complete README remains in the source repository.

Read the full README on GitHub

LIMITATIONS

Known limitations

**没防住的部分,写清楚比假装防住了强** 1. **DNS 解析与实际连接之间的时间差(TOCTOU)**。这里查一次 DNS、判定通过, 然后交给 fetch 自己**再查一次**才连。攻击者如果用一个 TTL=0 的域名, 可以让第一次查到公网、第二次查到内网 —— 这是 DNS rebinding 的第二种形态, **本插件挡不住**。真正的修法是把解析结果钉住(自己实现 dispatcher / connect 钩子, 连那个 IP 而不是再查一次名字),或者连上之后核对对端地址。 Node 的全局 fetch 不给这个钩子,所以这里留了 `fetchImpl` 注入点,宿主可以接自己的实现。 2. **代理**。如果宿主注入了一个走代理的 fetch,本插件的判定是在**代理之前**做的, 它只描述"目标地址",管不了代理那边怎么解析、怎么连。 另外 Node 的 fetch 默认不读 `HTTP_PROXY` / `HTTPS_PROXY`,但这个行为取决于运行时版本 —— 别指望这一层替你管代理。 3. **内容本身**。它只管"能不能去、拿多大",不管"拿回来的东西写了什么"。 拉回来的页面里完全可以写"忽略你之前的所有指令"。工具的描述和返回值末尾都提醒了这一点, 但那是一句提醒,不是一道防护。 4. **不是浏览器**。`<meta http-equiv="refresh">`、JS 跳转、Service Worker 这些 客户端侧的重定向不归它管(fetch 也看不到)。 5. **公网地址上的内网内容**。攻击者自己那台公网服务器完全可以反代到内网 —— 从地址层面看不出任何问题。这一层挡不住,也不该指望它挡。 6. **端口黑名单是近似,不是完整**。`8081`、`9090`、`5000` 这些也可能挂着内网服务。 想更严就自己往 `blockedPorts` 里加。 7. **IPv6 只放 `2000::/3`**,极少数合法的特殊写法会被误挡(被挡了会报 `RESERVED`,能改)。 8. **没有速率/并发限制**。它回答的是"能不能去这个地址",不回答"去多少次"。 真要做配额得在外面加。 9. **只做 GET**,不支持上传、POST、流式长连接。 10. **DNS 层不做 DNSSEC 验证**,系统解析器返回什么就判什么。 (不过 CNAME 链不影响结论:判的是最终地址。)