破解并修复VoLTE:利用隐藏的数据通道和错误的实现方式

virustracker 2015-11-06 14:25:00

from:http://dl.acm.org/citation.cfm?id=2813718

0x00 摘要


LTE正逐渐发展为当今的主导蜂窝网络技术,开始从电路交换网络转向与互联网更相似的分组交换网络。为了让LTE网络支持语音通话,运营商引入了VoLTE语音服务。无论是从用户设备还是基础设施的角度来看,这项技术大大地改变了语音通话的处理方式。我们发现,这次突然的转型给攻击活动敞开了大门,引出了大量此前未经研究过的攻击途径。为了呼吁人们关注这一问题,我们系统性地分析了VoLTE语言服务的安全性。

不同于传统的通话设置,VoLTE的通话设置是由应用处理器(AP)控制和执行的,使用的是IP上的SIP协议。一名合法用户只要控制了AP就有机会控制和利用通话设置过程来创建一个VoLTE通道。再结合旧有的收费策略(比如,不限制语音,数据和语音的分离),这样就能创建大量的免费数据通道。在寻找免费数据通道的过程中,我们还在早期的VoLTE实现中发现了大量的漏洞,而这些漏洞会导致更严重的后果,比如,虚假来电,超额计费和拒绝服务攻击。我们已经确定了这些漏洞的特性,并且也发现了一些由VoLTE直接造成的利用方式。另外,我们也提出了快速应对方案来解决这些问题。但是,我们认为,只有更全面的解决方案才能从根本上解决移动设备、移动平台和核心网络上存在的问题。

关键词:

VoLTE,收费,安全,蜂窝网络

0x01 介绍


由于对数据服务的需求不断增长,移动网络运营商快速地转向了高速网络。凭借更高的带宽和更低的延迟,LTE已经成为了近年来的主流蜂窝网络技术。LTE技术的一个显著特征就是其发送数据的方式,比如语音和SMS;LTE是通过数据包进行数据交换,然而传统的蜂窝网络(比如,2G,3G)是依靠电路交换来进行语音服务。为了在只有数据交换的网络上提供稳定的语音通话,移动网络运营商采用和部署了在近期启动的一项服务,叫做VoLTE语言服务,这项服务与VoIP服务的理念很类似。

今天,移动网络运营商都在激进地部署VoLTE服务:到2015年4月,7个国家的16家运营商已经启动了商用VoLTE服务,47个国家的90家运营商正在投资部署VoLTE服务。尽管有这样的快速转型趋势,但是很少有研究会系统性地检查VoLTE服务的安全问题,无论是对于运营商的后端接口,还是他们的蜂窝基础设施。

VoLTE中数据交换的使用造成了大量可能的攻击途径,但是,人们还没有重视事态的严重性。在电路交换移动网络中,信令处理是由手机中的通讯处理器(CP)完成的,只有很少的几家芯片制造商掌握了具体的实现方案。相反,在支持VoLTE的设备上,信令处理只会存在于应用处理器上(AP):比如,启动会话初始协议(SIP)。对于一般用途的计算机,VoLTE会完全依靠互联网协议(IP)来传递数据包。所以,针对IP的常见攻击技术也可以用于滥用或攻击基于VoLTE的设备。

目前,已经有一些研究分析了SIP和VoIP服务中存在的潜在攻击方式和应对策略,包括,认证破解,收费绕过,中间人攻击以及其他各种攻击活动,甚至是基础安全问题标准化,比如,凭据,完整性和认证问题。因为,VoLTE是在蜂窝网络上运行的,所以,VoLTE不仅仅会遇到与VoIP相关的问题,还会遇到蜂窝网络上存在的问题,比如,攻击者可能会介入数据处理本身。不同于VoIP服务,一旦建立了一个VoLTE通话,LTE网络就会提供一个保证了带宽的通讯通道(我们称之为bearer)。由于可以很容易地介入具有VoLTE功能的通话信令,攻击者就可以创建并利用私密通讯通道来进行点对点的数据交换,而这个特性在蜂窝网络中是不受支持的。并且,因为多数运营商并不会针对VoLTE服务中的专用通道收费,所以攻击者就可以免费使用这个信道了。

更严重的是,VoLTE的认证和会话管理中存在实现问题,而这个实现问题会让基础设施变得很脆弱,所以,攻击者就可以很容易地通过攻击来绕过VoLTE的安全策略。

对于用户设备(UE)而言,攻击者在利用VoLTE中的安全漏洞时,可以在没有取得相应通话权限的情况下启动通话,因为安卓设备当前的权限模式只适用于电路交换通话。

在本文中,我们首先指出了商业VoLTE服务中存在的问题,涉及到了美国和韩国的5家运营商。这些问题主要是由旧有策略和不成熟的VoLTE软件基础设施造成的。为了证明我们解决这些问题的决心,我们演示了好几种攻击方式(1)利用隐藏的免费数据通道(例如,攻击者可以获取到额外的免费带宽),(2)绕过VoLTE的收费系统(比如,绕过收费服务器直接进行通话),(3)滥用VoLTE服务(比如,伪装来电,超额计费攻击)。

除此之外,我们也提出了能解决这些问题的快速应对方法。要想应用这些快速解决方案,1)运营商可能需要部署DPI(深度数据包检测)来检测隐藏的数据通道,2)严格管理手机端和运营商的会话,3)固定蜂窝网关来阻止隐藏通道。对于长期的解决方案,我们建议供应商更改收费策略,加强移动设备上的安全实现。但是,要想完全解决问题,蜂窝运营商,设备制造商和移动平台供应商必须起草更全面的解决方案。

总的来说,我们做出了下面的3点贡献:

  • 据我们所知,这是首次有人尝试分析商用VoLTE的安全漏洞。我们新发现了VoTE上存在3个未知安全问题:1)VoLTE服务中存在隐藏数据通道,2)蜂窝运营商的实现有问题,3)移动设备中存在基础性问题。
  • 为了证明我们解决这些问题的决心,我们成功演示了一种能启用免费数据通道的攻击方法,以及其他多种滥用攻击,包括,虚假来电和拒绝服务攻击。在投稿时,所有的bug和漏洞都已经报告给了运营商。
  • 我们提出了一些有效的快速解决方案,以及一种能长期应对当前VoLTE安全问题的综合性解决方案。

