过去的 48 小时,估计是全球互联网最 “团结” 的时刻 —— 大批网站开始紧急维护,很多游戏选择停服,大家纷纷关上门来修 bug。 原因之一你大概率能猜到,是因为 PHP (一种 Web 开发语言)漏洞。甚至日本政府都专门为这事儿发了篇帖子。。。 这可是被黑客当新手村刷的日本,连他们都着急了,可以看出来是非常紧急了。 我还看到有段子说,这几天歇业整顿的日料才最正宗,这下不得不吃寿司郎了。(bushi 除此之外,日本游戏与二次元领域,也是这次维护潮的重灾区,因为不少游戏登录、商城、数据接口都依赖 PHP。。。 比如《 最终幻想14 》国服,用旧版启动器暂时登不上是正常的,换成新版启动器或 WeGame 就能进。 所以啊,那些用 PHP 的团队这几天怕是要通宵打补丁了。。。 玩笑归玩笑,PHP 这次的漏洞确实不是闹着玩的。 作为一种广泛用于网站开发和 Web 后端的编程语言,PHP 的存在感,远比很多人想象的还要强。 不光全球大约 70% 的网站都在用 PHP,而且这次发现的两个漏洞,危险程度直接拉满了。根据 PHP 的官方安全公告,事故的 CVSS 评分(通用漏洞评分,满分 10 分)为 9.2 分。。。 属于不经过身份验证,就可以远端执行代码(RCE)的危险漏洞。轻则网站内容被篡改、用户数据遭窃取,重则服务器被直接拿下,甚至整个服务瘫痪。 好在目前来看,这次的情况并没有失控。 PHP 开发团队已经紧急发布了修复补丁。对于来不及打补丁的系统,也有部分机构选择直接把网线下线 —— 修不好之前,最安全的网站,就是暂时不存在的网站。。。 但话又说回来,“PHP 漏洞” 至少还有个比较明确的应对办法。 这两天互联网上爆出的另一个 bug,解决起来可真就没个头了。因为这不是官方打一轮补丁就能解决的,甚至某种程度上,需要我们自查解决。 是的,可能有些小伙伴也听说了,一家印度公司把他们的互联网数字证书的私钥值(相当于是证书的密码),设置成了 “4”、“56”、“155” 等几个类似的 255 以内的数。。。 更麻烦的是,这批有问题的证书,已经进入全球互联网的信任体系了,对咱们的影响也非常大。 就比如说,即使事情已经过去 6 天了,微信客户端内置的浏览器,竟然还能连接到有问题的 emsign 数字证书。。。 这里要稍微解释一下,互联网是一张网没错,但是我们的手机连接到网站 / APP / 服务器,不是直接从手机拉一根线就过去了,中间需要无数的交换机、路由器作为节点去帮你跳转,代为传输数据包。 在传统的网络流量环境里,中间的任何一个节点被安插了恶意软件,都可以在你毫不知情的情况下偷偷监听你和网站之间传输的明文数据。 为了解决这个问题,现代互联网引入了数字证书对流量进行加密,只要你的浏览器里提示连接是安全的,就代表你的这段通信是加密的。 只有你和最终收到这个信息的服务器,能看到数据的明文。中间的每一跳、每一个路由节点只能代为转发 —— 他们只知道自己转发了一个数据包,但是无法查看数据的具体内容。 这套加密体系叫 TLS。为了保障这套体系顺畅运作,需要有一个绝对可信的第三方机构充当中间人,为网站颁发数字证书 —— 具体怎么回事儿,大家可以问一问豆包。碍于篇幅,我们就不展开了。 然后问题来了,这次事件的主角 eMudhra,就是其中一家 “中间人” 机构。他手里头攥着的中间 CA 证书,可以给几乎任何网站签发数字证书,并且签发的证书被所有联网设备所信任。 结果这些 “中间人证书” 自己的私钥出问题了,凡是掌握了这次漏洞的人,都能以 eMudhra 的身份给任何网站签发证书。即使是假网站,也能拥有一张合法可信的证书。 理论上,eMudhra 这批证书的私钥长达 384 位,有 2³⁸⁴ 种组合。正常情况下暴力破解几千、几万亿次都无法命中。。。 但根据安全员的报告,eMudhra 这次的私钥,前面的 byte 全部设置成了 0,直到最后的 1 byte,才开始有实际的熵,也就是随机数。1 byte 的长度能储存的数字,对应到十进制,就只剩 256 种可能了。。。 换句话说,从 1 开始一个数字一个数字地试,最多试 255 次,就可能拿到私钥。更难绷的是,其中一个私钥竟然就是数字 4。 而且顺着出事的 CA 证书往上捋,你会发现 eMudhra 还跟一些老牌根证书机构,进行过全球交叉签名认证。也就是说,通过这些几乎不设防的中间证书,攻击者能进一步把手伸到全球互联网的其他角落。 假如你的浏览器、手头的设备,用的还是公告里说的旧证书。那么别人就有机会通过伪造数字证书,躲在你网络的上层节点当中,拦截你通信的流量,扒你的数据。 他们不光可以监听你所有的聊天记录、生活轨迹,甚至对一些加密比较弱的场景,还能伪造虚假数据。比如正常使用 app 的时候突然弹出来一个 “你