好长时间没在看雪上发文章了,写了这个发现还不好确定放在哪个板块~~~。 这个问题是在16年被国内研究员发现提出,并实现了完整的攻击。因为这是一个很经典的问题,在学习LTE/5G安全过程中复现一下也是很有必要的。我大概是在今年初分析复现这个问题,下面分享一下整个过程,和大家交流一下。RRCConnectionRelease 在5GNR中是RRCRelease .RRCConnectionRelease 正常的使用是: 由基站发给UE,作用包括释放一个rrc connection...
当在nas层reject当前连接后,ue接收后,会触发基站发送rrcconnectionrelease给UE,此时UE会对rrcconnectionrelease包进行解析,因为本身也是连接出现问题才会触发rrcconnectionrelease,即有可能是就是基站层丢失了一开始注册入网的key等信息。因此协议上最开始的描述,UE接收后并不会对rrcconnectionrelease的完整性进行校验,而直接接收解析。
在rrcconnectionrelease中可以携带redirectedCarrierInfo结构,可以直接查看asn文件中对该结构的定义:
可以发现redirectedCarrierInfo其实是给UE提供了一个/多个可选的频率/频道/arfcn。当UE收到后会根据该信息选择一个合适的cell。(The procedure can also be used to release and redirect a UE to another frequency)
不影响现网,因此用oai和openair-cn搭建一个LTE网。用正常手机(UE)连接。(USRP B210+笔记本)
选用的是通过核心网/MME发送的attach reject来触发基站的RRCConnectionRelease.
初始状态的测试,attach reject选用cause 17,network failure,比较“弱”的一个cause。
oai代码不动,默认RRCConnectionRelease中是不携带redirectedCarrierInfo。修改openair-cn,当接收到第一次attach request时候,发送attach reject,cause 17;而第二次将正常处理attach request(即accept)。
搭建一个2G环境,保持运行状态。(一个Linux虚拟机+limesdr mini)
现象 :UE在第一次attach reject之后,继续向LTE网络发起attach request,然后正常连接LTE网络。
oai在asn1_msg.c中,do_RRCConnectionRelease函数中,是用来构造RRCConnectionRelease包,添加redirectedCarrierInfo结构。比如我的添加:
arfcn和频率对应可以参考,保持和你搭建的伪基站一致即可:
https://wenku.baidu.com/view/55e2d6677cd184254a35355b.html
现象是在一次attach reject之后直接连接到了搭建的2G伪基站上。
很早就发现的问题,但3GPP协议文档却很晚才体现添加修复。测试用的一款19年底的手机也是受影响的。
当UE收到RCCConnectionRelease/RRCRelease时,处理流程上36331和38331都有相关修改。比如36331描述如下:
描述中在AS Security之后必须得有完整性保护;如果在AS Security之前的话,携带redirectedCarrierInfo字段是不会被处理的。其实也还有这么一个条件if upper layers indicate that redirect to GERAN 所以和基带的实现也有很大关系。
而在38331中,到了release 15.6.0(19年6月)才额外添加一句ignore:
[1] Forcing a Targeted LTE Cellphone into an Eavesdropping Network [2] seeker: 伪基站高级利用技术——彻底攻破短信验证码 [3] LTE RRC: TS 36331 [4] 5G RRC: TS 38331
typedef struct LTE_RRCConnectionRelease_r8_IEs {
LTE_ReleaseCause_t releaseCause;
struct LTE_RedirectedCarrierInfo
*
redirectedCarrierInfo;
/
*
OPTIONAL
*
/
struct LTE_IdleModeMobilityControlInfo
*
idleModeMobilityControlInfo;
/
*
OPTIONAL
*
/
struct LTE_RRCConnectionRelease_v890_IEs
*
nonCriticalExtension;
/
*
OPTIONAL
*
/
/
*
Context
for
parsing across
buffer
boundaries
*
/
asn_struct_ctx_t _asn_ctx;
} LTE_RRCConnectionRelease_r8_IEs_t;
/
/
/
/
/
/
typedef enum LTE_RedirectedCarrierInfo_PR {
LTE_RedirectedCarrierInfo_PR_NOTHING,
/
*
No components present
*
/
LTE_RedirectedCarrierInfo_PR_eutra,
LTE_RedirectedCarrierInfo_PR_geran,
LTE_RedirectedCarrierInfo_PR_utra_FDD,
LTE_RedirectedCarrierInfo_PR_utra_TDD,
LTE_RedirectedCarrierInfo_PR_cdma2000_HRPD,
LTE_RedirectedCarrierInfo_PR_cdma2000_1xRTT,
/
*
Extensions may appear below
*
/
LTE_RedirectedCarrierInfo_PR_utra_TDD_r10,
LTE_RedirectedCarrierInfo_PR_nr_r15
} LTE_RedirectedCarrierInfo_PR;
/
/
/
/
/
/
typedef struct LTE_RedirectedCarrierInfo {
LTE_RedirectedCarrierInfo_PR present;
union LTE_RedirectedCarrierInfo_u {
LTE_ARFCN_ValueEUTRA_t eutra;
LTE_CarrierFreqsGERAN_t geran;
LTE_ARFCN_ValueUTRA_t utra_FDD;
LTE_ARFCN_ValueUTRA_t utra_TDD;
LTE_CarrierFreqCDMA2000_t cdma2000_HRPD;
LTE_CarrierFreqCDMA2000_t cdma2000_1xRTT;
/
*
*
This
type
is
extensible,
*
possible extensions are below.
*
/
LTE_CarrierFreqListUTRA_TDD_r10_t utra_TDD_r10;
LTE_CarrierInfoNR_r15_t nr_r15;
} choice;
/
*
Context
for
parsing across
buffer
boundaries
*
/
asn_struct_ctx_t _asn_ctx;
} LTE_RedirectedCarrierInfo_t;
typedef struct LTE_RRCConnectionRelease_r8_IEs {
LTE_ReleaseCause_t releaseCause;
struct LTE_RedirectedCarrierInfo
*
redirectedCarrierInfo;
/
*
OPTIONAL
*
/
struct LTE_IdleModeMobilityControlInfo
*
idleModeMobilityControlInfo;
/
*
OPTIONAL
*
/
struct LTE_RRCConnectionRelease_v890_IEs
*
nonCriticalExtension;
/
*
OPTIONAL
*
/
/
*
Context
for
parsing across
buffer
boundaries
*
/
asn_struct_ctx_t _asn_ctx;
} LTE_RRCConnectionRelease_r8_IEs_t;
/
/
/
/
/
/
typedef enum LTE_RedirectedCarrierInfo_PR {
LTE_RedirectedCarrierInfo_PR_NOTHING,
/
*
No components present
*
/
LTE_RedirectedCarrierInfo_PR_eutra,
LTE_RedirectedCarrierInfo_PR_geran,
LTE_RedirectedCarrierInfo_PR_utra_FDD,
LTE_RedirectedCarrierInfo_PR_utra_TDD,
LTE_RedirectedCarrierInfo_PR_cdma2000_HRPD,
LTE_RedirectedCarrierInfo_PR_cdma2000_1xRTT,
/
*
Extensions may appear below
*
/
LTE_RedirectedCarrierInfo_PR_utra_TDD_r10,
LTE_RedirectedCarrierInfo_PR_nr_r15
} LTE_RedirectedCarrierInfo_PR;
/
/
/
/
/
/
typedef struct LTE_RedirectedCarrierInfo {
LTE_RedirectedCarrierInfo_PR present;
union LTE_RedirectedCarrierInfo_u {
LTE_ARFCN_ValueEUTRA_t eutra;
LTE_CarrierFreqsGERAN_t geran;
LTE_ARFCN_ValueUTRA_t utra_FDD;
LTE_ARFCN_ValueUTRA_t utra_TDD;
LTE_CarrierFreqCDMA2000_t cdma2000_HRPD;
LTE_CarrierFreqCDMA2000_t cdma2000_1xRTT;
/
*
*
This
type
is
extensible,
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课