1988年11月2日,康奈尔大学研究生罗伯特·莫里斯写了一个小程序,本身本意是存安测量互联网规模。程序有个逻辑错误——它会在感染新机器后重新感染已经感染过的全缺机器。短短几小时内,网络大约6000台计算机瘫痪,本身占当时互联网总节点数的存安十分之一。这个“莫里斯蠕虫”暴露的全缺问题至今没变:网络从设计之初就没把安全当回事。
TCP/IP协议族诞生于1970年代,网络那时候连“黑客”这个词都还没流行。本身设计者的存安核心目标是“让不同网络能互相通信”,不是全缺“防止坏人搞破坏”。这种先天的网络乐观主义渗透在每一层协议里。IP协议只管把数据包扔出去,本身不验证来源是存安否真实。你收到的数据包说它来自白宫,它就可能来自某个地下室。这种“信任但不对等验证”的机制,让IP欺骗成了最古老的攻击手段之一。2016年Mirai僵尸网络搞瘫半个美国互联网,用的就是伪造源IP的反射放大攻击——把请求包的源地址改成受害者IP,服务器把响应全打到受害者身上。
DNS是另一个重灾区。1983年设计的域名系统,查询和响应默认不加密、不验证。你输入bank.com,DNS服务器告诉你IP是1.2.3.4,你没法确认这个回答是真的。DNS缓存投毒攻击利用这一点——2008年丹·卡明斯基发现,攻击者只需在正确响应到达前抢先伪造一个响应,就能让缓存服务器记住错误IP。结果:所有用户访问银行网站都被导向钓鱼站。DNSSEC能解决部分问题,但部署率至今不到40%,因为配置太麻烦,而且一旦密钥丢失整个域名直接瘫痪。
BGP路由协议更离谱。它靠的是“邻居之间互相告诉对方哪条路最近”。没有认证,没有加密。2018年,一个尼日利亚ISP错误配置BGP,把谷歌的流量绕道中国电信再绕回美国,持续了74分钟。恶意攻击者可以故意宣告“我拥有某个IP段”,把流量吸过来再转走。2017年,一个俄罗斯运营商短暂劫持了多家加密货币交易所的流量。BGP的信任模型就是“你说啥我信啥”,三十多年没根本性改变。
HTTP协议明文传输密码和Cookie,直到HTTPS普及才缓解。但HTTPS本身也有缺陷。2014年“心脏出血”漏洞,OpenSSL的一个内存读取错误,让攻击者能从服务器内存里读出包括私钥在内的64KB数据。全球约17%的安全服务器受影响。这个漏洞的根源是C语言指针操作没做边界检查——网络协议栈的代码质量,往往比应用软件还差。
网络设备本身也在拖后腿。很多家用路由器出厂默认密码是admin/admin,UPnP协议允许内网设备自动在路由器上开端口,而且不验证请求来源。2016年Mirai僵尸网络就是靠扫描物联网设备的默认密码,控制了超过60万台摄像头和路由器。这些设备出厂后从不更新固件,漏洞永远在那。
还有更隐蔽的:网络时间协议NTP。它用来同步时钟,但某些实现允许monlist命令返回最近600个客户端IP。攻击者伪造受害者IP发这个请求,就能让NTP服务器向受害者发送大量数据,放大倍数超过500倍。2014年,这个手法制造了当时史上最大DDoS攻击,峰值400Gbps。
这些缺陷的共同点是:它们不是bug,是feature。 网络协议的设计假设是“所有节点都诚实”,而现实是攻击者无处不在。修补措施往往是外挂式的——防火墙、入侵检测、TLS层——但底层协议还是那个1970年代的信任模型。你没法给一个没有身份验证机制的协议“打补丁”让它变得安全,只能在其上叠加更多层来掩盖问题。每一层都增加复杂性和新的攻击面。
我观察到,很多安全事件的根本原因不是加密算法被破解,而是协议交互中的状态混乱。比如TCP连接可以被RST包重置,而RST包不需要验证。攻击者只要猜对序列号就能切断连接。这在BGP会话中尤其致命——一个伪造的RST就能让两个运营商之间的路由会话中断。
网络的安全缺陷不是某个具体漏洞,而是整个体系的结构性缺陷。它建立在“连接优先,安全靠后”的哲学上。只要这个基础不变,我们就会不断看到新的攻击方式,用的还是几十年前的旧原理。
```