本文的结构如下。 §2概述了VoLTE系统、其网络架构和通话设置过程,包括运营商的收费策略。在 §3中,我们通过分析VoLTE的通话流程,提出了VoLTE服务中目前存在的问题和威胁。在§4中,我们详细地解释了隐藏数据通道攻击、这种攻击的实现细节和应对措施。§5介绍了是由VoLTE服务中几个实现漏洞导致的攻击方法。在§6中,我们提供了应对办法和根本的解决方案。§7是相关工作。在§8中是我们的研究总结和未来工作方向。

图1-3G和LTE网络的结构展开图。移动管理实体(MME)在LTE中代表的是用户移动性。

0x02 背景


2.1 LTE网络基础设施

一个蜂窝网络由两个结构组件构成的:一个连接到UE的接入网络和一个支持蜂窝基础设施的核心网络。图1中就是3G和LTE网络的结构展开图。接入网络(左侧)是一个无线电连接,UE就是在这里访问基站(比如,3G中的NodeB,演进后的NodeB,LTE中的NodeB)。从另一方面看,核心网络(灰色区域)负责处理服务级的连接,比如语音通话和互联网(例如,3G中的PSTN和LTE中的IMS)。IMS就是IP多媒体子系统,负责提供基于IP的语音通话,并通过SIP(下)来提供多媒体服务。PSTN是公共交换式电话网,这是一种典型的公共电话网络(上)。核心网络中的4G 网关包括服务网关(S-GW)和P-GW。S-GW是一个处理eNodeB间交接的移动锚点,依靠的是2G/3G系统与P-GW之间的流量。同时,P-GW管理着UE与服务之间的PDN连接,还负责处理数据包过滤和计费,这两个功能是阻止收费绕过和服务滥用攻击的关键。

3G(上)与LTE(下)网络的主要区别是它们在核心网络中传递数据的方式不同。3G网络会把网络域分离到分组交换中来进行互联网连接,并且会通过电路交换来进行手机通话。在电路交换域中,是移动交换中心(MSC)负责传输语音通话,而在分组交换域中,是3G网关来启动数据通讯。相比之下,LTE只能使用过分组交换域操作,因为LTE上没有电路交换域,所以其语音通话要么回落到3G网络上(电路交换回落,CSFB),要么就是用LTE提供的VoLTE解决方案来把语音通话和数据传输到分组交换域上,这样就不需要回落到3G电路交换网络上了。

图2-VoLTE中的Epacket交换和IMS协议;UE和LTE网络之间的注册和通话设置

2.2 VoLTE服务

VoLTE服务的引入是为了让基于分组交换的LTE网络能传递语音通话。这项服务利用了一种基于SIP的IMS网络,与LTE网络上的VoIP服务很类似。UE会按照图2中的标准过程来建立语音通话。

为了连接到LTE网络,(1)UE首先连接到eNodeB,然后(2)UE寄存器把自己注册到演进分组系统(ESP)中,并创建一个互联网协议(IP)连接,而默认bearer会识别出这个连接。注意,这个IP地址和数据连接中使用的IP地址是不一样的。一旦UE取得了VoLTE的IP连接,(3)UE就会连接到IMS网络,而IMS服务器就会认证设备是否允许进行VoLTE服务。

如果通过验证,(4)UE就可以通过呼叫会话控制功能(CSCF)服务器提供的SIP信令服务来进行语音通话。当建立了一个通话会话后,(5)一个专用bearer就会被创建,用于识别与语音相关的流量,并且(6)所有的语音数据包都可以通过这个专用bearer传输。(7)在通话终端上,用于处理语音会话的bearer就会被释放。

注意,这两个bearer的作用就是为了启用VoLTE服务上的一个连接。在EPS注册阶段创建的默认bearer会用于处理通话信令。一旦创建了bearer,所有输入和输出的SIP数据包就都会绑定到这个bearer。根据3GPP规范的要求,在所有能处理语音或数据服务的bearer中,这个bearer的优先级是最高的。不同优先级的划分主要是为了支持手机通话上的QoS,与基于电路交换的路由类似。当拨打电话时,IMS分组数据网络(PDN)会临时创建一个专用的bearer,这个bearer的优先级要比默认bearer低。但是,这个bearer的优先级要比其他处理数据服务的bearer高。虽然,专用bearer使用的IMS PDN与默认bearer是相同的,但是,专用bearer使用了不同的操作规则,从而让语音数据包和议定的媒体端口能通过专用bearer。

2.3 VoLTE 信令协议

通话信令.图3中是两个UE之间(UE-A和UE-B)的通话设置过程。图3可以被看做是更具体地解释了图2中的(4)到(7)过程,对应的是VoIP协议。为了启动一个到UE-B的VoLTE通话,UE-A首先会生成一条INVITE信息,并把这条信息发送给一个SIP服务器。在这条INVITE信息中包含有呼叫者的电话号码,IP地址和媒体特征:端口号,编码方式以及用于媒体通讯的QoS参数。在接收到INVITE信息后,SIP服务器会向UE-A响应一条TRYING(100)信息,然后在检查了信息的有效性后,再把INVITE信息转发给UE-B。UE-B在接收到INVITE信息后,会响应RINGING(180)和SESSION PROGRESS(183)信息来指示调用会话正在处理中。UE-A会发送一条进程确认(PRACK)信息来响应SESSION PROGRESS信息。

图3-通话设置的VoLTE信令(SIP)流与分解

如果用户收到了UE-B上的通话,用户就会发送一条与INVITE信息类似的OK信息(200)。当SIP服务器接收到了OK(200)信息时,SIP服务器就会把这条信息路由给UE-A并开始给通话会话计费。UE-A只要一接收到OK(200)信息,在UE-A和UE-B之间就会创建一个用于处理语音数据的端对端媒体会话,在IMS网络中就会创建一个媒体代理。通常情况下,这个媒体会话是使用UDPshang的RTP(实时协议)协议实现的。当任何一个UE想要结束通话时,媒体会话就会向SIP服务器发送一条BYE信息。在接收到BYE信息后,SIP服务器就会停止对通话会话的计费,把BYE信息路由给其他UE,并终止媒体代理。

EU中的通话管理.当创建了一个通话会话后,UE之间就会通过建立的媒体通道来相互传输语音数据。我们在试验中使用的智能手机具有两个处理器:一个应用处理器(AP),负责运行智能手机的操作系统(比如,安卓)和用户应用;和一个通讯处理器(CP),负责处理无线电访问和与无线电相关的信令。

