【漏洞通告】TCP/IP协议栈漏洞AMNESIA:33

发布时间 2020-12-10

0x00 漏洞概述

2020年12月08日,Forescout实验室公布了4个开源TCP/IP协议栈中被统称为AMNESIA:33的33个漏洞。这些漏洞的严重性已经超出了常规安全范围,并且一直延伸到开发级别。

0x01 漏洞详情

image.png

之前披露出的在Treck TCP/IP协议栈中发现的19个0day漏洞(统称为Ripple20 漏洞)暴露了复杂物联网供应链中的多个漏洞,影响了多个行业的数百万台设备。

研究人员表示,受Ripple20 漏洞的启发,他们分析了其它个7个TCP/IP 协议栈的安全性,以从中找到类似的漏洞。

因此他们今年在“Project Memoria”项目中使用自动化模糊测试和手工代码检查发现了33个漏洞。其中,在uIP中发现了13个漏洞,picoTCP中发现了10个漏洞,FNET和Nut/Net中各发现5个漏洞。

image.png

AMNESIA:33会影响DNS、IPv6、IPv4、TCP、ICMP、LLMNR和mDNS等7个不同的组件,其影响包括远程代码执行、拒绝服务、信息泄漏、DNS缓存中毒等,受影响的组件如下:

image.png

这些漏洞预计影响150多家供应商和数百万设备,涉及嵌入式设备的操作系统、芯片系统、网络设备、OT设备以及大量企业级和消费级IoT设备。

image.png

 

 

AMNESIA:33漏洞列表如下:

CVE-ID

描述

受影响产品/组件

类型

评分

CVE-2020-13984

用于处理IPv6扩展报头和扩展报头选项的函数可以由于未检查报头/选项的长度而进入无限循环状态。

Ext.   header parsing in IPv6 (6LoWPAN)

DoS

7.5

CVE-2020-13985

当解析报头中提供的值时,用于破解RPL扩展报头的函数不会检查不安全的整数转换,从而允许攻击者破坏内存。

Ext.   header parsing in IPv6

DoS

7.5

CVE-2020-13986

用来破解RPL扩展报头的函数不检查接收到的RPL扩展报头的长度值,允许攻击者将其放入无限循环中。

Ext.   header parsing in IPv6 (6LoWPAN)

DoS

7.5

CVE-2020-13987

解析传入传输层数据包(TCP/UDP)的功能不检查数据包头的长度字段与数据包中可用的数据。

TCP/UDP   checksum calculation in IPv4

DoS   、信息泄露

8.2

CVE-2020-13988

给定任意长度,在校验和计算期间可能执行越界内存读取。

TCP   options parsing in IPv4

DoS

7.5

CVE-2020-17437

在处理TCP紧急数据时,对紧急数据指针的值不进行有效检查,从而允许攻击者通过提供任意的数据破坏内存TCP数据包中的紧急数据指针偏移量。

TCP   packet processing

DoS

8.2

CVE-2020-17438

重新组装碎片包的代码不验证其IP报头中指定的传入包的总长度,以及IP报头中指定的碎片偏移值。这可能会导致内存损坏。

Fragmented   packet reassembly in IPv4

DoS

7.0

CVE-2020-17439

即使没有传出的查询,DNS客户端也会解析传入的DNS应答。DNS事务ID不是完全随机的。如果DNS缓存非常小(4个条目),这容易受到DNS缓存中毒攻击。

DNS   response processing

DNS缓存中毒

8.1

CVE-2020-17440

解析传入的DNS数据包时,不检查域名是否为空终止。这使得攻击者可以通过精心设计的DNS响应来破坏内存。

DNS   domain name decoding

DoS

7.5

CVE-2020-24334

处理DNS响应的代码不检查DNSpacket报头中指定的响应数量是否与DNS包中可用的响应数据相对应,从而允许攻击者破坏内存。

DNS   response processing

DoS

8.2

CVE-2020-24335

解析域名的功能缺少boundschecks,允许攻击者用精心设计的DNS包破坏内存。

DNS   domain name decoding

DoS

7.5

CVE-2020-24336

解析通过NAT64发送的DNS响应包中的DNS记录的代码不验证响应记录的长度字段,允许攻击者破坏内存。

DNS   response parsing in NAT64

RCE

9.8

CVE-2020-25112

对IPv4/IPv6报头长度的检查不够,或对ipv6报头扩展长度的检查不一致,使得攻击者可以破坏内存。

ICMPv6   echo/reply processing

RCE

8.1

CVE-2020-17441

IPv6扩展报头的Payload长度字段不检查传入数据包中的可用数据,允许攻击者破坏内存。

Ext.   header parsing in IPv6, ICMPv6 checksum

DoS   、信息泄露

7.5

CVE-2020-17442

处理IPv6数据包的扩展报头的函数和它的选项缺乏对报头长度字段的检查,允许攻击者通过提供任意长度值将函数放入一个无限循环。

Ext.   header parsing in IPv6

DoS

7.5

CVE-2020-17443

在处理ICMPv6 echo请求时,不检查ICMPv6报头是否包含至少8个字节(由RFC443设置)。这将导致基于接收到的请求创建ICMPv6 echo响应的函数,该函数具有较小的报头,从而破坏内存。

ICMPv6   echo request processing

DoS

8.2

CVE-2020-17444

处理IPv6报头的函数不检查扩展报头的长度选项,允许攻击者使用精心设计的长度值将这个函数放入一个无限循环中。

Ext.   header parsing in IPv6

DoS

7.5

CVE-2020-17445

