河南龙之晨信息技术有限公司
 
 
DNS漏洞影响数百万iot设备
发布时间:2022-05-10      浏览访问:429

研究人员在C标准库的DNS组件中发现一个安全漏洞,利用该漏洞可以对DNS进行投毒攻击,影响数百万嵌入式和IoT设备。

uClibc库和uClibc-ng库是两个标准的C语言库,可以提供扩展的DNS客户端接口,允许应用程序即时执行lookup和其他DNS相关的查询。被Netgear、Axis、Linksys等主流设备厂商使用,被适用于Linux系统的嵌入式应用中。

漏洞详情

Nozomi研究人员在IoT设备测试过程中发现,DNS请求的transaction ID首先是递增的,然后重置为0x2,然后继续递增。

1652092252208952.png

图 测试IoT设备执行的DNS请求记录

研究人员进一步分析发现产生这一结果的原因是其使用的C标准库——uClibc 0.9.33.2 (“libuClibc-0.9.33.2.so”)。研究人员分析uClibc源码发现位于“/libc/inet/resolv.c”源文件调用了“__dns_lookup”函数:

1652092262141168.png

图 uClibc的DNS lookup函数

在第1240行,函数声明了一个静态变量“last_id”。该变量包含上一个DNS请求中使用的transaction ID值,并在“__dns_lookup” 的第一次调用时初始化为1。

在第1260行,该函数声明了变量“local_id”。该变量中包含一个用于下一个DNS请求的transaction ID值,未初始化。

之后,会执行以下代码:

1652092273603923.png

图 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/

联系我们

400-033-9553工作时间:09:00-17:00 [周一至周五]
龙之晨官方微信公众号
Copyright © 2014 - 2024 河南龙之晨信息技术有限公司 All Rights Reserved.  技术支持:龙之晨

豫公网安备41010502000105号

ICP备案 豫ICP备14009373号-1