通话信令是由AP中运行的一个SIP客户端处理的。这个SIP客户端会把自己的socket绑定到一个特定的端口上(默认:5060),以便与SIP服务器通讯。同时,CP中具有一个数字信号处理(DSP)模块,会负责处理与基站进行的无线电通讯,以及来自喇叭和麦克风的声音数据。从无线电通道上接收到语音流量后,CP就会处理语音数据包并只把声音数据转发给AP,这样就能减轻AP的计算负担。

表1-受测运营商的VoLTE服务特征

0x03 实证分析VoLTE服务


在这一部分中,我们实证分析了当前商业VoLTE服务实现方法的安全性。我们测试了美国和韩国的5家主运营商,因为在这两个国家中,VoLTE服务普及的比率最高。

在我们的安全测试中,我们假设攻击者无法物理接触到核心网络,而是某个LTE网络的合法用户。这样对于攻击者来说,蜂窝网络的真实实现情况就像是一个黑匣子,也就是说,攻击者只能访问到公共信息,也只能通过分析VoLTE服务的行为来推测其实现方式。另外,攻击者也可以获取到移动设备的完整权限来访问原始的socket或安卓内核中的设备接口。简而言之,攻击者可以获取到手机上的root权限。

在这一部分中,我们还介绍了从VoLTE运营商那里发现的一种很有趣的收费策略:这种收费策略与其成本模型存在偏差。在理解了其收费策略后,我们解释了在当前VoLTE协议中发现的一个隐藏免费数据通道。我们还解释了如何利用这两者之间的偏差,然后又描述了在商用VoLTE服务中发现的几个问题。

3.1 VoLTE 通话的收费

虽然,VoLTE是在分组交换网络上(也就是运行在IP上)实现的,但是VoLTE还是采用了和3G网络一样根据时间收费的策略。传统意义上,通过电路交换网络实现的语音通话会根据通话占用的通道时长来收费(比如,225分钟$15)。相反,通过分组交换网络的数据连接是根据字节使用量来收费(比如,1GB$15)。因为VoLTE只利用了分组交换网络,所以,VoLTE通话和数据连接都会使用字节。尽管如此,大多数运营商还是很奇怪的根据通话时长来收费。这种偏差会让收费过程更复杂,因为数据连接和通话过程中使用的IP地址是不同的,所以他们的收费单位也是不同的。此外,近期很多运营商还为VoLTE用户提供了无限通话时长作为默认收费计划,在利用后,也可以用作免费得数据通道。

3.2 分析隐藏的数据通道

根据上面列出的问题,我们全面分析了目前的VoLTE服务。为了判断怎样才能绕过VoLTE上的收费策略,我们首先分析了VoLTE协议的3GPP规范。然后,我们又检查了目标运营商是如何实现的收费策略,通过检查UE和蜂窝核心之间的实际流量,从而检查其中是否存在任何可以利用的漏洞。

3.2.1 潜在的免费数据通道

如上所述,VoLTE的通话计费是从SIP服务器从UE-B上接收到OK(200)信息开始的。所以,如果UE-B没有向SIP服务器发送OK(200)信息,通话就不会计费。

攻击者也可以考虑通过把数据封装到SIP信息中的方式来发送数据(比如,在OK(200)信息之前的信息,INVITE信息),或直接向UE-A发送OK(200)信息,来绕过SIP服务。因为每个UE已经获取了其默认VoLTE bearer的IP地址,所以UE-A可以使用这个地址直接向其他的UE发送信息,如果运营商的实现方法中没有拦截这种情况的话。

此外,根据3GPP规范,语音流量的QoS参数是在INVITE信息中指定的。所以,如果攻击者能够操控这个参数,那么攻击者就能够增加带宽,从而发送大量的数据。

注意,通过分析SIP的网络流就能很容易地拦截或检测到上面提到的这种免费数据通道。但是,如果攻击者把数据嵌入到媒体会话中会怎样呢?这样,要想再检测的话就会需要投入巨大的实现努力,因为运营商需要检测媒体会话中的数据是否是语音。

总的来说,攻击者可以尝试 1)把数据压入SIP数据包中,2)直接把数据发送给SIP服务器,或3)通过媒体会话来发送数据。

3.2.2 实证分析

根据对VoLTE信令协议的了解,我们分析了5大运营商的真实通话流。不同运营商的服务特点都总结在了表1中。注意,每家运营商支持的VoLTE智能手机也不同,并且只有少量的型号可以支持VoLTE。我们分析了下面这四款型号的手机:Samsung Galaxy S5,S4 和 LG G3。在每组实验中,我们会至少使用其中的两个型号。

传输协议.为了发送/接收SIP信息,韩国运营商仅使用了UDP协议,而美国的运营商支持UDP协议和TCP协议。我们发现美国运营商会使用UDP协议来发送响应信息,比如ACK或PRACK;而TCP协议会用于所有其他的SIP信息。有一家美国运营商使用了AES加密的IPsec来保护SIP信息。幸运的是,我们可以在UE端,修改SIP的配置文件,从而把IPsec的加密算法从AES更改为Null。另外还值得注意的是,我们能以明文方式来分析通话流。此外,我们还发现在手机上运行的一个IPsec守护进程会自动打包数据包,并让数据包通过SIP端口进入IPsec隧道。利用这个守护进程,我们就能够把SIP信息发送到SIP服务器。

更改SIP源端口. 因为UE-A中的原生 SIP 客户端已经在监听一个预定的端口了,所以其他的自定义应用就无法再绑定到这个端口。因此,我们检查了 SIP 服务器是否能接收其他的源端口,我们发现除了美国的一家运营商,其他所有的运营商都允许接收其他的源端口。如果一个恶意的 app 启动了 VoLTE 会话,这样就会造成一些问题(详情请参考 §5.1)。

媒体代理. 我们还检查了用于转发媒体数据的代理是否存在。我们的分析结果表明,有两家运营商没有使用媒体代理,这样就会造成UE可以直接转发媒体数据。在这种情况下,当UE发送INVITE信息给SIP服务器时,UE就会接收到一条响应信息,而这条信息中会包含有其他UE的IP地址。这样,UE就可以通过随机发送INVITE信息给SIP服务器的方式,来收集其他UE的IP地址。另外,如果有媒体代理,媒体代理还可以通过检测数据包来检测媒体会话中的恶意行为。

