BTS软件漏洞或可劫持手机通讯基站安全威胁通告

kong 2016-09-06 17:03:13

最近,Zimperium实验室在对多个开源BTS(Base Transceiver Station)软件进行安全审计的过程中发现了多个漏洞,攻击者可以利用这些漏洞成功地入侵基站,导致基站无法正常工作或者被远程控制。

文章目录    
MS(Mobile Station)
BTS(Base Transceiver Station)
影响的产品
相关厂商
安全分析
防护建议
声 明

MS(Mobile Station)
移动终端(MS)是移动用户的终端设备,可以分为车载型、便携型和手持型。其中手持型俗称“手机”。它由移动用户控制,与基站间建立双向的无线电话电路并进行通话。

MS由两部分构成:Mobile Equipment(移动设备,ME)和Subscriber Identity Module(用户身份识别模块,SIM)。ME是指移动终端的具体设备。SIM是一个装在移动设备内部的智能小卡片,携带着移动设备使用者的信息,加密的密钥以及用户的电话簿等内容,可对GSM网络用户的身份进行鉴别,并对客户通话时的语音信息进行加密。

BTS(Base Transceiver Station)
基站(BTS)可以让移动电话连入GSM、UMTS和LTE等网络,由软件和无线电设备组成的。基站相当于Wi-Fi网络的无线接入点,负责Um接口的管理。Um是MS和BTS之间的接口,用于传输MS与网络之间的信令信息和业务信息。如下图所示。

通过该接口,MS实现与网络端的通信,完成分组数据传送、会话管理、无线资源管理等多方面的功能。

BTS的底层软件是一个信号收发器,它是无线电设备的直接接口,负责频率调谐和处理GMSK(Gaussian Filtered Minimum Shift Keying,高斯最小频移键控)数据的调制和解调。它完成无线电波到数字信号的转换。BTS其他逻辑单元的通信和同步,是由下图所示的三个UDP包完成的。

上图中的Clock Socket负责时间同步;Command Socket用来完成BTS主逻辑模块向GSM通信模块的命令传送;Data Socket负责BTS主逻辑模块和GSM通信模块之间的数据传送。

绝大多数BTS软件都会共用通信模块代码库,或者这些代码库之间非常相似,所以几乎所有这些BTS软件都会受到相同漏洞的影响。攻击者可以利用这些漏洞实现远程控制通信模块,实施伪基站代理攻击或者中间人攻击。

攻击者还有可能向基站的GSM通信模块发送GSM数据包,对移动用户发起多种网络攻击,包括IMSI分离、加密降级、以及拒绝服务攻击等等。攻击者发送给基站的GSM通信模块的UDP数据包格式如下图:

一旦基站的GSM通信模块收到这些数据包,便会进行解码,并且利用GMSK对这些数据进行调制,并发送到MS上。

影响的产品
YateBTS<= 5.0.0
OpenBTS<= 4.0.0
OpenBTS-UMTS<= 1.0.0
Osmo-TRX/Osmo-BTS<= 0.1.10

其他使用了相同信号收发器代码的产品

相关厂商
Legba股份有限公司(YateBTS)
RangeNetworks(OpenBTS和OpenBTS-UMTS)
OsmoCOM(Osmo-TRX和Osmo-BTS)

安全分析

漏洞一:宽松的服务绑定

这个漏洞位于受影响产品的网络库中。这个问题会导致通信模块的UDPSocket地址绑定到0.0.0.0,而原本应该被绑定到的地址应该根据用户的设置而定(默认地址是127.0.0.1)。这个漏洞的存在将允许攻击者利用这些地址同BTS建立连接,并从通信模块中接收(或者发送)数据包。另外,访问暴露在这些UDP网络套接字上的服务,将没有任何身份验证机制的保护。

攻击者可以建立IP连接,发送UDP数据包,获得BTS的所有功能,从而实现远程控制、GSM通信劫持、各种数据泄露、DOS拒绝服务或者其他后果更加严重的攻击。

漏洞的根源在于UDPSocket类的构造器中。源文件CommonLibs/Sockets.cpp中的UDPSocket::open方法存在代码错误,这导致了漏洞的存在。所有受影响的产品中都包含这份源文件。含有漏洞的代码如下:

从代码中可以看到,系统将绑定的地址保存到了mDestination类的成员变量中。然而UDPSocket::open方法的定义如下:

虽然UDPSocket类提供了一个构造参数来指定服务器应该绑定到的IP地址,但是这个数据却被忽略了。如上图第291行代码所示,通信socket被绑定到了INADDR_ANY,而没有使用mDestination地址变量。

漏洞二:缓冲区溢出(栈溢出)
 
攻击者可以向设备的控制信道发送一个超长的UDP数据包来引起栈缓冲区溢出,实现远程代码执行(RCE)或者对设备进行拒绝服务攻击。

控制信道由源文件Transceiver.cpp中的Transceiver::driveControl方法进行管理。代码如下:

代码中数据包的缓存空间位于函数栈中,其大小被定义为100字节(MAX_PACKET_LENGTH)。

源文件Sockets.cpp中声明的DatagramSocket::read方法(DatagramSocket类是UDPSocket类的父类)的代码如下:

可以看到,代码读取的长度是MAX_UDP_LENGTH,并非MAX_PACKET_LENGTH变量的值。而MAX_UDP_LENGTH的值是在Sockets.h源文件中定义的,如下图所示:

因此,攻击者只需要向信号收发器发送一个大小超过100字节的UDP数据包,就可以成功在目标设备上引起缓冲区溢出。下图显示的是该漏洞所引发的错误调试信息:

漏洞三:未经身份验证的远程控制

控制信道并没有引入任何形式的身份验证机制。再加上“漏洞一”使得其部分信息暴露在了外部网络中,所以恶意攻击者就可以利用这个漏洞来远程控制信号收发器模块。

攻击者可以进行如下的攻击:

通过关闭模块来实现拒绝服务攻击。
通过修改无线电信号频率来阻塞信号发送。
通过“SETBSIC”命令远程劫持BTS。

控制信道使用源文件Transceiver.cpp中的Transceiver::driveControl方法来处理UDP协议。该协议暴露的部分功能包括:

开启或关闭TRX模块:CMDPOWERON / CMD POWEROFF
更改TRX的无线频率:CMDRXTUNE frequency / CMD TXTUNE frequency
设置GSM信号的验证信息:CMDSETBSIC value
攻击者只需要向服务器的5701端口发送一个简单的UDP数据包,就可以远程执行上面这些控制命令了。关于协议的完整内容可以在TRXManager/README.TRXManager文件中找到。

防护建议

如果使用了受影响的软件/版本,请及时关注软件官方网站并更新到最新的版本或者使用替代软件。
将用于控制操作和数据转换的socket地址绑定到本地接口(127.0.0.1)。
阻止流经端口5701(控制端口)和端口5702(数据端口)的所有外部网络流量。
引入身份验证系统,以防止没有权限的攻击者通过BTS控制端口来登录服务器或访问网络。
修改存在缓冲区溢出风险的代码并进行重新编译。
进行代码审计。

使用绿盟科技防护类产品( IPS/NF/SG)进行防护。
已经购买了绿盟科技相关产品服务的客户可以通过产品升级进行检测与防护。
短期服务:绿盟科技工程师现场处理。确保第一时间消除网络内相关风险点,控制事件影响范围,提供事件分析报告。
中期服务:提供 3-6个月的风险监控与巡检服务。根除风险,确保事件不复发。
长期服务:基金行业业务风险解决方案(威胁情报+攻击溯源+专业安全服务)。

声 明
本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。