Skip to content

fix(dns): 泄漏探测改用真实 HTTPS 触发避免劫持环境假阴性 - #9

Merged
mel0nyrame merged 2 commits into
devfrom
fix/dns-leak-fakeip-trigger
Oct 3, 2026
Merged

mel0nyrame merged 2 commits into
devfrom
fix/dns-leak-fakeip-trigger

Conversation

@mel0nyrame

Copy link
Copy Markdown
Owner

背景

DNS 检测页在本机(透明代理 fake-ip 劫持环境)恒显示「未检测到 DNS 解析器出口 IP」,而 ip.net.coffee/dns 网页端总能检测到。诊断结论与完整证据见 #8:裸 DNS 查询(UDP/TCP 53)被路径上的劫持设备本地应答(应答落在 198.18/15)而从不递归,权威 NS 收不到记录,回读恒空;上游「空列表 = 已加密」的前提是浏览器必然真实建连,对裸 DNS 查询不成立。

变更轮廓

触发原语替换(三态判定规则不变):

 run_dns_leak 每轮触发
-  hickory 系统 resolver → UDP 53 A/AAAA 查询 <token>-<n>.d.ip.net.coffee(应答被丢弃)
+  reqwest → GET https://<token>-<n>.d.ip.net.coffee/pixel.gif(8s,任意状态码即触发成功)

回读分类(新增 classify_readback 纯函数):

 回读为空时
-  一律判「已加密(DoH/DoT)」
+  触发请求全部失败 → 探测失败:「未能触发 DNS 解析」
+  有请求完成但无记录 → 已加密/未暴露(上游规则不变)
  • DNS 页不再读取系统 resolver 配置,原「无法读取系统 resolver 配置」失败分支随之移除;WebRTC 页解析 STUN 地址仍使用系统 resolver,不受影响。
  • 接口报告 §2.7 触发建议与 §3.6 LinkLens 采用值同步更新;CI test 作业补齐真实网络冒烟入口(probe_leak --ignored,三平台执行)。

验证

检查 对象 结果
cargo fmt --check、cargo clippy --locked --all-targets -- -D warnings 全仓 通过
cargo test --offline --lib 269 个单元测试 通过(含新增 probe_url_matches_official_pattern、classify_readback_distinguishes_failed_triggers_from_encrypted)
cargo test --locked --lib probe_leak -- --ignored 真实网络冒烟 在本机(fake-ip 劫持现场)通过:修复前同环境回读恒空,修复后全流程走通并给出三态结论
诊断回路脚本(issue #8 证据表) 上游接口 HTTP 触发回读 12 个解析器出口;DoH 直查同型 token 亦回读非空——裸查询原语有效,坏在劫持路径

真实网络结果受运行环境影响;CI runner 无劫持环境,本机才是该 bug 的原始现场,故冒烟在本地已按真实环境执行,CI 侧作为常规入口保留。

风险与回滚

  • 每轮触发多一次 TLS 建连(快速 5 轮/深度 8 轮、间隔 600ms),开销可忽略;触发语义与上游浏览器完全一致。
  • 「已加密」结论收紧为「有请求成功建连后仍无解析器记录」;极端环境(如代理对探测域 REJECT)落入「探测失败」而非静默假阴性。
  • 回滚:revert 单提交即可,无持久化数据与格式变更。

Ref: #8

透明代理 fake-ip 劫持会把 UDP/TCP 53 裸查询本地应答(198.18/15)而从不
递归,权威 NS 收不到记录,回读恒空,三态判定恒为「已加密」——而上游
「空列表 = 已加密」的前提是浏览器必然真实建连,对裸 DNS 查询不成立。

- 触发改为对 pixel.gif 的真实 HTTPS 请求(上游浏览器等价),直连与
  代理环境都迫使解析链路完成递归;单轮时限沿用公网 8 秒红线。
- 新增 classify_readback 纯函数:触发全部失败且回读为空按探测失败处理,
  不再误报「已加密」;有请求完成即进入三态判定,判定规则不变。
- 接口报告 §3.6 采用值与 §2.7 触发建议同步更新。
- CI test 作业补齐真实网络冒烟入口(probe_leak --ignored)。

Ref: #8
使用边界补充约定:报告的实施建议先在对应「LinkLens 采用值」段落
写明成立的环境前提(如解析链路可达、无透明劫持),前提不明的先
验证再采用,不得直接作为实现依据。先例是 §2.7 裸 DNS 查询建议在
fake-ip 劫持下产生假阴性。

Ref: #8
@mel0nyrame
mel0nyrame merged commit 822440c into dev Oct 3, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant