夜雨聆风学习资料网

ARTICLE · 1179078

FastGithub 源码考古:GitHub 加速神器删库背后,被拆掉的门锁与裸奔的根证书私钥

FastGithub 源码考古:GitHub 加速神器删库背后,被拆掉的门锁与裸奔的根证书私钥

前言:作者从互联网档案馆拉回已 404 的 FastGithub 源码,逐层拆解它用 WinDivert 劫持 DNS、重定向端口、剥离 SNI 实现纯本地 GitHub 加速的精巧原理,也揭开它关闭 git sslverify、自签根证书私钥明文裸奔等安全债,并给出三分钟清理残留的补救清单。

前几天有个刚入行的读者问我,GitHub 访问慢,clone 天天失败,有没有什么好使的工具。我脱口而出一个名字,FastGithub,2021 年那会儿,这玩意儿几乎是国内开发者的标配。

结果我顺手去原仓库一看,404 了。

作者把仓库删了。

这就很有意思了。一个当年 star 好几万的现象级工具,说没就没了。我寻思了一下我没寻思明白,于是鬼使神差的,我从互联网档案馆里把最后一份源码快照拉了下来,打算把这玩意儿翻个底朝天,看看它当年到底是怎么工作的,以及,作者为什么要删库。

一份已经404的源码,和一段被删掉的历史

先说结论,FastGithub 的思路,是我近几年见过最骚的纯本地加速方案之一。它不是 VPN,不连任何外部服务器,所有事情都在你自己的电脑上完成。

它是怎么做到的呢,我一层一层给你剥。

第一层,DNS。你访问 github.com 的时候,系统会先问 DNS 服务器要 IP,这个查询走的是明文的 UDP 53 端口。审查设备只要看到明文里有 github.com,就会抢在真实应答到达之前,先塞给你一个假的黑洞 IP。FastGithub 的做法简单粗暴,它用了一个叫 WinDivert 的内核驱动,直接在系统底层把所有发往 53 端口的 DNS 查询拦下来,凡是问 github 相关域名的,不等真 DNS 回话,直接伪造一个应答包,告诉你,github.com 的 IP 是 127.0.0.1,也就是你自己的电脑。

你的浏览器一看,哦,GitHub 就在本机啊,于是欢天喜地地朝自己发起连接。

第二层,端口重定向。WinDivert 再把发往 443 端口的连接偷偷改道,全部送进 FastGithub 自己开的本地反向代理里。

第三层,就是最核心的了。GitHub 的服务器是真的在你对面,但中间的审查设备会在 TLS 握手时看一个叫 SNI 的字段,那里面明文写着你要访问的域名,一旦看到 github.com,直接一个 RST 把连接掐死。FastGithub 怎么破,它在向上游发起请求的时候,把 SNI 整个剥掉了。审查设备看着这个握手包,里面干干净净,一个域名都没有,就像一封没写收件人的信,想拦都不知道拦谁。

我看到这段配置的时候,真的被震撼到了。原来 SNI 是可以不发的。

那真实 IP 哪来的呢,它内置了一个 dnscrypt-proxy,把 DNS 查询整个加密,走 DoH 隧道发到境外的可信 DNS,拿到干净的真实 IP。然后再对一堆候选 IP 挨个发起真实的 TCP 握手,用秒表掐时间,后台每秒刷新一次排序,永远把延迟最低的那个排在最前面,谁快用谁。

聊着聊着我突然想到,这套东西的精巧程度,放在 2021 年,说是艺术品也不过分。四层联动,环环相扣,全程不需要你点一下配置。

但是,好奇心是个好东西,也是个坏东西。看完了它怎么加速,我顺手翻了一下它跟安全有关的代码,然后,心情就从考古变成了后背发凉。

先看个小的。它启动的时候会自动改你的 hosts 文件,把原来的 GitHub 映射注释掉。我本来以为程序退出的时候会还原,结果翻遍了代码,那个叫 RestoreAsync 的函数里,什么都没有。它改了,就永远留在那了。

再往下,WinDivert 是 Ring 0 的内核驱动,跟游戏反作弊、杀软、VPN 虚拟网卡打架是家常便饭,轻则断网,重则蓝屏。打腾讯游戏的兄弟应该懂我在说什么。

然后是我看到的第一处真正的安全问题。它向上游建立 HTTPS 连接时,有一段校验对方证书的逻辑,配置文件里赫然写着 TlsIgnoreNameMismatch,true。翻译一下,只要对方证书的域名对不上,直接放行。你想想看,一个中间人攻击者递给你的伪造证书,恰恰就是域名对不上的。这个判断等于把门锁拆了,还在门上贴了张条,欢迎光临。

再往下翻,我沉默了。它每次启动,都会默默执行一句 git config --global http.sslverify false。全局的,关了就不还原的。Git 有自己独立的一套证书体系,作者懒得把 CA 导进去,就直接把 Git 的证书校验整个关了。从这一刻起,你在任何网络环境里 clone 任何仓库,包括公司的私有 GitLab,Git 都不再验证对面是不是真的服务器。公共 WiFi 里有人想给你的代码投毒,易如反掌。

还没完。最炸的在最后。

为了让浏览器信任它的伪造证书,FastGithub 自己造了一个 CA 根证书,装进了 Windows 的受信任根证书列表。也就是说,操作系统从此无条件相信这个 CA 签发的一切证书。而这张 CA 的私钥呢,是一份没加密的 PEM 明文文件,就躺在程序的运行目录里,文件名 fastgithub.key。

你电脑上任何一个不起眼的流氓软件,只要读到这个文件,就能给银行、给邮箱、给任何网站,签发一张带小绿锁的合法假证书,然后静默解密你所有的流量。

钥匙就挂在门口的垫子底下,谁路过谁都能拿。

我看到这里的时候,一时间无语凝噎。。。

小绿锁还在,锁芯已经换了

坦率的讲,那句老话大家都听过,如果你没有为产品付费,那你就是产品本身。但 FastGithub 这事更微妙,作者不是坏人,他从头到尾没偷你一个字节,他只是为了让一切免配置、开箱即用,把安全的底线一层一层让了出去。每一层单独看都情有可原,加在一起,就是裸奔。

我非常理解作者的处境。2021 年做一个加速工具,要免安装,要零门槛,要跟各种奇怪的网络环境搏斗,每一步妥协都有它的理由。但工程上的每一个「先这样吧」,最后都会变成用户账上的债。这笔债平时看不见,等看见的时候,往往已经连本带利了。

后来还有个更现实的转折。防火墙策略升级,GitHub 的大量 IP 段在运营商层面被直接黑洞丢包。IP 本身封死了,SNI 剥得再干净也没用,TCP 握手根本握不通,这类「纯净 DNS + 改 IP」的工具就集体失效了。仓库删掉,或许也有几分心灰意冷的意思。

所以如果你当年也用过它,我建议现在就花三分钟做三件事。把 git 的全局 sslverify 改回 true,打开 certmgr.msc 在受信任的根证书颁发机构里把 FastGithub 那张 CA 删掉,再看一眼 hosts 文件有没有残留。这三分钟,比装十个加速器都值。

以后要加速,老老实实用正规代理给 Git 单独配一条,或者用不改证书、只绑 Hosts 的工具。慢是慢一点,但你的门锁还在。

回到开头那个 404 的仓库。它曾经真的帮一代人打开过 GitHub 的门,这一点我必须承认,也值得尊重。

只是门后,还留了一把没上锁的备用钥匙。

比比说,磨平一些信息差。但下次磨之前,记得先看看,那个帮你磨的工具,有没有顺手把你的信息磨给了别人。

/ 注意,本项目仅在 SyncMein 的500人小群分享。 / 谢谢你看完了我的文章,我们下次再见吧。 / 作者:明察 / 投稿或爆料,请联系邮箱:mingcha@gqmg.com

标签:FastGithub, GitHub加速, WinDivert, SNI, 根证书 关键词:FastGithub, GitHub 加速原理, SNI 剥离中间人风险, 自签根证书私钥泄露, git sslverify 安全隐患

相关学习资料