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。
而丢弃 UDP DNS 数据包的防火墙 > 512 字节。减轻漏洞利用(特别是通过 UDP,TCP 仍然可以是攻击向量)它也不是正确的行为,而是破坏了其他功能。
由于 EDNS0 的引入,DNS 规范中没有这样的限制,您将通过丢弃数据包导致有效流量中断。
Birdwes 建议,配置解析器名称服务器以将响应大小限制回其客户端是更好的方法,因为客户端至少会根据规范得到正确通知(截断响应),而不仅仅是沉默和最终超时,而是正确的解决方案是安装打补丁的glibc(那是哪里出了问题,大小没有错)。