AMNESIA33:开源TCP/IP和谈栈系列缝隙阐发与考证

宣布时辰 2020-12-14

媒介


近期,外洋宁静研讨职员在多个被普遍操纵的开源TCP/IP和谈栈发明了多个缝隙,这一系列缝隙统称为AMNESIA33。这些缝隙普遍存在于嵌入式和物联网装备中,影响了多个行业范畴(包含医疗、运输、动力、电信、产业节制、批发和贸易等),今朝已知规模内触及了超150家供给商和数以百万计的装备。与URGEN11和Ripple20差别的是,AMNESIA33影响的是多个开源TCP/IP和谈栈,是以这些缝隙能够悄无声气地影响到有数个代码库、开辟团队与各个公司的产物。今朝已知的缝隙触及到了智能家居、工场PLC、SCADA装备与工控互换机,电力监控等装备


这些缝隙存在于uIP、FNET、picoTCP和Nut/Net等开源和谈栈上,影响TCP/IP和谈栈的多个组件,包含DNS、IPv6、IPv4、TCP、ICMP、LLMNR和mDNS等。此中包含多个严峻缝隙,它们的CVE编号别离为CVE-2020-17437、CVE-2020-17443、CVE-2020-24338、CVE-2020-24336、CVE-2020-25111。


CVE-2020-17437(CVSS评分8.2)、CVE-2020-17443(CVSS评分8.2)可致使装备谢绝办事。CVE-2020-24338、CVE-2020-24336、CVE-2020-25111(这三个CVSS评分均为9.8)都可致使长途代码履行(RCE)。别的28个缝隙的严峻水平各别,CVSS评别离离从4到8.2。


由于IoT、OT、IT装备供给链的特点,缝隙影响的装备浩繁,影响规模广且延续时辰长,缝隙修复的实行较坚苦。同时,由于uIP、picoTCP开源和谈栈已不再掩护,以是局部缝隙不补丁,良多产物只能寻觅替换手艺打算或是增添提防办法。


是以,启明星斗ADLab对相干缝隙停止了阐发,并胜利复现了多个缝隙,开辟了AMNESIA33相干缝隙检测手艺,并提取了流量监控特点,这些手艺正在操纵到咱们的宁静产物中。为了减缓缝隙的影响,咱们提出以下提防倡议。

提防倡议 


对这些缝隙的提防减缓办法,咱们倡议接纳以下几个办法: 


● 设置装备摆设内网装备的DNS办事器为内网DNS办事器。

● 如不须要,请封闭IPv6设置。

● 操纵漏扫产物辨认出接纳题目和谈栈的装备资产,对机关内能够存在题目的IoT、OT和IT装备停止危险评价。

● 防火墙及IPS产物插手AMNESIA33缝隙进犯辨认特点,监控歹意流量。

● 如不须要,装备不要裸露在公网。

● 尽能够更新相干受影响和谈栈到最新版本。


下表是局部已修复的和谈栈及版本:


TCP/IP和谈栈

修复版本

FNET

4.70及以上

uIP-Contiki-NG

4.6.0及以上

Nut/Net

5.1及以上



CISA同盟分享了13个触及到AMNESIA33缝隙的公司的产物修复倡议,包含了Microchip、Siemens等公司的产物,详见参考链接[5]。


相干观点先容 


1、DNS和谈剖析


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


图片


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


图片


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(Resource Record)资本记实是DNS体系中很是首要的一局部,它具有一个变长的布局,详细格局以下:


图片


● 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呼应包以下图所示:


图片


从上图中可知,该Answers区段中存在9个资本记实,红框中表现的是主机地点(A范例)资本记实。


域标签label在DNS数据包里被编码,每个通俗标签的第一个字节代表这个标签的长度,剩下的字母数字字符为标签自身(一些出格字符也是能够的),可是终究开头的字符必然是以空字节开头(即0x00),用来表现域名的竣事。举个例子,以下图所示,域标签第一个字符是0x03,这代表第一个标签长度为3(即0x77 0x77 0x77 == “www”),同理,0x62 0x61 0x690x64 0x75 == “baidu”,最初能够看到以0x00开头。


图片


2、TCP告急形式


为了发送首要和谈数据,TCP供给了一种称为告急形式(urgentmode)的机制,TCP和谈在数据段中设置URG位,表现进入告急形式。经由过程设置告急形式,发送方能够在发送行列中优先发送这局部的数据,并且不必在发送行列中列队,而领受方能够对告急形式接纳出格的处置。这类体例数据不轻易接管被梗阻,办事器端法式会优先接管这些告急的数据,而不必停止列队处置。在TCP报文中界说了两个字段来标示告急形式,一个URG标记,该标记表现报文中有告急数据,另外一个标记是告急指针,它标示告急数据在传输数据中偏移地位。以下图所示:


图片


缝隙阐发 


上面咱们对几个CVSS评分较高的缝隙停止阐发:


1、CVE-2020-17437


