文章内容

2018/5/23 9:16:03,作 者: 黄兵

CDN安全小结

CDN作为反向代理服务器,除非操作系统或者反向代理软件爆出严重的漏洞,其本身是不存在较大的安全问题的。扫描CDN服务器的端口往往会发现只开了80(http)和443(https),而这两个端口又不运行动态脚本,作为攻击者很难从这里下手。

尽管CDN服务器看起来固若金汤,但是攻击CDN可以从CDN运行逻辑入手。CDN安全主要出现在环路攻击上,一旦流量形成环,则整个CDN会带着流量不断消耗自身的资源,造成拒绝服务。

CDN环路攻击

设置CDN的时候有几个概念。

  • 加速域名
  • 源站地址
  • CDN分配的动态解析域名

加速域名是用户控制的域名,用户将加速域名提交到CDN系统,系统会自动分配一个动态解析域名。这个动态解析的域名会根据来源IP的地区以及CDN节点负载情况动态解析成CDN某个节点的IP。用户需要将加速域名的CNAME记录指向云服务分配的动态解析域名,这样当用户请求加速域名的时候,其对应的ip地址由动态解析域名进行解析。这样用户浏览器端的请求就会发送到CDN的一个节点上,然后由该节点向源站地址代理发出请求,得到响应之后返回给用户。

分析上面的过程,可以总结出CDN环路攻击有5种形式。

CDN自身成环

将CDN的加速域名与源站域名设置成同一个,源站域名A记录指向CDN的一个节点。这样,当请求加速域名的时候,CDN节点解析到源站的IP为其自身的IP,循环自己请求自己,导致环路。

CDN之间成环

将CDN的加速域名与源站域名设置成同一个,自己搭建DNS服务器,域名的NS记录指向自己的DNS服务器,即攻击者可以动态解析源站域名为需要的IP。根据CDN分配的动态解析域名可以得到多个绑定了该加速域名的CDN节点的IP,对每次加速域名的解析随机返回收集的CDN节点IP中的一个。这样,用户的HTTP请求的数据包就在CDN之间互相传递,如果控制好DNS解析的规律,则能形成一个环路,使数据包一直传递下去。

另外一种攻击方法是新建两个CDN加速域名,将源站指向对方,并通过动态解析域名的解析记录寻找两个加速域名的公共CDN节点的IP。搭建DNS服务器动态解析这两个域名,使其A记录随机返回公共IP里的一个。这样只要访问其中一个域名即可让流量在这些公共IP之间流动起来。

不同CDN商之间成环

如果CDN服务商对自身http包传递次数做了一些限制,而有的CDN商可以去除掉这些限制的话,可以考虑在不同CDN商之间将流量成环。

CDN和源站成环

如果能控制源站或者源站有SSRF的漏洞,正常配置CDN服务,把源站也变成一个反向代理服务器,地址指向CDN的一个节点。这样用户发起请求,CDN请求源站,源站又回过头来请求CDN。这样能较快的耗尽源站的资源,并且可能拖住一个CDN的节点。

DNS loop

将a的CNAME记录设置成b,b的CNAME记录设置成c,c的CNAME记录设置成a。向CDN的一个节点发送请求a的数据包,则CDN会不断循环查询DNS,对DNS服务器造成较大的流量。

CDN测试遇到的坑

在最开始测试CDN环路攻击的时候,新建了多个加速域名,把加速域名的源站设置成下一个加速域名,依次连接起来,然后把最后一个加速域名的源站设置成自己控制的服务器。在服务器上监听端口,请求第一个加速域名,却没有收到任何请求。这个问题纠结了很长时间,直到意识到在b加速域名的CDN节点上可能没有a加速域名的信息。这样从a到b的请求会被丢弃掉,导致无法将流量传递。

如果CDN允许配置回源host的话,那么CDN环路攻击依然可以生效。

CDN环路攻击的解决方案

从攻击的方法上可以看到,阻止CDN的HTTP loop最简单的方法是禁止CDN的加速域名与源站域名设置成同一个。除此之外,实际上还需要做一些其他的防护手段来避免CDN之间成环。

阿里云会在HTTP请求头中加一个Via项,里面记录了这个请求经过的节点信息。如果节点检测到Via中和本节点的特征匹配的话,则直接返回HTTP/1.1 508 Loop Detected。经过测试发现阿里云会把多个的Via项拼起来,尝试干扰服务器对Via的判断没有成功。

通过Via来判断是一个比较好的解决思路,也是RFC中推荐的方法。有的CDN会在HTTP请求头里加一项特殊的X-Daa-Tunnel: hop_count=1头来计数,用户可以自己指定一个非常小的负数,CDN节点需要一点一点加很久才能达到阈值,导致仍然可以受到攻击。

解决好环路的判断问题是避免CDN流量转发放大造成DoS的根本。

参考文献

本文转载自:CDN安全小结

分享到:

发表评论

评论列表