DNSpooq系列缝隙阐发与复现

宣布时辰 2021-02-01

媒介


近期,以色列宁静征询企业JSOF在最新报告中表露了七个 DNSmasq 缝隙(统称 DNSpooq),并指出进犯者借此传染了数以百万计的装备。DNSmasq 是一套风行的开源 DNS 转发软件,能够或许为运转该软件的收集装备增添 DNS 缓存和 DHCP 办事器功效,普遍用于各类小型局域收集。受 DNSpooq 影响的装备不只能够遭受 DNS 缓存中毒,还可被用于长途代码履行、谢绝办事(DoS)进犯。今朝受影响的厂商包含但不限于 Android / Google、康卡斯特、思科、红帽、Netgear、高通、Linksys、IBM、D-Link和 Ubiquiti 。根据shodan显现,有超100万台支配DNSmasq的装备裸露在公网,能够受影响的装备成千上万。


此中, CVE-2020-25684、CVE-2020-25685 和 CVE-2020-25686 这三个缝隙,能够致使 DNS 办事遭受缓存中毒进犯。别的四个缝隙为 CVE-2020-25687、CVE-2020-25683、CVE-2020-25682 和 CVE-2020-25681 ,均为缓冲区溢出缝隙。黑客或可在设置装备摆设了 DNSmasq 的收集装备上,支配这些缝隙长途履行肆意代码。


DNS和谈简介


DNS的请求和呼应的根基单元是DNS报文(Message)。请求和呼应的DNS报文布局是完全不异的,每一个报文都由以下五段(Section)组成:


1.png


DNS Header是每一个DNS报文都必须具备的一局部,它的长度牢固为12个字节。Question局部寄存的是向办事器查问的域名数据,通俗环境下它只要一条Entry。每一个Entry的格局是不异的,以下所示:


2.png


QNAME:由labels序列组成的域名。QNAME的格局操纵DNS标准称号表现法。这个字段是变长的,是以有能够呈现奇数个字节,但不停止补齐。DNS操纵一种标准格局对域名停止编码。它由一系列的label(和域名顶用.朋分的label差别)组成。每一个label首字节的高两位用于表现label的范例。RFC1035平分派了四个外面的两个,别离是:00表现的通俗label,11(0xC0)表现的紧缩label。


Answer,Authority和Additional三个段的格局是完全不异的,都是由零最多条Resource Record(资本记实)组成。这些资本记实由于差别的用处而被分隔寄存。Answer对应查问请求中的Question,Question中的请求查问功效会在Answer中给出,若是一个呼应报文的Answer为空,申明此次查问不间接取得功效。


RR(ResourceRecord)资本记实是DNS体系中很是主要的一局部,它具备一个变长的布局,详细格局以下:


3.png


● NAME:它指定该笔记实对应的是哪一个域名,格局操纵DNS标准称号表现法

● TYPE:资本记实的范例。

● CLASS:对应Question的QCLASS,指定请求的范例,经常操纵值为IN,值为0x001。

● TTL(Time To Live)资本的有用期:表现你能够将该条RR缓存TLL秒,TTL为0表现该RR不能被缓存。TTL是一个4字节有标记数,可是只操纵它大于便是0的局部。

● RDLENGTH:一个两字节非负整数,用于指定RDATA局部的长度(字节数)。

● RDATA:表现一个长度和布局都可变的字段,它的详细布局取决于TYPE字段指定的资本范例。

   DNS罕见资本记实范例有NS记实、A记实、CNAME记实。

● NS记实

NS记实用于指定某个域的权势巨子DNS。比方在com的DNS里,记实着http://baidu.com这个域的DNS,大要以下:

baidu.com.  NS ns1.baidu.com. 

baidu.com.  NS ns2.baidu.com. 

baidu.com.  NS ns3.baidu.com.


这三笔记实,便是说http://ns1.baidu.com、http://ns2.baidu.com、http://ns3.baidu.com(以下简称ns1、ns2、ns3)都是http://baidu.com域的权势巨子DNS,扣问肆意此中一个都能够。


