网络配置很容易把密钥、订阅和公网地址一起提交。推送前必须完成本页检查。
- WireGuard
private-key的真实值。 - VPS 的
/etc/wireguard/keys/*.key、真实wg0.conf或 sysctl/firewall 备份。 - WireGuard Peer 完整配置、二维码或客户端
.conf。 - VPS 的真实 endpoint 与客户端隧道地址组合。
- SSH 私钥、真实用户名、密钥路径和主机别名组合。
- Clash 订阅 URL、控制器
secret、API token。 - 原始日志、抓包或截图中的公网 IP、账户和设备标识。
- TUN route exclusions 的真实组合;它可能同时暴露局域网、直连 DNS、 VPS underlay 和当前 SSH 连接。
- WebRTC/STUN、IPv4/IPv6 检测截图中的本地 ISP 地址、候选地址和浏览器 指纹。
scripts/diagnose.zsh 的输出也可能包含本机网关、VPN 服务名和节点名。向公开 issue 粘贴诊断结果前,先逐行脱敏。
scripts/diagnose-server.sh 不打印私钥或 Peer 公钥,但仍会暴露系统版本、接口、服务和防火墙状态。公开分享前同样逐行检查。
性能和泄露验收只公开聚合成功率、耗时、吞吐和“出口是否一致”的结论; 不记录实际出口 IP。TUN 设备编号、网络服务名和局域网 CIDR也应按当前用途 决定是否脱敏。
- 只向智能体提供占位模板和脱敏状态卡。
- 不把已经填入私钥的 provider、SSH 配置、完整 Peer、二维码或原始日志上传到聊天。
- 智能体可以创建目标文件与占位符,但私钥替换由用户在可信本地编辑器中完成。
- 受限智能体看不到 listener、路由或系统服务时,只能报告“无法确认”,不能要求用户为证明状态而公开秘密。
- 能在本机读取的版本、开关和端口由智能体只读确认,不要求用户上传整份 配置;需要检查 route exclusion 时只输出角色和通过/失败,不回显真实值。
- 任何联网秘密扫描器都会扩大数据暴露面;本仓库默认先运行离线的
scripts/validate-repo.sh,再人工检查。
- 公开主配置只引用
providers/wireguard-private.yaml。 - 真正的 provider 保存在本机 Mihomo home,权限设为
0600。 - 仓库只保留
*.example.yaml。 - 每台设备使用独立 WireGuard Peer。
先查看将要提交的文件:
git status --short
git diff --cached --stat
git diff --cached再检查常见敏感字段:
git grep --cached -nEI \
'(private-key|BEGIN .*PRIVATE KEY|authorization:|token:|secret:|password:|endpoint:|subscription)'--cached 很重要:它扫描即将提交的暂存区,而不是可能已经被再次修改的工作区。模板里的 private-key 字段名和 REPLACE_WITH_... 占位符会正常命中;逐条确认命中的值仍是占位符。不要为了让扫描结果变成零而排除 examples/,否则真实值误写进模板时也会被跳过。
检查疑似公网 IPv4:
git grep --cached -nE \
'(^|[^0-9])([0-9]{1,3}\.){3}[0-9]{1,3}([^0-9]|$)' \
-- ':!SOURCES.md'命中不一定是泄漏,例如 127.0.0.1、公共 DNS、文档保留地址都属于正常情况;每一处仍需人工确认。
再检查绝对用户路径、疑似长密钥和带凭据的 URL:
git grep --cached -nE '/Users/[^/[:space:]]+'
git grep --cached -nE '[A-Za-z0-9+/]{40,}={0,2}'
git grep --cached -nEI 'https?://[^[:space:]]*(token|key|secret|auth)='
git grep --cached -nEI '(TOKEN|SECRET|PASSWORD|API_KEY)='
git grep --cached -nE '([[:xdigit:]]{0,4}:){2,7}[[:xdigit:]]{0,4}'Git 的 index 扫描不覆盖未跟踪与被忽略文件。推送前还要查看:
git ls-files --others --exclude-standard
git status --short --ignored对未跟踪文件逐个做同样扫描;不要把真实 provider 临时放进仓库后只依赖 .gitignore。条件允许时,再使用独立的 secrets scanner 检查暂存区和完整历史,但它仍不能代替人工确认占位符、公共地址和真实凭据的区别。
确认 Git 历史没有早期泄漏:
git log --all --stat
git rev-list --all | while read -r rev; do
git grep -nEI \
'private-key|BEGIN .*PRIVATE KEY|subscription' "$rev" || true
done删除工作区文件并不足够,因为秘密仍在 Git 历史中。
如果秘密只进入本机、尚未推送的提交,并且仓库从未离开可信设备,可以先清理本地历史,再根据可信边界决定是否轮换;最稳妥的选择仍然是轮换。
一旦秘密已经推送到任何远程、发给他人,或无法确认是否离开本机,就按已经泄漏处理:
以下处置不是一组可以一次授权盲跑的命令。撤销凭据、重写历史、强制更新远程和协调已有克隆必须逐项确认精确目标;新秘密的生成、查看、输入和替换由用户亲自完成。
- 用户在可信界面或会话中立即撤销或轮换对应 WireGuard Peer、SSH 密钥、订阅或 token。
- 经单独的破坏性确认后,重写 Git 历史并强制更新远程。
- 通知所有已经拉取仓库的人重新克隆。
- 再次扫描所有分支和 tag。
重写历史不能替代密钥轮换;远程缓存、fork 或本地克隆可能仍保留旧对象。
公开仓库建立后,应优先使用 GitHub Security Advisories 或仓库所有者指定的私密联系方式,不要在公开 issue 中粘贴任何密钥或完整配置。