2020年6月8日,安全研究员Yunus Çadirci公布UPnP(通用即插即用)协议漏洞公告(CVE-2020-12695),并将其命名为CallStranger漏洞。该漏洞允许攻击者绕过内网的数据防泄露系统(DLP)进行数据逃逸,可导致敏感数据泄露,并且可对设备所在内部网络进行扫描,甚至能劫持设备进行分布式拒绝服务(DDOS)攻击。根据CallStranger漏洞原理,启明星辰ADLab以某款智能电视作为测试目标,对CallStranger漏洞的危害性进行了演示分析。
与之前的UPnP漏洞不同,CallStranger漏洞存在于协议设计中,因此该漏洞影响几乎所有支持UPnP的设备,包括Windows 10所有版本、路由器、访问接入点、打印机、游戏机、门铃对讲机、媒体应用程序和设备、摄像头、电视机等。根据SHODAN和ZoomEye的搜索结果,至少有数以百万计的在线设备受到影响。

UPnP全称为Universal Plug and Play,即通用即插即用,UPnP允许各种网络设备在没有任何特殊设置或配置的情况下进行通信,使设备彼此可自动连接和协同工作。例如新的打印机插上电并连接网络之后,局域网内的计算机就知道了打印机的型号等信息,方便进行驱动安装。
在UPnP协议规范中有一个非常重要的功能模块,叫做事件(Eventing)。在UPnP服务进行的时间内,只要设备用于UPnP服务的变量值发生变化或者模式发生了改变,就会产生一个事件,随之向整个网络进行广播。或者用户可以事先向UPnP设备发送订阅请求,保证UPnP设备及时地将事件传送过来。
UPnP Device Architecture 2.0[1]中关于UPnP的NT与CALLBACK订阅模块有如下格式:

publisher path一般为订阅的服务,以GENA格式存放在设备的某个XML文件中,类似下图。