固然,在com的权势巨子DNS里,还会记实ns1~ns3这几个http://baidu.com权势巨子DNS的IP,会一并前往给扣问者,以便扣问者间接用IP接洽ns1~ns3。


● A记实


A记实便是最典范的域名和IP的对应,在http://ns1.baidu.com外面,记实着百度公司各产物的域名和IP的对应干系,每一个如许的记实,便是一个A记实,比以上面的3个A记实:


image.baidu.com   A    1.2.3.4 

wenku.baidu.com   A    5.6.7.8 

tieba.baidu.com     A    9.10.11.12


若是用户扣问http://ns1.baidu.com:“http://wenku.baidu.com的IP是几多?”,ns1就会找到对应的A记实或CNAME记实并前往。


● CNAME记实


CNAME记实也称又名记实,许可将多个记实映照到统一台计较机上。比方,在ns1中,并不http://www.baidu.com的A记实,而是一个CNAME记实:


www.baidu.com  CNAME  www.a.shifen.com


也便是告知用户,http://www.baidu.com的又名是http://www.a.shifen.com,能够间接请求剖析http://www.a.shifen.com。


DNS缓存进犯


当拜候www.baidu.com时,域名剖析的大抵流程以下图所示。


4.png


DNS缓存中毒是一种比拟典范的进犯体例,若是进犯者能够胜利履行,就会在DNS缓存办事器上留下一个无害的条款,使得用户拜候普通网站的请求重定向到被进犯者节制的歹意网站。


DNSpooq系列缓存中毒缝隙的简略进犯流程图以下图所示:


5.png


(1)用户发送阅读淘宝的请求给DNS转发器,但愿获得对应的IP。

(2)DNS转发器不此域名的缓存,以是将请求转发给下游DNS办事器。

(3)在获得下游DNS办事器答复前,进犯者发送一个捏造的答复,将淘宝域名与一个歹意IP绝对应。

(4)DNS转发器接管了这个捏造的答复,并发送给用户,因而用户请求拜候的淘宝被重定向到了进犯者支配的歹意网站。


这个DNS转发器支配场景很普遍,比方小我开的热门,机场、宾馆里的大众收集等,一旦进犯胜利,则影响操纵这些收集的一切人。


在DNS Header中有一个16-bit的地区叫TXID(transaction ID),用于将查问包和答复包婚配。在曩昔,TXID是进攻DNS缓存中毒的主要手腕。可是在2008年,宁静研讨员Dan Kaminsky证实16-bit的TXID是远远不够的,厥后又增添了端口随机化,以是这个时辰想捏造答复包,不只须要猜对TXID,还须要猜对端口,一共32位的随机值,另外还须要晓得源IP和目标IP。


DNS宁静扩大


到了21世纪,DNS宁静扩大正在被渐渐支配。DNS宁静扩大是今朝为了处理DNS棍骗缓和存净化题目而设想的一种宁静机制。DNSSEC依托数字署名来保障DNS应对报文的实在性和完全性。简略来讲,权势巨子办事器操纵私钥对资本记实停止署名,递归办事器支配权势巨子办事器的公钥对应对报文停止考证。若是考证失利,则申明这一报文能够是有题目标。


为了完成资本记实的署名和考证,DNSSEC增添了四种范例的资本记实:RRSIG(Resource Record Signature)、DNSKEY(DNS Public Key)、DS(Delegation Signer)、NSEC(Next Secure)。


比方咱们履行号令行:dig @8.8.8.8 paypal.com,获得的DNS查问功效以下所示:


6.png


红框中为应对局部,这是未开启DNSSEC的环境下的。咱们履行号令行:dig+dnssec @8.8.8.8 paypal.com,获得的DNS查问功效以下所示:


7.png


蓝框中便是RRSIG资本记实存储,该资本记实存储的是对资本记实调集(RRSets)的数字署名。


Dnsmasq缓存中毒缝隙


以下三个缝隙,组合起来用能够下降捏造答复包的熵值。


CVE-2020-25684