通过媒体会话发送数据.当建立了一个通话时,一个专用bearer会被创建来进行媒体会话。然后,语音数据包会直接通过这个bearer从UE-A中的CP中发出。但是,在所有的运营商中,我们都能够通过AP中的这个bearer发送包含有IP地址和SIP信息中指定端口号的数据包。换句话说,安卓设备中没有相应的权限能控制专用bearer进行媒体会话。并且,通过媒体会话传输的数据是不收费的,因为运营商为VoLTE用户提供了无限通话。

操控 QoS协商. 我们调查了我们是否能通过操控INVITE信息中指定的QoS参数来获得更高的带宽。但是,我们发现,即使是更改了INVITE信息中的QoS参数,专用bearer的实际QoS级别也不会发生变化。换句话说,对于所有的运营商而言,SIP服务器不会考虑INVITE信息中的QoS参数(详情请参考§4.2.1)。

总结. 和我们讨论的一样,VoLTE中可能存在多个隐藏的数据通道。在 §4中,我们演示了如何利用这些通道,并说明了哪些运营商开放了这些通道。

3.3 VoLTE的实现问题

在分析VoLTE通话流的整个过程中,我们发现了几个与UE和运营商都相关的安全问题。

权限模式错配. 我们发现的这个问题很有意思。一般情况下,出于安全原因,移动设备上都会有独立的权限来约束应用的行为。比如,在安卓设备上,应用必须获取权限_android.permission.CALL_PHONE_才能拨打电话。但是,我们发现,由于VoLTE接口的实现,我们可以破解这个权限。为了验证是否可行,我们开发了一个只具有权限_android.permission.INTERNET_的安卓应用,这个权限能允许应用向网络发送数据。利用这个权限,应用就可以把SIP信息发送到SIP服务器上,从而拨打电话。这就证明了,目前的安卓权限模型无法区别SIP信息和数据通讯。我们还发现,当应用启动通话时,通话状态并不会在手机上显示。因此,用户也不会察觉到自己的手机正在通话。

图4-(1) SIP 隧道流和 (2) RTP 隧道流

图5-直接通讯通道流

直接通讯.当UE-A拨打电话时,UE-A会向SIP服务器发送一条INVITE信息。然后,SIP服务器就会管理UE之间的通话会话。在蜂窝网络中,直接从手机到手机的数据通讯会被NAT(网络地址转换)拦截,即使这两台设备知道彼此的IP地址。我们发现有两家运营商允许直接从UE-A向UE-B发送SIP信息;另外,通话会话还可以成功创建。所以,与 §2.3中讨论的一样,通讯可以不计费。造成问题的原因来源于默认bearer采用了不合适的权限控制来处理LTE网络中PG-W的SIP信令。

缺少认证. SIP服务器应当认证每条SIP信息,判断信息是不是有效用户发出的。但是,我们发现,韩国的两家运营商并没执行适当的用户认证。所以,我们可以通过发送被操纵的INVITE信息来使用虚假的电话号码拨打电话。

缺少会话管理.除此之外,我们发现除了韩国的一家运营商,其他的运营商都没能正确地管理通话会话。由于SIP服务器中存在错误的会话管理,攻击者可以通过创建多条SIP信息来同时向多人拨打电话。这种情况应该是不允许发生的,因为不应该创建一个以上的通话会话。此外,这个问题还可以用于发动控制平面上的DoS攻击。核心网络只能够管理有限数量的bearer,如果遭到入侵的手机开始发送多条INVITE信息,导致大量的bearer生成,这样就会耗尽LTE网络中的资源。当UE-A发送一条INVITE信息时,专用bearer就会被创建用于UE-A和UE-B,即使UE-B并不会响应这次通话。

总结. 正如我们在这一部分讨论的,VoLTE中存在几个潜在的安全问题。在 §5中,我们会讨论如何针对不同的供应商来利用这些漏洞。

0x04 利用隐藏的数据通道


在分析收费策略和VoLTE通话流的过程中(§3.2),我们证明了攻击者可能会利用隐藏通道来绕过收费。这些通道都是贮存在VoLTE通话流(也就是SIP和RTP隧道)中的通道以及一个利用了VoLTE默认bearer的直接通讯通道。

SIP/RTP隧道tunneling 是VoLTE通话服务中潜在的免费通道,如图4。(1)在SIP隧道中,有效载荷会嵌入到SIP信息中,而这些信息会通过默认bearer发送。同时,(2)RTP隧道会承载着有效载荷通过创建好的专用bearer,与 §2.2中的解释一致。严格的来讲,任何协议都可以用于通过媒体会话来传输数据。但是,我们利用了RTP隧道,因为受测的所有运营商都会把用RTP协议来压缩语音数据。注意,使用这条通道传输的语音数据都会在CP中处理,大部分的实现细节仍在专利保护中。

直接通讯通过这个通道也可以直接把某个UE数据发送给其他UE。图5中就显示的就是直接通讯流程:(1)手机到网络,(2)手机到手机。因为,只要设备启动,就会创建负责处理VoLTE信令信息的默认bearer,所以,UE可以很容易地通过这个bearer把数据发送到网络或其他的UE,只要P-GW不拦截。

4.1 开发

我们自己实现了几个发送和接收模块来验证操作网络中是否存在隐藏通道。图6中显示的就是发送模块(左)和接受模块(右),这两个模块是通过IMS网络连接的。

因为3GPP规范允许运营商有一定的自由,并且也不是所有的运营商都会完全遵守3GPP规范,所以我们的模块会考虑到具体的实现偏差。例如,对于使用了IPsec的运营商,我们利用了创建好的IPsec隧道来发送数据而不是直接发送SIP信息。对于直接通讯,我们不需要任何额外的实现,因为我们在每一端上都打开了一个socket,并且可以的话,直接传输数据包。

4.1.1 发送模块

首先,我们的发送模块在功能上,比手机中原生的VoLTE通话应用更丰富;我们的发送模块应该能更改自己的参数,比如发送者的电话号,IP地址和端口号,从而创建任意的媒体会话。发送模块包括有SIP解析器,SIP处理器,SIP隧道发送器和RTP隧道发送器。

(1)SIP解析器负责在从原生VoLTE apps中获取到的数据包中,提取常规的标头和特定运营商标头。例如,IVITE信息中就包含有呼叫者的电话号码,IP地址和路由信息,比如SIP服务器的IP地址。SIP解析器会自动处理这类信息并将其储存到数据库中,根据运营商来区分,用于之后在发送模块中重新创建SIP信息。

