|
2019年夏天,漏洞我在一台CentOS 7的漏洞跳板机上跑例行巡检,`ifconfig` 返回的漏洞MAC地址跟我手上资产表里的记录对不上。那台机器刚重装过,漏洞网卡没换,漏洞MAC却变了。漏洞当时以为是漏洞资产表太旧,随手更新了记录就过去了。漏洞三个月后,漏洞安全圈炸了——CVE-2019-14899,漏洞一个藏在 `ifconfig` 和 `ip` 命令背后的漏洞漏洞,能让同一网络里的漏洞攻击者直接篡改或嗅探你的VPN流量。 问题出在Linux内核处理ICMP重定向的漏洞方式上。简单说,漏洞当你连上VPN,漏洞系统会创建虚拟网卡(比如tun0),流量本该全走加密隧道。但内核收到一个伪造的ICMP重定向报文时,会错误地相信“这条去往VPN服务器的路,应该走物理网卡更快”,于是把部分流量从隧道里拽出来,直接扔到局域网上。攻击者只要跟你连同一个WiFi,发几个构造好的报文,就能把你的流量引到自己机器上。 那个MAC地址对不上的事,现在回头看,很可能就是有人在测试类似的流量牵引。我当时没往深处想,因为 `ifconfig` 本身不报错,`netstat -rn` 的路由表看起来也正常。漏洞的隐蔽性就在这儿——它不崩溃、不弹窗,只是悄悄改路由。你查 `ip route`,可能只看到一条“看起来合理”的默认路由,但下一跳的网关已经被替换了。 受影响的范围比很多人以为的广。OpenVPN、WireGuard、IKEv2这些主流VPN协议全中招,甚至某些企业级IPsec部署也跑不掉。攻击者不需要破解加密,他只需要让你的一部分流量绕开隧道。比如DNS查询被引到假服务器,你访问 bank.com 就被解析到钓鱼IP。更麻烦的是,这个漏洞利用门槛极低——一个能发原始套接字的脚本,加上对目标网络拓扑的基本了解,就够了。 修复方案来得不算快。内核补丁改了ICMP重定向的处理逻辑,加了反向路径过滤的校验。但很多生产环境不敢随便升级内核,尤其是跑着老旧业务系统的机器。于是临时缓解措施流行起来:关掉ICMP重定向(sysctl -w net.ipv4.conf.all.accept_redirects=0),或者用防火墙规则直接丢弃重定向报文。我在那台跳板机上加了条iptables规则,之后MAC地址再没漂移过。 这事给我留下的教训不是“赶紧打补丁”这么简单。`ifconfig` 这个命令太老了,老到很多人觉得它只是个查看工具,跟安全不沾边。但网络配置工具本身就在内核和用户态之间传话,传话的过程里,任何一个字段被恶意构造,都可能变成攻击面。后来我养成了一个习惯:每次连上不信任的网络,先跑一遍 ip route get 8.8.8.8,确认出口网卡是tun0而不是eth0。这比看VPN客户端的“已连接”图标靠谱得多。 漏洞公开后,Linux内核社区吵了一阵子——有人觉得这是VPN客户端该处理的问题,有人坚持内核路由逻辑有缺陷。吵归吵,补丁还是进了5.5版本。至于那些还在跑3.10内核的老服务器,要么手动打backport补丁,要么就接受“VPN流量可能被牵引”的现实。技术债这东西,平时看不见,一出事就是连锁反应。 |