Skip to content

Security: NafYoung/macos-clash-wireguard-split-guide

Security

SECURITY.md

公开仓库安全检查

网络配置很容易把密钥、订阅和公网地址一起提交。推送前必须完成本页检查。

永远不要提交

  • 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 历史中。

如果秘密只进入本机、尚未推送的提交,并且仓库从未离开可信设备,可以先清理本地历史,再根据可信边界决定是否轮换;最稳妥的选择仍然是轮换。

一旦秘密已经推送到任何远程、发给他人,或无法确认是否离开本机,就按已经泄漏处理:

以下处置不是一组可以一次授权盲跑的命令。撤销凭据、重写历史、强制更新远程和协调已有克隆必须逐项确认精确目标;新秘密的生成、查看、输入和替换由用户亲自完成。

  1. 用户在可信界面或会话中立即撤销或轮换对应 WireGuard Peer、SSH 密钥、订阅或 token。
  2. 经单独的破坏性确认后,重写 Git 历史并强制更新远程。
  3. 通知所有已经拉取仓库的人重新克隆。
  4. 再次扫描所有分支和 tag。

重写历史不能替代密钥轮换;远程缓存、fork 或本地克隆可能仍保留旧对象。

报告安全问题

公开仓库建立后,应优先使用 GitHub Security Advisories 或仓库所有者指定的私密联系方式,不要在公开 issue 中粘贴任何密钥或完整配置。

There aren't any published security advisories