处理IPv6 DestinationOptions扩展头的函数不检查其选项长度的有效性,允许攻击者破坏内存或将函数放入一个具有精心设计的长度值的无限循环。

Ext.   header parsing in IPv6

DoS

7.5

CVE-2020-24337

处理TCP选项的函数不验证它们的长度,这使得攻击者可以将处理不常见或不支持的TCP选项的函数放入一个无限循环中,这些TCP选项都有自己的长度值。

TCP   options parsing in IPv4

DoS

7.5

CVE-2020-24338

解析域名的功能缺少boundschecks,允许攻击者用精心设计的DNS包破坏内存。

DNS   domain name decoding

RCE

9.8

CVE-2020-24339

解析域名的功能缺少boundschecks,允许攻击者用精心设计的DNS包破坏内存。

DNS   domain name decoding

DoS

7.5

CVE-2020-24340

处理DNS响应的代码不检查DNSpacket报头中指定的响应数量是否与DNS包中可用的响应数据相对应,从而允许攻击者内存破坏。

DNS   response processing

DoS   、信息泄露

8.2

CVE-2020-24341

TCP输入数据处理功能不验证传入TCP数据包的长度,允许攻击者读取越界并破坏内存

TCP   packet processing

DoS   、信息泄露

8.2

CVE-2020-17467

解析LLMNR请求时,不检查域名是否为空终止。这可能会让攻击者读取越界。

LLMNR   state machine

信息泄露

8.2

CVE-2020-17468

处理IPv6 Hop-by-Hop扩展报头的功能不检查其选项长度的有效性,允许攻击者破坏内存。

Ext.   header parsing in IPv6

DoS

7.5

CVE-2020-17469

IPv6数据包重组功能不检查收到的碎片是否在内存中正确对齐,允许攻击者执行其精心制作的IPv6碎片数据包。

Fragmented   packet reassembly in IPv6

DoS

5.9

CVE-2020-17470

初始化DNS客户端接口结构的代码没有设置足够的随机transactionid(它们总是被设置为1),容易遭受DNS缓存中毒攻击。

DNS   response processing

DNS缓存中毒

4.0

CVE-2020-24383

解析传入的mDNS数据包时,不检查域名是否为空终止。这允许攻击者实现内存损坏或内存泄漏。

DNS   domain name decoding

DoS   、信息泄露

6.5

CVE-2020-25107

处理DNS问题或响应的代码:(1)不检查域名是否为空终止;(2)不检查DNS响应数据长度(可从数据包中任意设置);(3) DNS查询或响应的次数(在DNS报头中设置)没有与当前数据进行核对;(4) DNS查询或响应中adomain name的长度字节不被检查,用于内部内存操作。

DNS   domain name decoding/ DNS response processing

DoS

7.5

CVE-2020-25108

DoS

7.5

CVE-2020-25109

DoS

8.2

CVE-2020-25110

DoS

8.2

CVE-2020-25111

RCE

9.8

  

其中4个严重的远程代码执行漏洞如下:

Nut/Net远程代码执行漏洞(CVE-2020-25111)

由于Nut/Net处理DNS和响应代码时存在安全问题,攻击者可利用此漏洞远程执行代码。该漏洞CVSS评分9.8。

picoTCP远程代码执行漏洞(CVE-2020-24338)

由于picoTCP解析域名的函数缺乏边界检查,攻击者可以通过伪造的DNS数据包来破坏内存,最终可以远程执行代码。该漏洞CVSS评分9.8。

uIP远程代码执行漏洞(CVE-2020-24336)

由于通过NAT64发送的DNS响应数据包中解析DNS记录的代码没有验证响应记录的长度字段,攻击者可以利用此漏洞来破坏内存,最终远程执行代码。该漏洞CVSS评分9.8。

uIP远程代码执行漏洞(CVE-2020-25112)

该漏洞是对IPv4/IPv6头长度检查不足或对IPv6头扩展长度检查不一致导致的,攻击者可利用此漏洞来破坏内存,最终远程执行代码。该漏洞CVSS评分8.1。

 

0x02 处置建议

目前Contiki-NG、PicoTCP-NG、FNET和Nut/Net已经发布了相关补丁,uIP、Contiki和PicoTCP暂未发布补丁。

建议采取如下缓解措施:

风险评估:风险评估以识别内部潜在威胁(如易受攻击的设备、设备的通信路径、在互联网上的暴露情况等)。

使用内部DNS服务器:由于AMNESIA:33中的几个漏洞与DNS有关,所以尽量使用内部DNS服务器,并密切监视来自外部的DNS流量。

阻止或禁用不必要的IPv6流量:由于AMNESIA:33中的多个漏洞与IPv6组件有关,因此建议阻止或禁用不必要的IPv6网络流量。

网络分段:网络分段来最大程度地减少网络在Internet上的暴露情况。

监视异常数据包:关注网络流量中格式错误或异常的数据流和数据包(如字段长度不合格或校验和失败等)。

 

0x03 参考链接

https://www.forescout.com/company/resources/amnesia33-how-tcp-ip-stacks-breed-critical-vulnerabilities-in-iot-ot-and-it-devices/

https://www.forescout.com/research-labs/amnesia33/

https://searchsecurity.techtarget.com/news/252493283/Forescout-reports-33-new-TCP-IP-vulnerabilities

 

0x04 时间线

2020-12-08  Forescout披露漏洞

2020-12-10  VSRC发布安全通告

 

0x05 附录

 

CVSS评分标准官网:http://www.first.org/cvss/

image.png