DNSmasq自身限定了转发给下游办事器查问包的数目,凡是最大是150条。用户能够本身设定这个值。转发查问操纵的是frec(forwardrecord)布局。每一个frec都和TXID相干联。当答复被接管或颠末必然时辰,这个frecs就会被删除。


凡是环境下,用于转发查问的socket数目被限定在64个。每一个用于转发的socket和一个随机的端口绑定。

现实上,查问包中TXID和源端口加起来会有32-bit的熵。可是现实上,这个熵要更少一些。由于dnsmasq在统一个端口会多路复用多个TXID,而不将每一个TXID和每一个端口设置为逐一对应的干系,以下图所示。功效便是,进犯者只须要猜中64个端口中的一个端口另有准确的TXID就能够了,而不必猜中某个特定的端口和特定的TXID。以是这致使现实上只要26位熵值。


8.png


● CVE-2020-25685


若是要对DNS转发器停止投毒,除须要猜对准确的TXID和源端口,进犯者发送捏造的答复还须要婚配已开放的frecs。若是想让frec婚配,那末TXID和题目区都要婚配,换句话说,答复的内容是之前扣问过的。


dnsmasq只寄存题目区的哈希值,而不是把全部语句存上去。当全部查问提交的时辰,这个哈希值会被保管。


若是dnsmasq不编译DNSSEC撑持,那末他默许操纵CRC32作为哈希算法。题目就在于CRC32从暗码学角度并不是一个宁静的算法。能够很轻松的操纵近似SMT solver等东西停止CRC32碰撞,这里道理不做过量先容。


以是基于这一特征,进犯者能够天生多个查问,每一个查问的CRC32的值都不异,不过查问的是差别的域名,而这些域名最好是不存在的,即不被缓存的。而后进犯者能够发送一个具备不异CRC32值的捏造的答复。


以下图所示,进犯者节制一台客户端对多个域名倡议扣问,每一个CRC32的值都是不异的,而后在递归DNS办事器答复之前,答复一个具备不异CRC32值的域名或IP,进犯即有能够胜利。


9.png


● CVE-2020-25686


dnsmasq的另外一个题目便是在统一个域名被查问请求时会粗鲁的建立多个frecs。随后会转发一切的请求,若是胜利的婚配此中的肆意一个,就计入缓存。这个题目致使就算dnsmasq操纵宁静的哈希算法,也能够胜利的实行进犯。


经由进程以上三个缝隙,致使进犯者捏造歹意答复包的胜利率大大进步,前面还须要支配dnsmasq不对答复包做考证的特征停止进犯。


通俗环境下,在递归办事器上会对答复包做一些考证机制,比方bailiwicks。可是在设置装备摆设dnsmasq的装备上并不做任何考证,以是能够在用户请求www.example.com的时辰,进犯者能够发送以下答复:


www.example.com  CNAME  www.bank.com

www.bank.com           A         6.6.6.6


而后这笔记实的缓存就会被拔出到dnsmasq的装备中。前文先容过CNAME,以是当用户想拜候www.bank.com的时辰,会被重定向到被进犯者节制的IP为6.6.6.6的办事器。而设置装备摆设了近似bailiwicks的装备,会去找权势巨子办事器扣问www.bank.com的IP。


Dnsmasq缓冲区溢出缝隙



● CVE-2020-25681


以下称号以标准的DNS称号挨次排序。最主要的标签是“example”。在此级别上,“example”将起首排序,而后是以“a.example”开头的称号,而后是以“z.example”开头的称号。每一个级别中的称号以不异的体例排序。以下图所示。


10.png


CVE-2020-25681缝隙位于dnssec.c文件的sort_rrset()函数中,该函数担任根据DNSSEC考证进程的请求接纳冒泡排序算法将给定的资本记实调集(RRSets)排序为标准挨次。该函数界说以下:


11.png


它接管了呼应数据包(header)和数据包长度(plen)。rrset是指向资本记实调集中RR数组的指针,而rrsetidx是调集中的RR数,rr_desc是指向与RRset接洽关系的RR范例的描写符的指针。最初,有两个缓冲区buff1和buff2,它们用作排序例程的任务区缓冲区。这两个缓冲区在法式起头时都是绝对分派的,它们是daemon> workspacename和daemon-> keyname。当dnsmasq开启DNSSEC时,将会分派这两个缓冲区。