(2)SIP处理器负责管理开发。当我们发送攻击时,SIP处理器就会提取配置值:运营商名称,电话号码,电话的IP地址和隧道的端口号。通过简单地修改这些配置值,SIP处理器就会为运营商生成SIP信息,并且还会随机生成参数(比如,分部,标记和通话ID)来区别每个通话会话,以保证最新性。SIP处理器会触发SIP隧道发送器或RTPP隧道发送器来进行每项测试。

(3)SIP隧道发送器当接收到SIP处理器发出的信号后,会创建一个SIP隧道。首先,SIP隧道发送器会把要传输的文件分割成几个数据块。然后,把分割好的数据块嵌入到SIP信息中。因为,数据块的数量有最大限制(否则IMS中的SIP服务器就会拦截),并且大小不能超过MTU,所以SIP处理器可能需要把文件分割成多个数据块。为了方便,我们把数据块放在了INVITE信息主体的最后面。

(4)RTP隧道发送器比SIP隧道更复杂。RTP隧道和SIP隧道的文件分割都是一样的。但是,首先,我们必须要创建一个媒体会话来传输数据。所以,RTP隧道发送器会生成一条INVITE信息,并遵循原生通话流程,直到获取到被呼叫人发送的OK(200)信息。然后,RTP隧道发送器会从创建好的媒体通道中提取被呼叫人的IP地址和端口号。这个发送器会把数据块打包成一个RTP数据包,传输给获取到的IP地址和端口号。在原生通话apps中,语音是在CP上打包并发送的。但是,和§3.2.2中描述的一样,我们发现从AP向接收者发送的声音数据包也能正确地路由。为了区别我们的数据包,我们在有效载荷的开头添加了一个标示符。我们还在标示符后面添加了序列号和时间戳,用于表现评估。

4.1.2 接收模块

接收模块会接收发送模块通过IMS网络发来的RTP数据包中的数据块。我们的接收模块包括SIP隧道接收器,RTP隧道接收器,测量引擎和数据存储。

(1)SIP隧道接收器负责解析SIP信息并从收到的RTP数据包中提取数据。因为SIP信息是在AP中处理的(如§2.2所述)所以,SIP隧道接收器可以捕捉到输入的数据包并实时解析。因为我们把数据块放到了INVOTE信息主体的最后,所以,接收器可以很容易地提取到分割后的数据块并重组。接收模块打开了一个原始的socket来捕捉数据包,因为设备上已经运行了一个SIP守护进程。对于使用了IPsec的运营商,我们可以很轻松地从ESP数据包中提取出SIP信息,因为我们已经把加密算法更改成了Null。

(2)DIAG是高通的诊断协议专利。其中有一条命令可以通过安卓内核中的DIAG接口,把接收到的每个数据包镜像给RTP隧道接收器。要想从CP镜像到DIAG接口,移动设备必须连接一次笔记本。完成之后,就可以断开与笔记本的连接了。

这一步非常有必要,因为我们通过媒体通道发送的数据只能在CP中处理,但是不能转发给AP。因此,为了直接接收和处理数据包,我们需要利用DIAG命令。

除了DIAG命令,我们也可以考虑安卓无线接口层(RIL)来接收声音数据。RIL接口的问题在于,有些移动设备并不会把输入的语音导出给AP。反而,会把输入的语音直接传输给喇叭。因为,这种限制,我们选择使用了DIAG命令。

(3)RTP隧道接收器会利用 DIAG 接口。当移动设备接收到 DIAG 命令后,RTP隧道接收器就会开始接收所有通过 DIAG 接口的网络数据包。如果接收到的数据包没有损坏,并且包含了我们在发送模块中设置的标识符,RTP隧道接收器就会接收这个数据包。最终,这个接收器会提取并把数据块发送给数据存储,而序列号和时间戳会发送给测量引擎。

图6-发送和接收模块图

4)测量引擎负责接收从接收器发来的序列号,时间戳和数据大小,从而评估我们隧道的网络表现。注意,我们并没有测量SIP隧道的变现,因为可能会造成IMS网络中的SIP服务器出现拒绝服务(详情请参考§5 )。

4.1.3 挑战和限制

在我们的实现过程中,我们遇到了一些挑战,首先,有很多运营商并没有遵循SIP信息流程规范或SIP信息结构规范。例如,有些运营商在通话设置期间,并不会传输RINGING或SESSION PROGRESS信息。甚至有些运营商,会为了自己的一些目的,简单地修改或移除标头字段。相应的,我们就必须做很多工作才能保证我们的发送模块能适应运营商自己的VoLTE功能,并获取到结果。

第二项挑战出现在接收器上,当设备在一段时间内(一般是10s)没有接收到RTP数据包时,就会通过发送BYE信息来自动关闭通话会话。所以,我们必须要把数据块打包到RTP数据包中才能保证会话是活动的。

最后,接收模块需要移动设备连接一次笔记本才能发送DIAG信息。但是,只要登录设置完成了,设备就不需要再连接笔记本了。我们发现安卓内核中的DIAG接口不会能接受DIAG命令。为了不连接一次笔记本,我们尝试了从内核中发送DIAG命令,但是没有成功。相反的,我们可以通过USB连接从笔记本上发送DIAG命令。在CP中可能有一个保护机制会拦截从移动设备上发出的DIAG命令,因为这些命令往往是从笔记本上的控制软件发出的。

4.2 评估

4.2.1 媒体通道属性

我们首先测量了在通话期间,媒体通道的特征,并列在了表2中。我们使用Innowireless公司的OPTis-S4软件进行了实验。这些媒体通道特征代表了运营商设置的bearer信息和INVITE信息中指定的QoS带宽参数。

表2-媒体通道的特征

表3-针对不同的供应商,我们的收费绕过是否是可行的

当一台移动设备创建了一个媒体通道后,网络就会请求创建包含有QoS信息的bearer。我们分析了这个请求,并提取出了媒体通道的带宽,延迟和丢包率。但是,有些运营商并不会在信息中指定这些信息。在这种情况下,我们会使用信息中的QoS类识别符(QCI)值来识别通道特征。多数的运营商,如表2,在bearer请求中指定的带宽都不同于INVITE信息。

4.2.2 测量隐藏的数据通道

