getaddrinfo() 的 Glibc 错误缓解

Ser*_*ult 4 security linux bind dns-hosting

今天遇到了glibc的漏洞利用,其中涉及用于 DNS 解析的 getaddrinfo() 调用。我在两个面向互联网的 Bind9 机器上运行 Ubuntu 12.04。我不确定我是否完全理解这个漏洞,但它似乎是由来自恶意 DNS 服务器的大量回复引起的。缓解措施之一是“丢弃 UDP DNS 数据包 > 512 字节的防火墙”,因此我在 DNS 服务器上配置了 netfilter 以丢弃来自或前往端口 53 的任何 UDP > 512 字节: -A INPUT -i lo -j ACCEPT -A INPUT -p udp --sport 53 -m length --length 511:65535 -j DROP -A INPUT -p udp --dport 53 -m length --length 511:65535 -j DROP -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

有没有更好的方法来使用绑定设置或任何东西来做到这一点?我已经用 scapy 测试了规则,它确实阻止了在端口 53 上抛出的 UDP 数据包 > 512。

根据回复更新: -A INPUT -i lo -j ACCEPT -A INPUT -p udp --sport 53 -m length --length 949:65535 -j DROP -A INPUT -p udp --dport 53 -m length --length 949:65535 -j DROP -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

/etc/bind/named.conf.options

options {
   ...
   // 2016-02-17 - tmb - glibc exploit mitigation
   edns-udp-size 900 ;
   max-udp-size 900 ;
};
Run Code Online (Sandbox Code Playgroud)

更新 2:正如下面atdre所指出的,Cloudflare 尝试了上述技术,尽管无法传输整个有效负载,但仍有可能发生内存损坏。我想我会研究Unbound

Håk*_*ist 6

丢弃 UDP DNS 数据包的防火墙 > 512 字节。减轻漏洞利用(特别是通过 UDP,TCP 仍然可以是攻击向量)它也不是正确的行为,而是破坏了其他功能。

由于 EDNS0 的引入,DNS 规范中没有这样的限制,您将通过丢弃数据包导致有效流量中断。

Birdwes 建议,配置解析器名称服务器以将响应大小限制回其客户端是更好的方法,因为客户端至少会根据规范得到正确通知(截断响应),而不仅仅是沉默和最终超时,而是正确的解决方案是安装打补丁的glibc(那是哪里出了问题,大小没有错)