导语:最近出现的systemd漏洞可以导致许多Linux版本处于威胁中,具体来说是DNS resolver的缺陷导致相应受影响的系统收到DoS攻击。
最近出现的systemd漏洞可以导致许多Linux版本处于威胁中,具体来说是DNS resolver的缺陷导致相应受影响的系统收到DoS攻击。
存在该漏洞的系统发送DNS请求到攻击者控制的DNS服务器,将可以利用该漏洞。DNS服务器会返回伪造的查询,引起systemd进入无限循环,导致CPU利用率达到100%。漏洞编号 CVE-2017-15908。
对该漏洞最有效的修复方法是修复systemd的底层漏洞。该漏洞的补丁陆续发布,如今年10月Ubuntu发布修复补丁。目前,还没有针对该漏洞的在野攻击。
漏洞分析
DNS不断被赋予新的功能,有的是增加的新功能,有的则让它更安全。RFC4034中向DNSSEC(DNS Security Extensions)增加了新的资源记录——NSEC (Next Secure)记录。漏洞发生在处理NSEC位图文件中代表伪类型(pseudo-types)的位的时候。下图是无限循环和栈结构源码。dns_packet_read_type_window()的实现在文件resolved-dns-packet.c中。
图1 无限循环和栈结构源码
当记录类型为DNS_TYPE_NSEC时,上面的函数 dns_packet_read_type_window() 会从dns_packet_read_rr()处调用。下图为resolved-dns-packet.c文件中的dns_packet_read_rr()函数代码。
图2 读取DNS包的源码
PoC
为了验证该漏洞,作者创建了一个DNS服务器,该服务器可以发送伪造的恶意响应。该响应消息含有NSEC记录,该记录是专门触发该漏洞的:
图3 捕获的伪造的DNS reply包
一旦systemd被用于DNS解析,就会收到这种特殊的DNS包,同时CPU利用率会变成100%,如图所示:
图4 CPU利用率
解决办法
针对该漏洞的补丁已经发布了,建议用户尽早更新补丁。同时应该检查DNS响应中是否含有RFC4034中定义的资源类型。监控DNS响应流量,检测DNS RR中是否含有DNS和RFC4034中定义的资源类型。如果附件位图含有伪类型(pseudo-types),那么应该进行拦截。