我们测量了发送和接收模块在处理隐藏数据通道时的网络表现。受测试的运营商还是那5家。在每条隐藏通道上的收费绕过可行结果都已经列在了表3中。从图中可以看出,如果我们通过某条特定的通道发送数据,是不会收费的。以SIP隧道和RTP隧道为例,所有的运营商都开放了免费的数据传输。但是,直接通讯针对不同的运营商有不同的结果。以US-1为例,手机到手机的通讯是可用的,但是手机到网络访问是禁止的。在KR-3上标记的三角符号表示对于IPv4有可用的免费数据通道,但是IPv6没有。因为,直接访问是由于实现缺陷或P-GW的拦截策略导致的,所以针对不同的运营商,结果也不同。通过可行性分析,我们发现,对于没有使用媒体代理的运营商,手机到手机的直接通讯是可行的。

表4-针对不同的供应商,RTP隧道测量结果

我们还测量了每家运营商的实际网络表现,包括吞吐量,延迟和丢包率,如表4。虽然,在bearer创建请求中会包含这些网络表现信息,我们还是通过这次实现确定了真实的表现情况。因为,传输数据上封装了一个基于UDP协议的RTP标头,所以我们又额外添加了一个标识符,序列号和时间戳。为了测量吞吐量,我们测试了每个单位时间内,接收到的数据包字节。对于延迟,接收器会同步发送器发出前两个数据包的时间,从而计算发送和接收时间差和延迟。

注意,在我们的隐藏数据通道上,我们尽可能快地发送数据。但是,因为带宽限制,当我们增加吞吐量时,有更多的数据包丢失了。因此,通过延发或变更有效载荷的大小,把丢包率控制在1%(也就是使用和表2中相同的丢包率),我们就能获取到真实的吞吐量了。

在实验中,我们发送了200,000个数据包,并计算了平均结果。因为,过多的SIP信息会破坏IMS网络中的SIP服务器,所以我们没有测量SIP隧道的表现。在表4中,我们可以看到测量结果与§4.2.1中的媒体通道特征有区别。造成这种差异的原因有:用户数量,蜂窝网络状态或蜂窝塔的信号强度。

我们还测量了直接通讯的表现:手机到手机和手机到网络。手机到手机之间的最佳通讯结果是16.84Mbps,是韩国的一家运营商。在手机到网络上,最佳结果是21.55Mbps,还是同一家运营商。造成高吞吐量的原因是因为处理信令的默认bearer带宽与负责数据服务的默认bearer采用了相同的配置方式。但是,与§2.2中介绍的一样,通过负责处理VoLTE信令的默认bearer进行的数据传输具有最高的优先级。因此,如果攻击者利用VoLTE默认bearer进行数据传输,与普通用户相比,攻击者就会获得更佳的网络表现。

0x05 利用VoLTE错误实现


在§3.3中,我们说明了攻击者可以利用实施恶意行为/活动的几个安全问题。在这一部分中,我们会讨论利用这些漏洞都可以进行哪些可行的攻击活动。表5中列出了每个漏洞所对应的可能攻击活动,并讨论了这些漏洞在不同的供应商那里是不是能成功地利用。

5.1 权限模式错配

在我们的实验中,一个只有网络访问权限的应用就可以拨打电话。另外,通话活动还不会显示在屏幕上,所以用户可能都不知道自己的设备在打电话。因此,如果一个恶意应用安装到了受害者的设备上,攻击者就可以利用这个漏洞来发动攻击了。

通话拒绝服务攻击可以很轻易地阻止受害者的手机拨打电话。只要在受害者的手机上安装了恶意应用,攻击者就可以让这台手机不断向指定的号码拨打电话。这样,用户就无法正常接收到来电通话。此外,由于通话不会在屏幕上显示,受害人也不会意识到自己的手机正在通话状态。因此,这样就会导致通话拒绝服务。

超额计费是另一种强有力的攻击方式。如果受害者的手机上安装了一个恶意应用,能够发送INVITE信息来启动昂贵的视频通话,受害者就会遇到超额计费。

权限模式错配问题体现出手机当前使用的权限模型无法处理全IP环境。当在3G网络下使用电路交换网络进行语音通话时,通话权限和数据权限是完全独立的。

5.2 直接通讯

直接通讯是由于P-GW中所配置的策略而导致的一个实现问题。即使是手机到手机的直接通讯也应当被拦截,因为这样会导致超额计费攻击。有些运营商并没有在VoLTE中阻止这种访问方式。

免费视频通话是一种非常实用的直接通讯实现。因为手机到手机的直接通讯会绕过IMS网络,并且仅仅会通过P-GW,这样攻击者就可以直接发送一条INVITE信息来与另一方进行视频通话。在被呼叫者的一方,手机只能回复INVITE信息的源IP地址,在这个过程中没有SIP服务器的参与。此外,因为所有与VoLTE相关的通话收费都是在IMS网络中处理的,通过这种方法可以免费通话。一个要求就是必须要打开手机上的麦克风,但是这并不难,用户只需要root手机就行了。在韩国,视频通话的收费是正常语音通话的1.66倍。在美国,运营商会同时收取数据费和通话费。

虚假来电是与直接通讯相关的一个严重问题。因为数据包只能通过P-GW路由,而在呼叫人和被呼叫人之间并没有认证。 相应的,攻击者可以通过发送被操控的INVITE信息来欺骗受害者。如果攻击者修改了INVITE信息中的号码,那么在受害者手机上显示的就会是修改后的号码。因此,受害者就会相信拨打电话的就是这个号码。于是,攻击者仅仅通过更改INVITE信息中的几个字节,就可以利用手机到手机的直接通讯,用于拨打钓鱼电话。

5.3 缺少认证

IMS网络中的错误实现导致了3种威胁的出现,认证的缺失就是其中之一。即使当SIP信息会通过SIP服务器时,虚假来电也是可行的。如果攻击者把修改好的INVITE信息发送给SIP服务器,而SIP服务器仅仅检查其中的电话号码是不是有效的,服务器就很容易遭到虚假来电攻击。当攻击成功时,通话费用会记在修改后的电话号码上。因此,这也是一种很强大的攻击方式。事实上,不仅仅是INVITE信息,BYE信息也可以用于虚假来电。如果运营商不合理的认证用户身份,攻击者就可以传输BYE信息来终止受害者的通话。

我们发现,韩国的两家运营商存在虚假来电漏洞。其他的运营商使用了下面的两种方法来预防这种攻击:验证呼叫人的电话号码和IP地址;或者是验证移动设备的唯一标识码-国际移动设备识别码(IMEI)。

表5-每家供应商面对的威胁和可能的攻击活动

5.4 缺少会话管理