12.png


MAXDNAME巨细为1025,以是workspacename和keyname的巨细2050,也是该缝隙产生溢出的缓冲区。


起首启动dnsmasq,并设置参数为:

-p 53535 --no-daemon --log-queries -S127.0.0.2 --no-hosts --no-resolv -d -q --dnssec--trust-anchor=.,20326,8,2,E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC683457104237C7F8EC8D,机关完歹意DNS查问呼应包,操纵号令行:dig NS+dnssec @localhost -p 53535 .,射中sort_rrset()函数断点后以下图所示:


13.png


在机关资本记实调集(RRSets)时,必须保障记实个数大于1,如许能力保障进入排序轮回。


这里机关的rrsetidx为0x3。


14.png


普通数据包以下图所示:


15.png


Answers块中,p1指向第一个资本记实,p2指向第二个,而后停止排序。


16.png


别离跳过Class,Type和TTL,达到RDATA地区。


17.png


Data lengh为20,为Name Server的长度。而后进入排序轮回。


18.png


行315,起首挪用get_rdata()函数剖析第一个资本记实p1的RDATA域中的NameServer,看下该函数完成。


19.png


判定d是不是便是-1,这里不便是,不进入if语句,离开以下代码。


20.png


而后挪用extract_name()函数剖析,这里须要保障extract_name()函数剖析毛病前往0,保障进入get_rdata()函数前往为0,经由进程设置超长NameServer字符串便可。


21.png


进入if语句,行318,计较len1,为end1-p1,便是NameServer的长度。行319,挪用memcpy()将p1拷贝到buff1+left1中。


22.png


这里len1设置为3550,p1为NameServer,长度RDLENGTH为用户可控。前文已先容buff1为daemon>workspacename,巨细为2020,是以产生堆溢出。


23.png


减缓办法


● 进级dnsmasq到最新版本(2.83及以上),这是今朝最有用的方式。

● 若是不须要,设置装备摆设dnsmasq装备不要在WAN口监听。

●  尽可能设置装备摆设dnsmasq最大转发查问条款小一点。

● 临时封闭DNSSEC考证选项。

● 操纵为DNS供给传输宁静的和谈,如DoT或DoH。


参考链接:


[1] http://www.jsof-tech.com/disclosures/dnspooq/

[2] http://www.jsof-tech.com/wp-content/uploads/2021/01/DNSpooq-Technical-WP.pdf

[3] http://www.rfc-editor.org/rfc/rfc1664.txt

[4] http://security.googleblog.com/2017/10/behind-masq-yet-more-dns-and-dhcp.html

[5] http://spoofer.caida.org/summary.php

[6] http://www.rfc-editor.org/rfc/rfc7858.txt

[7] http://www.rfc-editor.org/rfc/rfc5452.txt

[8] http://www.thekelleys.org.uk/dnsmasq/doc.html

[9]http://dl.acm.org/doi/10.1145/3372297.3417280

[10] http://github.com/Z3Prover/z3

[11] http://www.chromium.org/developers/design-documents/dns-prefetching

[12] http://www.rfc-editor.org/rfc/rfc4033.txt

[13] http://zhuanlan.zhihu.com/p/92899876


启明星斗主动进攻尝试室(ADLab)


ADLab建立于1999年,是中国宁静行业最早建立的攻防手艺研讨尝试室之一,微软MAPP打算焦点成员,“黑雀进犯”观点首推者。停止今朝,ADLab已由进程CVE累计宣布宁静缝隙近1100个,经由进程 CNVD/CNNVD累计宣布宁静缝隙1000余个,延续坚持国际收集宁静范畴一流水准。尝试室研讨标的目的涵盖操纵体系与支配体系宁静研讨、智能终端宁静研讨、物联网智能装备宁静研讨、Web宁静研讨、工控体系宁静研讨、云宁静研讨。研讨功效支配于产物焦点手艺研讨、国度重点科技名目攻关、专业宁静办事等。


adlab.jpg