DNS漏洞影响数百万iot设备
研究人员在C标准库的DNS组件中发现一个安全漏洞,利用该漏洞可以对DNS进行投毒攻击,影响数百万嵌入式和IoT设备。
uClibc库和uClibc-ng库是两个标准的C语言库,可以提供扩展的DNS客户端接口,允许应用程序即时执行lookup和其他DNS相关的查询。被Netgear、Axis、Linksys等主流设备厂商使用,被适用于Linux系统的嵌入式应用中。
Nozomi研究人员在IoT设备测试过程中发现,DNS请求的transaction ID首先是递增的,然后重置为0x2,然后继续递增。
图 测试IoT设备执行的DNS请求记录
研究人员进一步分析发现产生这一结果的原因是其使用的C标准库——uClibc 0.9.33.2 (“libuClibc-0.9.33.2.so”)。研究人员分析uClibc源码发现位于“/libc/inet/resolv.c”源文件调用了“__dns_lookup”函数:
图 uClibc的DNS lookup函数
在第1240行,函数声明了一个静态变量“last_id”。该变量包含上一个DNS请求中使用的transaction ID值,并在“__dns_lookup” 的第一次调用时初始化为1。
在第1260行,该函数声明了变量“local_id”。该变量中包含一个用于下一个DNS请求的transaction ID值,未初始化。
之后,会执行以下代码:
图 uClibc (2)中的DNS lookup函数
在第1309行,第一个DNS请求中,“local_id”变量被初始化为上一个DNS请求的transaction ID的值。第1320行是漏洞产生的原因:local_id是在原值的基础上+1递增的。考虑到该值在第一次调用的时候被初始化为1,这也是前面图中transaction ID被重置为0x2的原因。
在第1321行,在进行位与(AND)运算后,该值仍被保存在“last_id”变量中(第1323行)。最后,在第1335行,“local_id”的值会被复制到struct resolv_header “h”变量中,表示DNS请求header的真实内容。
由于transaction ID是可预测的,攻击者可以构造一个含有正确源端口的DNS请求,并赢得合法DNS响应的竞争。攻击者可以使用DNS投毒或DNS欺骗来重定向受害者到攻击者控制的恶意网站或IP地址(服务器)。如果操作系统应用端口随机化技术,攻击者可以通过发送多个DNS请求来暴力破解16位源端口,同时赢得合法DNS请求的竞争。
DNS投毒可以诱使目标设备指向任意定义的终端并参与网络通信。攻击者通过DNS投毒可以重定向流量到其控制的服务器。然后,攻击者可以窃取和修改用户传输的信息,执行针对这些设备的其他攻击。
Nozomi 在2021年9月发现了该漏洞,并报告给了CISA。12月,将该漏洞提交给了CERT/CC。2022年1月,将漏洞通告给了超过200个受影响的厂商。
目前,该漏洞并非分配CVE编号,也未发布补丁。相关厂商正在协作开发补丁。
完整技术分析参见:https://www.nozominetworks.com/blog/nozomi-networks-discovers-unpatched-dns-bug-in-popular-c-standard-library-putting-iot-at-risk/
参考及来源:https://www.bleepingcomputer.com/news/security/unpatched-dns-bug-affects-millions-of-routers-and-iot-devices/