【攻防之道】
链路劫持对企业和用户都是很麻烦的,影响用户体验,还泄漏敏感信息,而且还是分地域的,检测和防御起来也相对困难。
链路劫持已经被某些人运用的炉火纯青。比如近期业界发现部分区域的百度联盟广告脚本被植入恶意JavaScript去DDoS攻击GitHub。
腾讯历史上也遇到过多起链路劫持攻击,目的性很强,大部分是插广告(少部分是钓鱼和挂马),攻击手法各种各样,有运营商的区域DNS劫持和链路劫持、运营商区域DNS Server遭到缓存投毒攻击(利用CVE-2007-2926,非常经典)、开发商在路由软件中植入劫持代码、CDN与源通信遭到ARP攻击、用户PC本地木马。当然,这些目前都已经解决了,也在持续监测中。
为了对抗链路劫持,很多腾讯业务也都使用了HTTPS或者私有协议,比如QQ Web登录、QQ邮箱、理财通、Web微信、微信公众平台等。
DNS劫持攻击相对容易检测和防护。
检测方面,用分布的点去进行DNS查询即可,发现运营商DNS结果不对就可以推动修复。腾讯在2010年起就建设了DNS劫持监控系统,有兴趣的朋友可以去读下这篇文章。
防护方面,一种方案是使用DNSSEC(DNS Security Extensions);腾讯、114DNS还研发了自己的方案——HttpDNS。HttpDNS不使用DNS协议而是通过HTTP协议从HttpDNS后端服务器获取域名对应的IP。当然,类似的思路我们可以实现一堆了:HTTPSDNS、TCPDNS、UDPDNS、ICMPDNS……
链路劫持相对复杂。
检测方面,如有客户端,可以依靠客户端进行检测;如果没有客户端,就具体情况具体分析了,可以在网页里用JavaScript检测页面元素,甚至可以在全国重要城市租用ADSL探测。
另外,在机房的流量监控设备里会发现异常:比如这个案例就会出现用户接收了HTTP响应后没有回应,然后URL中又带了yiqifa.com的关键字重新访问主页的情况;再比如某些设备的HTTP阻断会向服务器发特定的RST包(我见过发IP Id为8888的案例)。
防护方面,这个案例只是伪造数据包,并没有实施阻断,所以只要客户端的安全软件把疑似出问题的包(一次TCP会话中TTL值相差很大或者IPId突然跳变)拦截就可以防御。为了避免误杀,可以拦截并休眠1秒,如果没有同样的数据包过来再放行。
有自己客户端的可以走自己的私有协议,网站类就困难一些,部署HTTPS吧。百度主页近期就使用了HTTPS,不过大部分用户还是不习惯在浏览器里输“https://”,所以还是存在被劫持的风险(类似的工具有SSLStrip)。当然了,对抗也会随之升级的,比如这次发现的GMail证书伪造事件。
在HTTPS尚不能大规模普及的情况下,是否可以给用户或者终端软件提供一个规避链路劫持的安全服务呢?似乎是可以的。下图是笔者构想的一个简单的通过本地代理软件加云服务的方式规避不安全ADSL链路的解决方案。
一些浏览器的云加速也客观上实现了这个功能。对于安全性不确定的公共WiFi,也可以用类似的方法来规避风险。
【后记】
希望本文对你有帮助。在链路劫持防护这件事上,腾讯欢迎与业界讨论甚至合作。
(责任编辑:安博涛)