CoreDNS中发现一个严重漏洞,攻击者可通过固定DNS缓存条目中断服务,导致更新无法生效,形成拒绝服务。
该漏洞存在于CoreDNS的etcd插件中,源于关键逻辑错误:etcd租约ID被误解释为生存时间(TTL)值,导致DNS记录缓存周期异常延长。
漏洞根源位于plugin/etcd/etcd.go
文件的TTL()
函数,该函数错误地将64位etcd租约ID截断为32位无符号整数,并将结果用作DNS记录的TTL。租约ID是租约授权的随机标识符,与租约持续时间无关。当生成大租约ID时,截断后的值可能代表极长的TTL(有时长达数十年)。
TTL混淆导致缓存固定
接收该记录的下游DNS解析器和客户端会按指定时长缓存记录,从而实现“缓存固定”攻击——攻击者可创建恶意或过时DNS条目并长期留存,阻止后续更新传播到受影响客户端。
攻击者若通过受损服务账户或配置不当环境获得etcd数据存储的写入权限,即可利用此漏洞:创建或更新DNS记录并附加租约(租约实际持续时间无关,仅租约ID起作用)。CoreDNS会以被误读的超大TTL提供该记录,导致客户端和解析器缓存过时信息。
即使etcd中的恶意条目被修正或删除,且CoreDNS重启,客户端仍会在本地缓存过期前持续解析错误地址。这对高可用性影响严重,关键服务更新、IP地址轮换或故障转移流程将被缓存固定的客户端忽略。
完整性影响被评为低——因为拥有etcd写入权限的攻击者本可将服务重定向至恶意端点,但该漏洞放大了此类攻击的持久性。
受影响版本与缓解措施
漏洞于CoreDNS 1.2.0版本引入,影响所有使用etcd插件进行服务发现的后续版本。
GitHub用户“@thevilledev”披露了该漏洞并贡献修复方案。建议缓解措施包括:更新TTL()
函数,通过etcd租约API正确获取剩余租约时间,而非滥用租约ID;此外,应实施可配置的最小/最大TTL限制,防止极端值被下发。
使用CoreDNS etcd插件的用户需立即更新至补丁版本,以防潜在服务中断。
发表评论
您还未登录,请先登录。
登录