CALLBACK的值一般为回调地址的URL。NT取upnp:event表示订阅事件。
UPnP协议规范文档中提到:CALLBACK是必填区域,所填信息为发送事件信息的URL。一般情况下为UPnP供应商指定。如果其中定义了不止一个URL,设备会按顺序尝试连接,直到有一个连接成功。每个URL一般为HTTP协议(即前缀为”http://”)。设备不得以任何方式截断这些URL。如果内存不足以存储所有的CALLBACK URL,设备会拒绝订阅。
整个订阅流程大概可以简化如下图。

很显然,该协议并没有对CALLBACK传入的URL进行限制和规范,也就是说,CALLBACK URL是攻击者可控的。
下图为Intel UPnP SDK中检查CALLBACK URL的相关代码,create_url_list函数仅仅检查了URL是否合法,并没有确定其是否合理。

CallStranger漏洞所造成的危害可以分三个方面:DDoS攻击、数据逃逸和端口扫描。其中造成的DDoS攻击可以分两种,SYN洪水攻击和TCP反射放大攻击,如下图所示。

假设我们已经通过一些方法(如在局域网广播等)获得了某些设备UPnP服务的eventSubURL,下面就可以向UPnP设备发起一项订阅服务,格式如下:
SUBSCRIBE eventSubURL HTTP/1.1
NT: upnp:enent
Callback: delivery URL
Host: upnp设备:upnp服务端口
如前文协议规范中提到的,若CALLBACL Value中定义了不止一个URL,则会按顺序尝试TCP连接,直到有一个连接成功。那么攻击者可在CALLBACK Value中精心构造多个URL,使每一个都无法连接成功,这样UPnP设备就会用多个SYN包依次对每个URL尝试TCP握手。假设攻击者可以操控很多个设备,就会导致受害设备遭受DDoS攻击。
SYN数据包的数量根据设备操作系统和配置的不同而不同,利用某品牌智能电视对受害设备进行SYN洪水攻击测试,测试结果如下图所示。

该智能电视每收到一个CALLBACK Value就会发送8个SYN数据包尝试连接受害设备。若我们每个CALLBACK的URL值为25字节,那么带宽放大因子便可以达到8*60/25=19.2。因为CALLBACK Value的个数是没有限制的,所以理论上是可以无限放大的。
Windows Media Player在播放视频时也有相应的UPnP服务,我们获取到的UPnP服务列表如下:

我们选取其中一项服务来测试一下。攻击者只需要发送210字节订阅包,如下图。

受害设备之后就会收到近700字节的数据包,放大因子达三倍多。其放大效果一般与UPnP设备的操作系统和厂商配置有关。

一般情况下,企业内部网络都有不同的安全等级划分。当攻击者渗透到企业内网时,若内网开启数据泄露防护系统,无法将获得的敏感数据传输出去,此时UPnP设备会是一个很好的跳板。
在RFC7230的3.1.1节[2]中,并没有对Request Line的长度做任何限制,这使得攻击者可以将数据通过Callback的URL值传输出去。如下图,某品牌智能电视一次请求就传输了2500KB的数据。


如前文提到的,若CALLBACK定义了不止一个URL,则会按顺序尝试TCP连接,直到有一个成功,那么这个规则显然也可以用于端口扫描,如下图所示,假设攻击者需要扫描IP为192.168.1.13的555端口是否开启,那么攻击者只需要将某个可以监控的URL放置在后即可确认,若攻击者收到连接请求,则端口未开启,反之,则开启。

可采用如下措施进行漏洞缓解:
l 检查可疑设备,如果没有必要,则关闭UPnP端口。
l 在网关等设备中审计NOTIFY HTTP数据包。
在最新更新的UPnP协议规范[1]4.1.1节中,可以看出开发者限制了订阅事件的源IP和目标IP都必须在内网中,这从一定程度上修复了该漏洞。
[1] 4c0K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6G2M7r3g2F1j5$3!0F1L8X3g2U0N6r3W2$3K9i4c8&6i4K6u0W2L8%4u0Y4i4K6u0r3N6i4m8F1M7q4)9J5k6s2y4H3k6h3y4K6i4K6u0r3g2g2m8F1f1q4)9J5k6r3q4J5j5$3S2Q4x3X3c8p5k6i4k6A6j5$3g2m8M7X3y4Z5K9i4c8W2j5%4c8#2M7X3g2Q4x3X3c8$3x3W2)9J5k6e0m8Q4x3X3b7J5x3o6t1H3x3o6b7I4y4#2)9J5k6i4m8V1k6R3`.`.
[2] a7fK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6@1L8$3!0D9M7#2)9J5k6h3W2W2N6r3k6Q4x3X3g2G2M7X3N6Q4x3V1k6Z5N6r3#2D9i4K6u0r3M7X3k6U0y4K6t1K6x3q4)9J5x3%4y4W2j5%4c8A6L8$3&6Q4x3X3b7K6i4K6u0W2x3g2)9J5k6e0p5`.
[3] 6bfK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1k6h3I4S2j5i4c8Q4x3X3g2F1k6i4c8Q4x3V1k6J5M7q4)9J5c8U0t1H3x3o6S2Q4x3X3b7J5x3o6l9&6i4K6u0r3M7o6t1$3i4K6u0r3M7X3g2H3L8%4u0@1i4K6u0W2M7r3c8X3
[4] b81K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6C8j5W2)9J5k6h3y4W2M7Y4c8Q4x3X3g2G2M7X3N6Q4x3V1k6$3N6h3I4K6i4K6u0r3K9h3c8Q4x3V1j5K6x3K6V1J5y4K6f1`.
[5] 6e6K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6*7K9q4)9J5k6r3y4F1i4K6u0W2N6r3g2F1j5h3u0D9k6g2)9J5k6h3y4G2L8g2)9J5c8X3u0D9L8$3N6Q4x3V1k6U0N6X3g2Q4x3X3b7J5x3o6t1H3i4K6u0V1x3e0t1$3z5e0g2Q4x3X3c8U0j5h3I4D9M7%4c8J5j5h3&6Y4k6i4u0Q4x3X3c8$3N6h3I4F1k6i4u0S2j5X3W2D9K9i4c8&6i4K6u0V1K9h3&6Q4x3X3c8#2L8X3W2$3k6i4u0K6j5h3I4Q4x3X3c8H3L8s2g2Y4i4K6u0V1j5h3&6V1i4K6u0V1M7r3I4S2P5g2)9J5k6s2g2H3L8Y4m8Q4x3X3c8H3N6i4c8K6i4K6u0V1j5X3W2D9L8r3W2G2L8Y4y4Q4x3X3c8G2k6R3`.`.
[6] b38K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2&6L8%4g2@1N6h3u0W2i4K6u0W2j5$3!0E0i4K6u0r3N6$3q4@1j5$3S2Q4x3@1k6$3i4K6y4p5K9p5A6e0P5p5c8t1f1s2W2f1b7V1f1`.