会话管理的缺失是IMS网络的另一问题。因为,运营商没有管理通话会话,攻击者可以向SIP服务器发送多条INVITE信息。这样就能引起核心网络拒绝服务。当SIP服务器接收到一条INVITE信息时,SIP服务器应当打开一个会话用于处理每条信息,并且每个会话都应该是独立管理的。如果INVITE信息的数量过多,就会破话SIP服务器并导致用于VoLTE服务的IMS网络瘫痪。

总的来说,用户在使用手机上的拨号app时,一次只能拨打一个通话。但是,利用我们的发送模块,我们几乎可以能传输无限数量的INVITE信息。在我们的分析中,如果UE-A发送了INVITE信息,UE-A,P-GW和UE-B之中的专用bearer都会被创建,即使当UE-B不会响应通话的时候。因为,在控制平面过程中,激活bearer和释放过程会占用大量资源,所以太多的INVITE信息就会过载P-GW,造成核心网络拒绝服务。

我们在实验时,只发送了2到4条INVITE信息,并检查了是不是每条信息都对应着一个通话会话。我们发现,除了韩国的一家运营商,实验中的其他运营商都存在漏洞。最重要的一点是,我们在发送拒绝服务攻击时只用了一台移动设备,但是这类攻击通常都需要大量的bot。当然,我们没有验证每个bearer的损耗,也没有验证这种攻击是不是真的能关闭SIP服务器。

蜂窝 P2P是一种更复杂的应用方式,不过还是可行的。因为没有会话管理,用户可以发送多条INVITE信息来创建几个通话会话。当在用户之间创建了几个通话会话后,用户就能够通过RTP隧道来分享文件作为torrent。虽然1%的丢包率很高,但是我们可以利用可靠的UDP协议。吞吐量是够用的,并且传输速度也足够支持将文件作为torrent来传输,因为在蜂窝网络上有大量的对等用户,并且这些对等用户一般不会关闭他们的手机。因此,用户可以在睡觉的时候分享电影或其他内容。如果对这种实现方法不放心,也可以用蜂窝Tor来躲过蜂窝网络上的审查。

0x06 应对措施


在这一部分中,我们讨论了应对免费隐藏通道和VoLTE服务滥用攻击的解决办法。因为这些解决办法都很直观,所以这些措施都能很轻易地应用到商业蜂窝网络上。有些攻击途径是由于运营商的错误实现方式造成的,而有些问题则是VoLTE系统本身存在的。相较于其他的攻击方式,后者更难以处理。为了阻止这些攻击,我们建议采用难度更大但是更全面的解决方案来保证VoLTE服务的整体安全。

6.1 快速解决方案

过滤.造成直接通讯的主要原因是蜂窝网络中没有合理地权限控制来管理P-GW上的用户请求。VoLTE默认bearer的目的是处理通话信令;因此,P-GW应该过滤掉处SIP信息以外的数据包。但是,在我们的分析中,有些运营商并没有遵循相关的通话服务标准。例如,韩国的一家运营商使用了他们在HTTP协议基础创建的专利协议来提供会议电话,但是IETF标准中已经提供了使用SIP协议的会议电话解决方案。这种服务实现上的不一致,会增加P-GW中管理权限控制的难度。

另外,运营商应该拦截所有直接从UE向UE发送的所有数据包,并且只允许从UE向SIP服务器/媒体代理发送数据包,反之亦然。这样就能拦截免费的数据通道和免费视频通话,并避免虚假来电。

严格会话管理.这是保证VoLTE安全的另一项要求。SIP隧道,拒绝服务和蜂窝P2P等攻击活动都是由于会话管理的缺失造成的。例如,会话管理可以检查标头和有效载荷中是否存在无效字段和内容。如果检查结果不正常,会话管理应该拒绝请求并响应一条错误信息发送给UE。

除此之外,为了避免SIP隧道和拒绝服务攻击,运营商应该限制UE在某段时间内能发出的SIP信息数量。如果攻击者发送的信息量超过了标准,运营商就应该拦截攻击者并检查其活动。而且,SIP服务器应该检查UE是不是已经在与另一个UE通话。如果是,那么就拦截其他能启动通话的信息(也就是INVITE信息)。这种策略也能检测和预防其他的攻击活动,比如蜂窝P2P,因为这些攻击能实现的前提就是攻击者要能发送多条INVITE信息。

UE 验证.为了拦截伪装来电,SIP服务器应该验证SIP信息的来源。一种可能的方式就是在SIP信息中添加唯一的UE身份别信息,比如IMEI码。然后,SIP服务器要交叉检查电话号码的唯一身份。这个唯一身份信息一定要安全地储存在手机中,否则,攻击者就能很容易地远程安装恶意软件来拦截这个信息。

另一种解决方案是绑定手机号和UE的IP地址。运营商可以通过检查UE标头和SIP信息中的参数(比如IP地址,电话号码,唯一的设备身份),来验证用户发起的SIP信息,因为这些信息早就储存在了运营商的服务器中。不过IP欺骗还是可行的,但是,我们测试的所有运营商都在数据接口上应用了对抗IP欺骗的机制。虽然我们没有在VoLTE接口上测试IP欺骗,但是运营商可能已经在VoLTE上安装了类似的保护机制。因此,交叉检查是既容易实现又很强大的解决方案。

但是,如果攻击者假冒了受害者的IMS注册过程,那么SIP服务器中储存的就是虚假参数,这样还是无法拦截虚假来电。UE会通过与SIP服务器交换REGISTER信息会把自己注册到服务器上,而SIP服务器上就会储存几个能识别UE的参数。如果攻击者欺骗了注册过程,攻击者就能获取到受害者手机地址上的完整权限。

深度包检测 (DPI).因为在 VoLTE 通话中,RTP隧道会利用媒体的专用bearer,所以运营商能够通过流量监控来识别出用户是不是正在利用媒体通道。通过在P-GW或媒体代理中应用深度包检测(DPI)技术就能实现流量监控。但是,如果攻击者把数据伪装成语音流量,DPI解决方案仍然不能发挥作用。

收费策略.我们在本文中实验的免费通道都是利用了根据时间收费的策略。只要把VoLTE服务的收费策略更改为按字节收费就能解决这个问题。当然,即使是这样,攻击者也可以利用语音通道。但是,攻击者就无法绕过收费了。虽然看起来很符合常理,但是对于运营商而言,要想更改目前根据时间收费的策略很难,因为这直接关系到了他们的收入。他们70%的收入仍然是来自通话和SMS。

6.2 长期且全面的解决方案