CVE-2020-17437存在于uIP和谈栈的uip.c文件的uip_process函数中,该函数首要是处置ip/tcp报文,下图是uIP和谈栈对TCP报文中带有TCP_URG告急指针标识时的处置代码,若是编译时设置装备摆设了UIP_URGDATA,则法式会走到上面的if分支,对告急指针数据停止特地处置。


可是在默许环境下,UIP_URGDATA并不设置装备摆设。代码会进入到else分支,法式会跳过处置告急指针数据,并点窜uip_len的数值。法式在点窜uip_len的时辰并不判定告急指针的值,当uip_len的值出格小,而告急指针的值urgp出格大时,就会引发整数溢出,致使装备重启或是越界读写。


图片


2、CVE-2020-24338


该缝隙呈现在picoTCP/IP和谈栈中剖析域名label的pico_dns_decompress_name()函数中,该函数详细完成以下代码所示:


图片


第95、96行初始化iterator,name指向待解紧缩的labels,dest_iterator指向寄存解压出来的labels的缓冲区,巨细为256字节。第97行起头为while轮回,读取到字符串开头空字节加入。第98行,经由过程iterator&0xC0判定label范例,若是为紧缩label,则经由过程packet定位到通俗label地点的地位,若是为通俗label间接进入else代码块中,第107行,挪用memcpy将通俗label拷贝到dest_iterator中。咱们晓得dest_iterator缓冲区巨细只要256字节,而while轮回加入前提为读到字符串开头空字节,是以当name长度跨越256字节时,致使dest_iterator缓冲区溢出。


3、CVE-2020-24336


该缝隙呈现在contiki和谈栈中的ip64_dns64_4to6()中,该函数功效是将ipv4范例的DNS数据包转换成ipv6范例的DNS数据包,关头代码以下:


图片


遍历Answer区段并更新到ipv6范例的Answer区段中。从第209行起头转换资本记实,详细完成代码以下所示:


图片


起首判定TYPE是不是是DNS_TYPE_A,DNS_TYPE_A表现该资本记实为ipv4主机地点,而后将对应区段拷贝到acopy中。第220行,从资本记实中间接取RDLENGTH,前文已先容,该区段表征RDATA的长度。第227行,判定len长度是不是即是4,这里一般环境,len应当为4,由于ipv4地点长度为4个字节。若是len不即是4,则进入else语句中,间接挪用memcpy停止RDATA数据拷贝。这里是存在题目的,Ipv4主机地点长度不即是4,并不考证主机地点的合感性并且len最大为0xFFFF,间接拷贝能够致使缓冲区溢出。


4、CVE-2020-25111


在操纵Nut/Net和谈栈的装备中,NutDnsGetResourceAll()是处置DNS要求的函数,此中处置DNS回答的函数是DecodeDnsQuestion(),处置域标签的函数是ScanName(),缝隙就呈现在ScanName()函数中。以下图所示,cp为指向域名第一个字节的指针(即第一个域标签的长度字节),*npp为行将被剖析的域名buffer,经由过程strlen()将全部域名长度赋值给rc,而后基于rc分派*npp buffer,以后经由过程一个while,轮回处置每个label。题目不言而喻,cp是进犯者可控的,由此能够节制*npp的巨细。而对标签的长度,即len变量,间接从数据包中获得,并不做任何边境查抄,而后经由过程while轮回处置。是以能够对len设置肆意的值,即进犯者对*npp buffer可控的长度。由此能够在堆中形成越界写,这可致使长途代码履行(RCE)。


图片


5、CVE-2020-17443


CVE-2020-17443存在于PicoTCP和谈栈pico_icmp6.c文件中。题目代码位于pico_icmp6_send_echoreply()函数中,该函数的首要功效是答复ICMPv6应对数据包以呼应对真个ICMPv6Echo(ping)要求。


图片


咱们能够看到,第68行,replay布局的缓冲巨细基于echo的报文中transport_len变量。在第84行,法式从echo->payload向reply->payload地点复制了长度为echo->transport_len- 8巨细的数据。


注重,若是echo->transport_len小于 8,echo->transport_len - 8会致使整数溢出,memcpy操纵会致使缓冲区溢出。


在PicoTCP和谈栈进犯者经由过程机关歹意的ICMPv6数据包,这个歹意的数据包ICMP报头小于8,会致使装备重启或谢绝办事。


缝隙考证


缝隙考证视频请检查ADLab公家号


参考链接:


[1] http://www.forescout.com/research-labs/amnesia33/[2]http://www.securityweek.com/amnesia33-vulnerabilities-tcpip-stacks-expose-millions-devices-attacks

[3] http://www.zdnet.com/article/amnesia33-vulnerabilities-impact-millions-of-smart-and-industrial-devices/

[4] http://tools.ietf.org/html/rfc1035

[5] http://us-cert.cisa.gov/ics/advisories/icsa-20-343-01


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


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


adlab.jpg