权限模式错配是当今VoLTE移动设备上普遍存在的一个问题。不同于以前的通话机制,VoLTE是基于IP协议的,目前移动设备使用的权限模型模型无法处理VoLTE。把任何应用的socket都严格绑定到数据接口上是一种解决办法。通过这种方式,应用发送的SIP数据包就无法到达SIP服务器。运营商采用相同的方式也应该能拦截从数据接口上发送的数据包。这种解决方案的一个限制是部署起来不容易,因为需要更新所有移动设备的固件。另外,数据加密(比如用于信令的IPsec或TLS,以及用于媒体数据的sRTP)也应该按照3GPP规范部署。

但是,即使有了严格绑定和加密,攻击者仍然可以利用隧道,因为攻击者获取到了手机上的完整权限。另一种方式是向传统的电路交换通话一样,在CP中处理通话信令和语音数据。CP只会允许与合法通话相关的请求,并利用AP上的VoLTE接口来拦截其他所有的数据包。这样,攻击者就无法通过VoLTE接口来发送被操纵的数据包。此外, 也需要使用像TrustZone这样的硬件安全模块或安全存储来保护CP,防止攻击者介入CP中的SIP信息。

0x07 相关工作


蜂窝网络上的收费问题.有几个研究小组已经研究了蜂窝网络上的收费问题。与收费相关的攻击活动主要有两种:收费绕过和超额计费。

Peng 等人演示了针对免费数据的DNS端口滥用[25]。在 [26]文章中,作者发现了一种通过伪装源IP地址实现的收费绕过,因为移动数据收费系统仅仅是基于数据包标头。Go等人,把他们的有效载荷封装到了一个 TCP 转发数据包中,并利用了一些不收费的ISP来保证公平性 [14, 15]。

除了收费绕过,还有超额收费攻击。Go等人指出 TCP 重发能用于向受害者收取数据费。在 [25]中,通过使用 VoIP 和一个恶意钓鱼连接,有大量的垃圾数据发送给了受害者。在 [27, 32]中还列出了一些针对运营商的超额收费活动。

虽然,大部分研究都是围绕收费绕过和超额收费,但是由于我们使用的接口不同,所以我们的工作从本质上来说也是不同的。先前的研究仅仅涵盖了与数据接口相关的收费问题,而我们的工作重点是VoLTE接口。另外,先前的研究都假设首先要在受害者的手机上安装一个恶意应用才能实施超额计费攻击。相反,在我们的虚假来电攻击中,攻击者只需要用自己的设备。

VoIP隧道的抗审查能力. 大多数围绕VoIP隧道展开的研究都集中在其躲避审查的能力上。一般情况下,VoIP服务,例如Skype,被广泛地用作了隧道协议。Skypemorph就会利用Skype语音通话通道,通过UDP端口发送Tor流量。在[33]中,作者利用了RTP下游来逃避审查。以Freewave为例,数据都会转换成声音信号数据并加载到正常的VoIP数据包,从而达到隐藏数据的目的。

我们的研究工作利用了一个隧道协议和数据隐藏。但是,我们的重点在于收费绕过和发现错误实现问题。换句话说,我们研究隧道的主要目的不同于之前的研究。事实上,相较于先前的研究-在互联网上应用隧道,我们的工作首先是在蜂窝网络上应用隧道。

蜂窝网络上的DoS 攻击. 已经有很多人都研究了蜂窝网络上的各种DoS攻击了。总的来说,多数关于DoS攻击的研究都是与 GSM 网络相关的 [11, 16, 23, 28, 30]。Enck 等人称,向使用hit-list编译的手机号码发送SMS信息会大范围影响蜂窝核心网络11。Traynor等人 [30]演示了利用蜂窝botnet是可以降级蜂窝网络服务。 Mulliner 等人[23] 说明了畸形的SMS信息如何能强制手机重启,并最终导致网络过载。Golde等人[16] 介绍了GSM网络中的错误认证如何能造成DoS攻击。Traynor等人 [31] 演示了DoS攻击是如何利用设置过程,并干掉GPRS/EDGE网络中的无线接口进程。UMTS网络仍然难以对抗 DoS攻击。在Enck等人利用GSM网络上的电话号码的期间,Qian等人通过获取IP地址的指纹制作了一份hit-list,从而在UMTS 的核心网络上实施了针对性的DoS攻击。

不同于GSM网络上的这些攻击,在本文中出现的以VoLTE网络为目标的DoS攻击只需要少量的移动设备就可以实施。

0x08 未来工作和总结


我们分析了美国和韩国的5家VoLTE运营商。据我们所知,我们是分析VoLTE网络安全问题的第一人。我们的最大研究贡献就是证明了VoLTE传输并不简单,并且涉及到了EPC(3GPP标准),UE上的OS支持,硬件接口再设计以及蜂窝网络的收费策略。最重要的是,我们证明了不能因为对VoIP的了解,就认为VoLTE的传输是很简单的。相反,蜂窝网络在架构上的问题会造成更加复杂的问题。虽然,我们只发现了几个实现bug,并且也很容易修复,但是核心问题还是很复杂的过程,包括收费,权限控制,会话管理和EPC-UE交互。从ISP,安卓和US/KR SCERT小组的反应上,也能证明我们的观点。这些问题值得重视,因为要想保证强大的架构,系统性的架构安全分析还是很有必要的。

在本文中,我们考虑到了在合法IMS注册后,可能出现的安全问题和攻击活动。但是,攻击者还有可能会利用SIP REGISTER信息来执行其他的攻击活动。如果在注册阶段存在漏洞,攻击者就能完全控制受害者的VoLTE服务。例如,攻击者可以执行伪装攻击或甚至是监听活动。我们在未来的计划中,研究这类攻击方案。在这次研究工作中,我们的重点还是从那5家运营商身上发现的问题和漏洞。但是,VoLTE运营商中一定会有更多的问题和漏洞,未来还需要更多关于VoLTE网络的安全分析。

评论

随机分类

逆向安全 文章:70 篇
运维安全 文章:62 篇
区块链 文章:2 篇
memcache安全 文章:1 篇
软件安全 文章:17 篇

扫码关注公众号

WeChat Offical Account QRCode

最新评论

Yukong

🐮皮

H

HHHeey

好的,谢谢师傅的解答

Article_kelp

a类中的变量secret_class_var = "secret"是在merge

H

HHHeey

secret_var = 1 def test(): pass

H

hgsmonkey

tql!!!

目录