ARTICLE / 安全

5G核心网与移动通信安全取证深度分析

移动通信网络是现代社会的关键基础设施,而5G(第五代移动通信技术)作为新一代蜂窝网络架构,在带来革命性性能提升的同时也引入了全新的安全挑战。5G核心网(5GC)采用服务化架构(Service-Based Architecture, SBA),将传统一体化的核心网功能拆分为多个独立的微服务网络功能(Network Function, NF),这种架构变革在提升灵活性和可扩展性的同时,也将IT领域常见的API安全、微服务安全等攻击面引入了电信网络。

与前几代移动通信不同,5G安全取证面临的挑战是多维度的。首先,5G加强了用户面加密和完整性保护,传统的被动监听取证方法不再有效;其次,网络切片(Network Slicing)和边缘计算(MEC)的引入使得攻击面从集中式核心网扩展到了分布式的边缘节点;第三,SS7和Diameter协议的遗留风险在5G时代依然存在,且与5G新协议形成了复合攻击面;第四,海量物联网设备(mMTC)的接入使得异常行为检测的数据规模呈指数增长。

从蓝队取证的角度,5G安全事件的分析需要同时具备电信协议深度解析能力、云原生安全取证能力、无线射频分析能力和大数据异常检测能力。本文系统性地覆盖5G核心网安全取证的完整方法论,从协议层攻击到API层漏洞,从无线接入安全到边缘计算取证,结合SS7信令攻击、IMSI Catcher检测、网络切片逃逸等真实威胁场景,提供可落地的自动化检测方案和取证分析流程。


0x01 技术基础与5G取证概述

5G网络架构概览

5G网络架构分为无线接入网(Radio Access Network, RAN)和核心网(5G Core, 5GC)两大部分。在RAN侧,传统的eNodeB(4G基站)演进为gNodeB(5G基站),支持Massive MIMO、波束赋形等先进技术。在核心网侧,5GC完全采用了基于服务化架构(SBA)的设计,将控制面功能拆分为多个独立的网络功能(Network Function, NF)。

网络功能缩写核心职责关键接口
Access and Mobility Management FunctionAMF接入认证、移动性管理、NAS信令终结N1, N2, N8, N11, N12
Session Management FunctionSMF会话管理、UPF选择与控制、QoS策略N4, N7, N11
User Plane FunctionUPF用户面数据转发与处理N3, N4, N6, N9
Unified Data ManagementUDM用户签约数据管理、鉴权凭证处理N8, N10, N11
Authentication Server FunctionAUSF5G-AKA/EAP-AKA’鉴权服务N12, N13
Network Repository FunctionNRFNF服务注册与发现Nnrf
Policy Control FunctionPCF策略决策(QoS、计费等)N15
Network Slice Selection FunctionNSSF网络切片选择N22
Network Exposure FunctionNEFAPI暴露与能力开放N30, N33
Application FunctionAF应用层服务交互N5, N33

5G与4G安全架构差异对比

5G在安全架构上相较4G进行了全面升级,但同时也引入了新的安全挑战。

安全维度4G LTE5G NR取证影响
鉴权协议AKA (EPS-AKA)5G-AKA / EAP-AKA'鉴权向量结构变化,截获难度提升
用户身份保护IMSI明文传输(初始附着)SUPI/SUCI加密传输IMSI Catcher需要新绕过手段
控制面加密IPsec(可选)NAS层强制加密+完整性保护信令窃听难度大幅增加
用户面加密可选(EEA0-EEA3)强制加密(NEA0-NEA3)+完整性保护用户面流量取证受限
密钥层级eNodeB密钥层级gNodeB + 辅助密钥层级密钥提取复杂度更高
服务化架构无(点对点)HTTP/2 + OAuth2.0/mTLSIT化攻击面引入
切片安全不支持基于NSSAA的切片认证切片隔离逃逸风险
边缘计算有限(Local GW)MEC原生集成边缘节点取证挑战

5G取证的特殊挑战

5G环境下的取证分析面临三大核心挑战:

加密增强:5G NR对控制面(NAS)和用户面(UP)均实施了强制加密和完整性保护。这意味着传统的被动RF监听方式无法再直接获取通信内容。取证人员需要在核心网内部节点(如AMF、UPF的日志接口)或合法授权的中间节点上获取数据。3GPP定义的加密算法包括NEA1(SNOW 3G)、NEA2(AES)、NEA3(ZUC),其密钥长度均为128位,在当前计算能力下具有足够的安全性。

边缘计算与分布式架构:MEC(Multi-access Edge Computing)将计算和存储资源下沉到网络边缘,不同位置的MEC节点可能存储和处理不同的用户数据。取证时需要确定目标数据所在的边缘节点位置,并应对可能的边缘节点数据快速过期问题。

网络切片隔离:不同网络切片之间的逻辑隔离是否可靠,直接关系到取证范围的界定。切片逃逸攻击可能导致跨切片的数据泄露和攻击蔓延,取证时需要评估切片隔离机制的完整性。

5G取证工具链

工具名称功能定位适用场景部署方式
Open5GS开源5G核心网实现实验环境搭建、协议分析Docker / 本地编译
srsRAN开源RAN软件栈gNodeB/eNodeB仿真、空口测试本地编译 + SDR硬件
Wireshark + 5G插件协议分析与流量捕获NAS/RRC/NGAP/S1AP解码被动抓包分析
freeDiameterDiameter协议开源实现Diameter信令分析与测试本地编译
Scapy (5G模块)Python包构造与解析自定义信令包构造与模糊测试Python脚本
OAI (OpenAirInterface)开源端到端5G实现完整5G协议栈测试Docker / 专用硬件
Sigma规则引擎安全事件规则匹配5G日志告警与异常检测SIEM集成
TSharkWireshark命令行版本批量流量分析与自动化服务器端部署
gnBpygNodeB日志解析库RAN侧日志分析Python库

0x02 5G核心网架构与攻击面分析

5GC服务化架构(SBA)与微服务通信

5GC的Service-Based Architecture将所有网络功能(NF)连接到一个公共的服务总线上,每个NF通过RESTful API(基于HTTP/2协议)向其他NF暴露其能力。这种设计借鉴了云原生微服务架构的理念,使得网络功能可以独立部署、弹性扩缩和灵活组合。

在SBA架构中,NF之间的通信分为两类:

通信模式协议适用场景安全机制
服务化接口(SBI)HTTP/2 + JSONNF间控制面交互(如AMF↔SMF)OAuth2.0令牌 + mTLS
点对点接口GTP-U / PFCP用户面数据传输IPsec / 安全关联

SBA架构中NF通过NRF(Network Repository Function)进行服务注册和发现。一个NF需要调用另一个NF的能力时,首先向NRF查询目标NF的服务列表和地址,然后直接与目标NF建立HTTP/2连接。这种动态服务发现机制虽然灵活,但也引入了NF伪造和服务发现滥用的风险。

HTTP/2 API攻击面(接口威胁分析)

5G核心网定义了多个关键接口,每个接口都承载特定的协议数据,同时也构成独立的攻击面。

接口连接实体协议主要威胁MITRE ATT&CK
N1UE ↔ AMFNAS (5GS)NAS消息伪造、鉴权绕过T1557
N2gNodeB ↔ AMFNGAP/SCTP基站伪装、NGAP消息注入T1584.006
N3gNodeB ↔ UPFGTP-U/UDP用户面数据截获、GTP隧道劫持T1040
N4SMF ↔ UPFPFCP/UDPUPF控制面篡改、转发规则注入T1562.001
N6UPF ↔ DNIP外部网络接入、DNS劫持T1583.004
N9UPF ↔ UPFGTP-U/UDP切片间数据泄露、隧道穿越T1021
N12AMF ↔ AUSFHTTP/2 (SBI)鉴权向量泄露、鉴权绕过T1562.002
N15AMF ↔ PCFHTTP/2 (SBI)策略篡改、QoS降级T1562
N22AMF ↔ NSSFHTTP/2 (SBI)切片选择欺骗、跨切片访问T1578
N30NEF ↔ AFHTTP/2 (SBI)能力开放滥用、API过度暴露T1190

网络功能间信任模型与安全边界

5GC SBA架构中的信任模型基于以下层次:

  • NF间信任:通过mTLS(双向TLS)建立传输层信任,每个NF持有由运营商私有CA签发的X.509证书
  • API层授权:通过OAuth 2.0令牌(JWT格式)实现细粒度的API访问控制,令牌由 NRF或专用授权服务签发
  • 网络切片隔离:每个切片具有独立的NF实例集,通过NSSF进行切片选择,通过NSSAA(Network Slice-Specific Authentication and Authorization)进行切片级认证
  • 用户面隔离:不同切片的UPF实例独立运行,通过VLAN/MPLS/SRv6等技术实现转发面隔离

安全边界的关键薄弱点在于NRF——如果攻击者能够入侵NRF,就可以注册恶意NF并劫持其他NF的服务发现请求,从而实现中间人攻击或数据窃取。此外,NF证书的签发和管理也是关键信任锚点,证书生命周期管理的任何缺陷都可能被利用。

攻击面映射矩阵

攻击目标攻击手法入口点影响范围MITRE ATT&CK
NRF服务注册恶意NF注册、服务发现劫持NRF SBI API全网NF通信T1190
AMF鉴权NAS消息伪造、鉴权重放N1/N2接口用户鉴权T1557.002
SMF会话管理非法PDU会话建立N11/N4接口用户数据通道T1565.001
UPF数据转发GTP-U隧道注入N3/N9接口用户面数据T1040
UDM用户数据签约数据查询/篡改N8/N10接口用户隐私T1530
切片资源切片隔离逃逸N22/N14接口跨切片数据T1610
MEC应用边缘应用入侵MEC API (N33)边缘节点数据T1190
gNodeB接入伪基站/RACH劫持空口(RF)无线接入T1584.006

0x03 SS7/Diameter协议攻击与信令安全取证

SS7协议栈安全漏洞

SS7(Signaling System No.7)是2G/3G时代的核心信令协议,虽然5G网络已采用全新的信令架构,但由于全球电信网络的异构性和漫游互操作需求,SS7信令流量在现代电信网络中依然大量存在。SS7的原始设计基于"可信网络"假设,缺乏认证和加密机制,这一根本性缺陷使其成为持续性的安全威胁。

SS7协议栈的关键安全漏洞集中在MAP(Mobile Application Part)和CAP(CAMEL Application Part)层:

SS7漏洞类型攻击描述影响MITRE ATT&CK
MAP SendParametersForSubscriber查询用户签约信息IMSI/MSISDN泄露T1530
MAP ProvideSubscriberLocation追踪用户位置实时位置泄露T1657
MAP AnyTimeInterrogation查询用户当前位置位置追踪T1657
MAP UpdateLocation强制位置更新用户重定向T1557
MAP ProvideSubscriberInfo获取用户状态在线状态泄露T1530
MAP PurgeMS注销用户设备拒绝服务T1485
CAP ActivateSS操纵补充业务呼叫转移劫持T1565

Diameter协议攻击

Diameter协议作为SS7的继任者,在4G LTE网络中广泛用于鉴权(Authentication)和策略控制(PCRF)。Diameter虽然引入了IPsec和TLS安全关联,但在实际部署中,许多运营商之间的Diameter连接并未启用完整的安全机制。

Diameter攻击类型目标接口攻击描述取证指标
鉴权向量泄露S6a (HSS↔MME)截获Authentication-Request/Answer异常AV请求频率
位置追踪S6d/S6c利用SLR/CLR消息追踪用户非常规位置查询
签约数据篡改S6a注入Update-Location-Answer签约数据变更日志
DoS攻击S6a/S9发送大量请求耗尽资源Diameter超时告警
切换攻击S6a利用Handover-Required消息异常切换事件
证书伪造S2a/S2b伪造Diameter连接证书TLS握手异常

5G中SS7/Diameter遗留风险

尽管5G核心网本身不再直接使用SS7/Diameter协议,但在以下场景中,这些遗留协议仍然构成安全威胁:

  1. 漫游互操作:5G用户漫游到4G/3G网络时,漫游信令可能通过SS7/Diameter协议在运营商间传递
  2. IMS(IP Multimedia Subsystem)信令:5G语音(VoNR)和多媒体服务依赖IMS,其SIP信令的传输可能涉及SS7/Diameter互通
  3. 互联互通:不同运营商的5G网络在实现完全SBA之前,互联互通点可能仍使用传统信令协议
  4. IoT漫游:海量物联网设备在漫游场景下可能回落到4G/3G网络,触发SS7/Diameter信令

信令流量取证分析方法

信令流量的取证分析需要在关键网络节点部署信令探针(Signaling Probe),对SCTP/M3UA/SUA等传输层协议承载的SS7/Diameter消息进行实时捕获和离线分析。

tcpdump -i any -w signaling_capture.pcap -s 0 "sctp or diameter" -G 3600 -W 24

使用Wireshark或tshark对捕获的信令流量进行协议解码:

tshark -r signaling_capture.pcap -Y "diameter.cmd.code == 318" -T fields -e diameter.src.host -e diameter.dest.host -e diameter.experimental-avp.2662044

对于SS7信令流量,可以使用专门的SS7解析工具进行深度分析:

python3 -c "
import dpkt, struct
with open('ss7_capture.pcap', 'rb') as f:
    pcap = dpkt.pcap.Reader(f)
    for ts, buf in pcap:
        eth = dpkt.ethernet.Ethernet(buf)
        if isinstance(eth.data, dpkt.ip.IP):
            ip = eth.data
            if isinstance(ip.data, dpkt.sctp.SCTP):
                payload = ip.data.data
                print(f'Timestamp: {ts} M3UA payload length: {len(payload)}')
"

SS7/Diameter攻击检测Sigma规则

title: SS7 Abnormal ProvideSubscriberLocation Request
id: d4e8a2f1-7b3c-4d5e-9f1a-2c3b4e5d6f70
status: experimental
description: Detects abnormal SS7 MAP ProvideSubscriberLocation requests indicating location tracking attacks
references:
  - https://www.3gpp.org/ftp/Specs/archive/29_series/29.002/
  - https://www.cadosecurity.com/blog/telecom-fraud
author: Blue Team Forensics
date: 2026-07-15
modified: 2026-07-15
tags:
  - attack.defense-evasion
  - attack.discovery
  - ss7
  - telecom
  - forensics
logsource:
  category: telecom_signaling
  product: ss7_diameter
detection:
  selection_msg_type:
    message_type: "MAP_ProvideSubscriberLocation_Request"
  selection_condition:
    source_global_title|re: "^[0-9]{7,15}$"
  timeframe: 5m
  condition: selection_msg_type and selection_condition and count() > 5
level: high
falsepositives:
  - Legitimate network optimization procedures
  - Roaming partner queries
  - lawful interception with proper authorization
fields:
  - source_global_title
  - destination_global_title
  - imsi
  - location_estimate
  - timestamp
title: Diameter Abnormal Authentication Vector Request
id: a1b2c3d4-e5f6-7890-abcd-ef1234567890
status: experimental
description: Detects abnormal Diameter S6a Authentication-Request patterns indicating鉴权向量窃取攻击
references:
  - https://tools.ietf.org/html/rfc6733
  - https://www.enisa.europa.eu/publications/5g-security
author: Blue Team Forensics
date: 2026-07-15
modified: 2026-07-15
tags:
  - attack.collection
  - attack.credential-access
  - diameter
  - telecom
  - forensics
logsource:
  category: telecom_signaling
  product: ss7_diameter
detection:
  selection_cmd:
    command_code: 318
    application_id: 16777251
  selection_src:
    origin_host|re: "^.*(proxy|relay|grey).*"
  timeframe: 10m
  condition: selection_cmd and selection_src and count() > 20
level: critical
falsepositives:
  - Large-scale subscriber migration events
  - Network capacity testing
fields:
  - origin_host
  - destination_host
  - imsi
  - request_count
  - timeframe

0x04 5G SBA HTTP/2 API安全与取证

5GC API认证机制

5G SBA架构中的NF间通信依赖HTTP/2协议,并采用多层安全机制保障API交互的安全性。

安全机制实现方式保护范围配置标准
mTLS双向TLS认证传输层身份认证3GPP TS 33.501 §6.2
OAuth 2.0JWT令牌授权API访问控制3GPP TS 33.501 §6.3
API令牌NF服务级令牌细粒度API授权NRF Token签发
TLS 1.2/1.3加密传输数据机密性与完整性3GPP规范强制要求

mTLS认证流程中,每个NF在启动时向运营商私有CA注册并获取X.509证书。当NF-A需要调用NF-B的服务时,双方通过TLS握手交换证书并建立加密通道。OAuth 2.0令牌则在mTLS通道之上提供应用层授权——NF-A从授权服务器获取JWT令牌,令牌中包含NF-A的NF Profile信息和允许访问的API范围。

API层面的攻击手法

尽管5GC API设计了多层安全机制,但在实际部署中仍然存在多种攻击向量:

攻击手法目标技术描述检测难度MITRE ATT&CK
NF身份伪造NRF使用窃取的证书注册恶意NFT1584.006
服务发现劫持NRF注册虚假NF端点拦截服务请求T1557.002
API令牌窃取JWT令牌从受损NF提取签发的令牌T1528
API滥用任意NF超出授权范围的API调用T1190
API重放SMF/AMF重放历史API请求T1557
降级攻击TLS握手强制降级到弱加密套件T1557.005
N2消息注入AMF伪造gNodeB的NGAP消息T1584.006
NF资源耗尽任意NF大量API请求造成DoST1499

gNodeB与核心网API交互安全

gNodeB与核心网之间的NG接口(N2控制面 + N3用户面)是5G接入安全的关键环节。gNodeB在初始接入时需要通过NG Setup流程向AMF注册,并通过NGAP(NG Application Protocol)协议进行控制面信令交互。

攻击者如果能够伪装成合法的gNodeB,就可以:

  1. 伪造初始注册:向AMF发送虚假的NG Setup Request,获取UE的NAS信令
  2. 中间人攻击:拦截UE与核心网之间的NAS消息
  3. 数据窃取:通过伪造的GTP-U隧道接收用户面数据
  4. 拒绝服务:发送异常的UE Context Release命令释放用户连接

API日志取证分析方法

5GC各NF的日志是API安全取证的核心数据源。标准化的日志格式和关键字段提取是取证分析的基础。

find /var/log/open5gs/ -name "*.log" -mmin -60 -exec grep -l "oauth_token_error\|mtls_auth_fail\|nf_registration_reject" {} \;
cat /var/log/open5gs/amfd.log | jq 'select(.level == "error" or .level == "warn") | {timestamp: .timestamp, nf: .nf, msg: .message, src: .file}' 2>/dev/null | head -100
grep -E "(401|403|429|500)" /var/log/open5gs/*/http_access.log | awk '{print $1, $4, $7, $9}' | sort | uniq -c | sort -rn | head -30
journalctl -u open5gs-amfd --since "2026-07-15 08:00" --until "2026-07-15 10:00" | grep -iE "(auth_fail|token_invalid|cert_reject|nf_forbidden)" | tee /tmp/5g_auth_anomalies.log

0x05 网络切片与MEC边缘计算安全取证

网络切片架构与隔离机制

网络切片(Network Slicing)是5G的核心创新之一,允许运营商在同一物理基础设施上构建多个逻辑独立的端到端网络。每个网络切片通过S-NSSAI(Single Network Slice Selection Assistance Information)标识,由SST(Slice/Service Type)和SD(Slice Differentiator)两个参数唯一确定。

切片类型SST值典型应用安全需求等级
eMBB增强移动宽带1高清视频、VR/AR
URLLC超可靠低延迟2工业控制、远程手术极高
mMTC海量机器通信3IoT传感器、智慧城市
V2X车联网4自动驾驶、V2X通信
MIoT机器类IoT5工业IoT、资产追踪
NR-Light6可穿戴设备、视频监控低-中
URSP定制切片其他运营商定制服务可变

切片隔离机制涵盖多个层面:

隔离层面技术手段隔离强度取证关注点
网络功能层NF实例独立部署(每个切片独立NF集)NF间日志关联分析
用户面层独立UPF实例 + SRv6/VLAN隔离GTP隧道隔离验证
策略层切片级PDU会话策略策略配置审计
传输层MPLS VPN / SRv6 Policy传输层隔离验证
无线层RAN切片资源调度(5QI/QoS)中-强空口资源分配分析
应用层MEC应用隔离(容器/虚拟机)容器逃逸检测

切片逃逸攻击技术

切片逃逸(Slice Escape)是指攻击者突破网络切片间的逻辑隔离,非法访问其他切片中的资源或数据。主要攻击路径包括:

  1. NSSF切片选择欺骗:通过伪造NAS消息中的S-NSSAI信息,请求不属于自身权限的网络切片
  2. PFCP规则注入:在SMF与UPF之间注入异常的转发规则,使数据包跨越切片边界
  3. GTP隧道穿越:利用GTP-U隧道标签的复用或伪造,在N9接口上实现跨切片数据转发
  4. NF资源共用漏洞:利用多切片共享NF(如NRF、UDM)的访问控制缺陷获取跨切片数据

MEC平台安全架构

ETSI MEC(Multi-access Edge Computing)标准定义了边缘计算平台的安全架构。MEC平台通过Mp1-Mp5接口与5GC交互,其安全威胁模型涵盖应用层、平台层和基础设施层。

MEC安全威胁攻击层面影响检测方法
恶意MEC应用应用层数据窃取、资源滥用应用行为审计
MEC平台入侵幹台层边缘数据全面泄露平台日志分析
容器逃逸基础设施层宿主机接管内核审计
MEC API滥用接口层服务欺骗、数据泄露API调用监控
边缘-核心通信劫持网络层控制面/用户面数据窃取流量分析

边缘节点取证的特殊挑战

MEC边缘节点的取证面临独特的技术和物流挑战。边缘节点分布广泛、数量众多,且通常缺乏专业的安全运维人员。数据在边缘节点上的保留时间通常短于核心网(受限于边缘存储容量),取证窗口非常有限。

ssh edge-node-01 "docker ps --format '{{.ID}} {{.Names}} {{.Image}}' && docker logs --since 1h $(docker ps -q | head -1) 2>&1 | tail -500" > /tmp/mec_edge取证.log
for node in edge-{01..10}; do echo "=== $node ===" && ssh $node "curl -s http://localhost:8080/mec_appstore/v1/applications | jq '.[].appId, .[].appName' 2>/dev/null" && echo; done > /tmp/mec_inventory.log

0x06 IMSI Catcher与无线接入安全取证

IMSI Catcher/Stingray工作原理

IMSI Catcher(又称Stingray、Cell-site Simulator、False Base Station)是一种模拟合法基站的无线设备,通过发射比真实基站更强的信号诱使目标手机连接到伪造基站,从而实现位置追踪、通信截获或主动降级攻击。

功能模式技术实现危害适用制式
IMSI捕获诱使UE发送IMSI/TMSI用户身份识别2G/3G/4G
位置追踪测量信号到达时间/角度精确定位2G/3G/4G/5G
通信截获MITM中间人通信通话/短信监听2G/3G
主动降级禁用加密/降级到2G通信降级攻击2G/3G/4G
数据截获数据MITM互联网流量监控3G/4G
定向拒绝服务阻止特定设备接入拒绝服务4G/5G

在4G LTE网络中,IMSI Catcher的工作方式有所变化。由于LTE默认加密(尽管可配置为不加密),攻击者主要通过以下方式操作:

  1. 加密降级:诱使UE回落到3G/2G网络(在这些网络中加密可选),然后进行MITM攻击
  2. 身份追踪:即使不破解加密,也可以通过Radio-NAS层交互获取TMSI并追踪用户位置
  3. 数据拦截(部分场景):在未启用加密的LTE网络中直接截获用户面数据

5G SUPI/SUCI隐私保护机制与绕过

5G引入了SUPI(Subscription Permanent Identifier)和SUCI(Subscription Concealed Identifier)机制来保护用户身份隐私。在5G中,用户的永久身份SUPI(等价于IMSI)不再以明文方式在空口传输,而是通过ECIES(Elliptic Curve Integrated Encryption Scheme)加密后生成SUCI。

标识符说明传输保护取证价值
SUPI用户永久标识(等价IMSI)永不在空口明文传输仅核心网内部可见
SUCISUPI的加密形式ECIES加密可捕获但需解密
5G-GUTI临时身份NAS加密保护会话级临时标识
SUCI-Encrypted加密的SUCIECIES密文可作为追踪指标
SUCI-ServingNetwork服务网络标识明文传输网络归属信息

尽管SUPI/SUCI机制显著增强了隐私保护,但研究者已发现多种潜在绕过方式:

  1. SUPI暴露场景:某些特定的NAS消息(如5GMS的初始注册)在特定条件下仍可能泄露SUPI
  2. Home Network公钥固定:SUCI加密使用Home Network公钥,如果公钥可被获取,离线破解SUPI成为可能
  3. 关联攻击:通过SUCI的频率分析、位置关联等侧信道方法间接推断用户身份
  4. RAN层信息泄露:虽然NAS层加密保护了SUPI,但RRC层的某些信令仍可能泄露位置相关的标识信息

伪基站检测技术

在5G环境下,检测伪基站需要结合多种技术手段:

检测技术检测原理适用场景局限性
射频指纹识别基站硬件信号特征唯一性物理层检测需要已知基站指纹库
证书验证验证基站证书是否由运营商CA签发gNodeB认证需要核心网支持
信号异常检测信号强度、频率偏移异常RF监控环境干扰影响
邻区关系验证检查邻区关系表一致性网络优化关联需要网络配置数据
时间差定位(TDOA)多点信号到达时间差定位物理定位需要多传感器部署
行为分析基站行为模式异常网络日志分析需要历史基线数据
python3 -c "
import subprocess, re, json

result = subprocess.run(['iwlist', 'scan'], capture_output=True, text=True)
cells = re.findall(r'Cell \d+ - Address: ([\w:]+).*?Frequency:([\d.]+).*?Signal level:(-?\d+)', result.stdout, re.DOTALL)

alerts = []
for bssid, freq, signal in cells:
    if int(signal) > -30:
        alerts.append({'bssid': bssid, 'frequency': freq, 'signal': signal, 'severity': 'HIGH'})

with open('/tmp/rf_anomalies.json', 'w') as f:
    json.dump(alerts, f, indent=2)
"

0x07 5G物联网与海量连接安全取证

mMTC场景下的安全挑战

5G的mMTC(massive Machine Type Communications)场景设计支持每平方公里高达100万个设备的连接密度。海量IoT设备的接入为攻击者提供了规模巨大的潜在攻击面,同时也给取证分析带来了数据规模上的极端挑战。

安全挑战技术原因影响规模取证难点
弱认证设备设备资源受限,无法运行完整鉴权数百万级异常流量基线难以建立
固件漏洞设备生命周期长、更新困难持续性固件提取与分析
物理暴露设备部署在非受控环境广泛物理篡改检测
DDoS放大设备被控形成僵尸网络百万级流量溯源困难
数据污染恶意设备注入虚假数据业务影响数据完整性验证
协议降级强制使用弱安全机制区域级降级行为检测

NB-IoT/LTE-M安全机制

NB-IoT(Narrowband IoT)和LTE-M(LTE-Machine)是5G物联网的关键接入技术。它们的安全机制继承自LTE但进行了优化。

安全特性NB-IoTLTE-M取证关注点
鉴权协议EPS-AKA(简化)EPS-AKA鉴权向量分析
加密128位EEA(NEA0-NEA3)128位EEA加密降级检测
空口加密可选(CE模式B可关闭)强制未加密通信识别
信令保护NAS加密(轻量化)NAS加密(完整)信令篡改检测
设备身份IMEI + IMSIIMEI + IMSI设备追踪
OTA更新支持(有限带宽)支持更新包完整性验证

大规模设备异常行为检测

面对海量IoT设备产生的海量数据,异常行为检测需要采用分布式和自动化的分析方法。

#!/bin/bash
LOG_DIR="/var/log/5gc/upf"
ALERT_THRESHOLD=1000
WINDOW=300

find "$LOG_DIR" -name "*.log" -mmin -5 | while read logfile; do
  top_ips=$(awk -v threshold="$ALERT_THRESHOLD" '
    BEGIN {OFS=","}
    /data_plane_packet/ {
      split($0, a, "src=");
      split(a[2], b, " ");
      src_ip = b[1];
      count[src_ip]++;
    }
    END {
      for (ip in count) {
        if (count[ip] > threshold) print ip, count[ip]
      }
    }' "$logfile")
  if [ -n "$top_ips" ]; then
    echo "[ALERT] $(date +%Y-%m-%dT%H:%M:%S%z) High volume detected: $top_ips" >> /tmp/iot_anomaly_alerts.log
  fi
done
cat /var/log/5gc/upf/*.log | grep "data_plane_packet" | awk '{
  for(i=1;i<=NF;i++) {
    if($i ~ /src=/) {
      split($i, a, "=");
      src_ip = a[2];
      gsub(/[^0-9.]/, "", src_ip);
      count[src_ip]++;
    }
  }
} END {
  for (ip in count) {
    if (count[ip] > 500) printf "%s: %d packets\n", ip, count[ip]
  }
}' | sort -t: -k2 -rn | head -20

0x08 证据强度分层与案例关联

证据分层框架

5G安全取证中的证据需要根据确定性和威胁严重性进行分层,以指导后续的响应决策和法律行动。

证据等级含义5G场景示例采信要求响应优先级
🔴 确认恶意可直接证明攻击行为SS7位置追踪信令、伪基站RF信号、切片逃逸流量、NAS消息伪造多源交叉验证立即响应
🟡 高度可疑强烈暗示恶意行为异常API调用模式、非常规切片配置变更、MEC应用异常行为、NF证书异常单源强证据+辅助分析4小时内
🟢 需要关注可能为异常或潜在侦查异常信号强度变化、NF注册频率波动、不常见漫游路径、边缘节点资源异常持续监控+基线对比24小时内

完整证据关联表格

证据编号证据来源证据类型等级关联攻击MITRE ATT&CK取证动作
E-5G-001AMF日志NAS Authentication Reject大量出现🔴鉴权绕过/IMSI CatcherT1557提取AMF完整NAS日志,关联gNodeB信息
E-5G-002信令探针MAP_ProvideSubscriberLocation请求异常🔴SS7位置追踪T1657溯源SS7信令来源,关联攻击者身份
E-5G-003NRF日志非法NF注册记录🔴NF伪造/服务劫持T1584.006提取NF证书信息,追踪注册来源IP
E-5G-004RF监控异常基站信号强度/频率偏移🔴IMSI Catcher/伪基站T1584.006TDOA定位、射频指纹匹配
E-5G-005SMF日志非常规PDU会话建立请求🟡切片选择欺骗T1578分析请求来源、S-NSSAI参数合法性
E-5G-006MEC日志边缘应用异常API调用🟡MEC应用入侵T1190MEC应用行为审计、容器快照
E-5G-007UPF日志GTP隧道异常流量模式🟡用户面数据窃取T1040流量分析、隧道端点验证
E-5G-008PCF日志QoS策略异常变更🟡策略篡改T1562变更审批流程审计
E-5G-009gNodeB日志邻区关系表异常变更🟢网络侦查T1595对比历史邻区配置
E-5G-010IoT设备日志设备连接频率异常🟢IoT僵尸网络侦查T1571设备行为基线对比
E-5G-011UDM日志签约数据批量查询🟡签约数据泄露T1530查询审计日志、权限验证
E-5G-012NSSF日志切片资源异常分配🟡切片资源滥用T1578切片配额与SLA审计

0x09 自动化检测与狩猎

Sigma规则:SS7异常信令检测

title: SS7 Abnormal Location Tracking Request Storm
id: b7f2e4a1-8c3d-4e5f-a6b7-c8d9e0f1a2b3
status: stable
description: Detects SS7 MAP AnyTimeInterrogation/ProvideSubscriberLocation request storms indicating mass location tracking attacks
references:
  - https://www.3gpp.org/DynaReport/29002.htm
  - https://media.defense.gov/2023/Apr/27/2003205891/-1/-1/0/CSI-DETECTING-AND-PREVENTING-SS7-ATTACKS.PDF
author: Blue Team Forensics
date: 2026-07-15
modified: 2026-07-15
tags:
  - attack.discovery
  - attack.collection
  - ss7
  - telecom
  - location_tracking
logsource:
  category: telecom_signaling
  product: ss7
detection:
  selection_ati:
    message_type: "MAP_AnyTimeInterrogation_Request"
  selection_psl:
    message_type: "MAP_ProvideSubscriberLocation_Request"
  selection_spfi:
    message_type: "MAP_SendParametersForSubscriberInfo_Request"
  filter_known_sources:
    source_global_title|startswith: "00101"
    source_global_title|endswith: "001"
  condition: (selection_ati or selection_psl or selection_spfi) and not filter_known_sources and count() > 10 within 5m
level: critical
falsepositives:
  - Authorized lawful interception
  - Roaming partner location query during inter-network testing
fields:
  - source_global_title
  - destination_global_title
  - imsi_prefix
  - request_count
  - unique_targets
  - time_window

Sigma规则:IMSI Catcher射频异常检测

title: IMSI Catcher RF Anomaly Detection
id: c9d1e3f5-a7b8-4c0d-e2f4-a6b8c0d2e4f6
status: experimental
description: Detects RF-level anomalies indicating possible IMSI catcher or false base station presence
references:
  - https://ieeexplore.ieee.org/document/8408509
  - https://arxiv.org/abs/2003.01521
author: Blue Team Forensics
date: 2026-07-15
modified: 2026-07-15
tags:
  - attack.defense-evasion
  - attack.discovery
  - imsi_catcher
  - false_base_station
  - rf_monitoring
logsource:
  category: rf_monitoring
  product: imsi_catcher_detection
detection:
  selection_signal_anomaly:
    signal_delta_db|gt: 20
    cell_reselection_count|gt: 5
  selection_frequency_anomaly:
    frequency_offset_khz|gt: 0.5
    timing_advance_jump|gt: 50
  selection_behavior_anomaly:
    encryption_disabled: true
    band_reselection_to_2g: true
  condition: selection_signal_anomaly or selection_frequency_anomaly or selection_behavior_anomaly
level: high
falsepositives:
  - Normal cell handover during high-speed movement
  - Network maintenance with temporary configuration changes
  - Environmental RF interference
fields:
  - serving_cell_id
  - signal_strength_dbm
  - frequency_offset_khz
  - timing_advance
  - band_indicator
  - encryption_status
  - timestamp
  - location

Bash脚本:5G核心网日志自动化分析

#!/bin/bash
LOG_BASE="/var/log/open5gs"
OUTPUT_DIR="/tmp/5g_forensics_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUTPUT_DIR"

echo "=== 5G Core Network Log Forensics ===" > "$OUTPUT_DIR/analysis_report.txt"
echo "Analysis time: $(date -u +%Y-%m-%dT%H:%M:%SZ)" >> "$OUTPUT_DIR/analysis_report.txt"
echo "" >> "$OUTPUT_DIR/analysis_report.txt"

echo "--- Authentication Anomalies ---" >> "$OUTPUT_DIR/analysis_report.txt"
find "$LOG_BASE" -name "*.log" -mmin -60 | while read logf; do
  grep -c "authentication_failure\|auth_reject\|auth_timeout" "$logf" 2>/dev/null | while read cnt; do
    if [ "$cnt" -gt 10 ]; then
      echo "[WARN] $logf has $cnt auth failures" >> "$OUTPUT_DIR/analysis_report.txt"
      grep "authentication_failure\|auth_reject\|auth_timeout" "$logf" | head -20 >> "$OUTPUT_DIR/analysis_report.txt"
    fi
  done
done

echo "" >> "$OUTPUT_DIR/analysis_report.txt"
echo "--- NF Registration Anomalies ---" >> "$OUTPUT_DIR/analysis_report.txt"
find "$LOG_BASE" -name "*.log" -mmin -60 | xargs grep "nf_registration" 2>/dev/null | awk '{
  for(i=1;i<=NF;i++) {
    if($i ~ /nf_type=/) {
      nf[$i]++;
    }
  }
} END {
  for (k in nf) {
    if (nf[k] > 50) print "[HIGH] " k " count=" nf[k]
    else if (nf[k] > 20) print "[MED] " k " count=" nf[k]
  }
}' >> "$OUTPUT_DIR/analysis_report.txt"

echo "" >> "$OUTPUT_DIR/analysis_report.txt"
echo "--- API Error Rate Analysis ---" >> "$OUTPUT_DIR/analysis_report.txt"
find "$LOG_BASE" -name "*.log" -mmin -30 | xargs grep -E "status.*[45][0-9][0-9]" 2>/dev/null | awk -F'"' '{
  split($2, a, " ");
  code = a[1];
  codes[code]++;
} END {
  for (c in codes) {
    printf "HTTP %s: %d occurrences\n", c, codes[c]
  }
}' | sort -t: -k2 -rn >> "$OUTPUT_DIR/analysis_report.txt"

echo "" >> "$OUTPUT_DIR/analysis_report.txt"
echo "--- Session Management Anomalies ---" >> "$OUTPUT_DIR/analysis_report.txt"
find "$LOG_BASE" -name "*.log" -mmin -60 | xargs grep "pdu_session" 2>/dev/null | grep -iE "error|fail|reject|timeout" | awk '{
  for(i=1;i<=NF;i++) {
    if($i ~ /smf_id=/) smf[$i]++;
    if($i ~ /cause=/) cause[$i]++;
  }
} END {
  print "By SMF:"
  for (s in smf) printf "  %s: %d\n", s, smf[s]
  print "By Cause:"
  for (c in cause) printf "  %s: %d\n", c, cause[c]
}' >> "$OUTPUT_DIR/analysis_report.txt"

echo "" >> "$OUTPUT_DIR/analysis_report.txt"
echo "--- Slice Selection Anomalies ---" >> "$OUTPUT_DIR/analysis_report.txt"
find "$LOG_BASE" -name "*.log" -mmin -120 | xargs grep "nssf" 2>/dev/null | grep -iE "slice_selection|nssai" | awk '{
  for(i=1;i<=NF;i++) {
    if($i ~ /sst=/) sst[$i]++;
  }
} END {
  for (s in sst) printf "SST %s: %d selections\n", s, sst[s]
}' >> "$OUTPUT_DIR/analysis_report.txt"

echo "Report generated: $OUTPUT_DIR/analysis_report.txt"
wc -l "$OUTPUT_DIR/analysis_report.txt"

Python脚本:Diameter/SS7信令流量解析与异常检测

import sys
import struct
import json
import time
from collections import defaultdict, Counter
from datetime import datetime

class DiameterMessageParser:
    COMMAND_CODES = {
        274: "Abort-Session",
        275: "Accounting",
        280: "Capabilities-Exchange",
        282: "Re-Auth",
        285: "Query-User",
        291: "Update-Location",
        300: "Subscription-Information",
        303: "Push-Profile",
        316: "Server-Assignment",
        318: "Authentication-Information",
    }

    AVP_CODES = {
        1: "Session-Id",
        263: "Origin-Host",
        264: "Destination-Host",
        268: "Auth-Application-Id",
        277: "Destination-Realm",
        283: "User-Name",
        701: "Subscription-Data",
        1406: "Non-3GPP-Subscriber-Data",
        1425: "UICC-Access-Application-Data",
    }

    def __init__(self):
        self.messages = []
        self.anomalies = []
        self.stats = defaultdict(int)

    def parse_header(self, data):
        if len(data) < 20:
            return None
        version = data[0]
        msg_length = struct.unpack("!I", b'\x00' + data[1:4])[0]
        command_flags = data[4]
        command_code = struct.unpack("!I", data[5:9])[0]
        application_id = struct.unpack("!I", data[9:13])[0]
        hop_by_hop = struct.unpack("!I", data[13:17])[0]
        end_to_end = struct.unpack("!I", data[17:21])[0]
        return {
            "version": version,
            "length": msg_length,
            "flags": command_flags,
            "command_code": command_code,
            "application_id": application_id,
            "hop_by_hop_id": hop_by_hop,
            "end_to_end_id": end_to_end,
            "is_request": bool(command_flags & 0x80),
        }

    def parse_avps(self, data, offset):
        avps = {}
        while offset < len(data) - 4:
            avp_code = struct.unpack("!I", data[offset:offset+4])[0]
            avp_flags = data[offset+4]
            avp_length = struct.unpack("!I", b'\x00' + data[offset+5:offset+8])[0]
            if avp_length < 8 or offset + avp_length > len(data):
                break
            padded_length = (avp_length + 3) & ~3
            if avp_code in self.AVP_CODES and avp_length > 8:
                avp_value = data[offset+8:offset+avp_length]
                try:
                    avps[self.AVP_CODES[avp_code]] = avp_value.decode('utf-8', errors='replace')
                except Exception:
                    avps[self.AVP_CODES[avp_code]] = avp_value.hex()
            offset += padded_length
        return avps

    def analyze_message(self, header, avps, src_ip, dst_ip, timestamp):
        cmd_name = self.COMMAND_CODES.get(header["command_code"], f"Unknown({header['command_code']})")
        self.stats[cmd_name] += 1

        if header["command_code"] == 318 and header["is_request"]:
            origin = avps.get("Origin-Host", "unknown")
            target = avps.get("User-Name", "unknown")
            self.messages.append({
                "timestamp": timestamp,
                "type": "AIR",
                "command_code": 318,
                "origin_host": origin,
                "imsi": target,
                "src_ip": src_ip,
                "dst_ip": dst_ip,
            })

        if header["command_code"] == 318:
            key = f"{avps.get('Origin-Host', 'unknown')}:{avps.get('User-Name', 'unknown')}"
            self.stats[f"air_{key}"] += 1

    def detect_anomalies(self, window_seconds=300):
        now = time.time()
        recent_messages = [m for m in self.messages if now - m.get("ts_epoch", now) < window_seconds]

        origin_counts = Counter(m.get("origin_host", "unknown") for m in recent_messages)
        imsi_counts = Counter(m.get("imsi", "unknown") for m in recent_messages)

        for origin, count in origin_counts.items():
            if count > 20:
                self.anomalies.append({
                    "type": "HIGH_AUTH_REQUEST_RATE",
                    "severity": "HIGH",
                    "origin_host": origin,
                    "request_count": count,
                    "window_seconds": window_seconds,
                    "description": f"Excessive Authentication-Information-Request from {origin}",
                })

        if len(set(m.get("imsi", "") for m in recent_messages)) > 50:
            self.anomalies.append({
                "type": "MULTI_SUBSCRIBER_QUERY",
                "severity": "MEDIUM",
                "unique_imsi_count": len(set(m.get("imsi", "") for m in recent_messages)),
                "description": "Unusually large number of unique IMSIs queried in short window",
            })

        return self.anomalies


def parse_pcap_diameter(filepath, max_packets=10000):
    parser = DiameterMessageParser()
    packet_count = 0
    with open(filepath, 'rb') as f:
        magic = f.read(4)
        if magic != b'\xd4\xc3\xb2\xa1':
            print("Error: Not a valid pcap file (big-endian)")
            f.seek(0)
            magic = f.read(4)
            if magic != b'\xa1\xb2\xc3\xd4':
                print("Error: Invalid pcap format")
                return parser

        f.read(4)
        f.read(4)
        f.read(4)
        f.read(4)

        while packet_count < max_packets:
            ts_sec = struct.unpack("!I", f.read(4))[0]
            ts_usec = struct.unpack("!I", f.read(4))[0]
            incl_len = struct.unpack("!I", f.read(4))[0]
            orig_len = struct.unpack("!I", f.read(4))[0]
            if incl_len == 0 or incl_len > 65535:
                break
            packet_data = f.read(incl_len)
            if len(packet_data) < incl_len:
                break
            packet_count += 1

            timestamp = datetime.fromtimestamp(ts_sec + ts_usec / 1000000).isoformat()

            try:
                eth_header_len = 14
                ip_header_start = eth_header_len
                ip_header = packet_data[ip_header_start:ip_header_start+20]
                ip_proto = ip_header[9]
                src_ip = ".".join(str(b) for b in ip_header[12:16])
                dst_ip = ".".join(str(b) for b in ip_header[16:20])

                if ip_proto == 17:
                    udp_header_start = ip_header_start + 20
                    udp_header = packet_data[udp_header_start:udp_header_start+8]
                    src_port = struct.unpack("!H", udp_header[0:2])[0]
                    dst_port = struct.unpack("!H", udp_header[2:4])[0]

                    if src_port == 3868 or dst_port == 3868:
                        diameter_start = udp_header_start + 8
                        diameter_data = packet_data[diameter_start:]
                        if len(diameter_data) >= 20:
                            header = parser.parse_header(diameter_data)
                            if header:
                                avps = parser.parse_avps(diameter_data, 20)
                                header["ts_epoch"] = ts_sec
                                parser.analyze_message(header, avps, src_ip, dst_ip, timestamp)
            except Exception:
                continue

    anomalies = parser.detect_anomalies()
    return parser


def print_report(parser):
    print("=" * 70)
    print("5G DIAMETER SIGNALING FORENSICS REPORT")
    print("=" * 70)
    print(f"Generated: {datetime.now().isoformat()}")
    print(f"Total Diameter messages analyzed: {sum(v for k, v in parser.stats.items() if not k.startswith('air_'))}")
    print()

    print("--- Command Code Distribution ---")
    for cmd, count in sorted(parser.stats.items(), key=lambda x: -x[1]):
        if not cmd.startswith("air_"):
            print(f"  {cmd}: {count}")
    print()

    print("--- Authentication-Information-Request by Origin ---")
    air_stats = {k: v for k, v in parser.stats.items() if k.startswith("air_")}
    for key, count in sorted(air_stats.items(), key=lambda x: -x[1]):
        print(f"  {key}: {count}")
    print()

    if parser.anomalies:
        print("--- DETECTED ANOMALIES ---")
        for a in parser.anomalies:
            print(f"  [{a['severity']}] {a['type']}: {a['description']}")
            if "request_count" in a:
                print(f"    Request count: {a['request_count']}")
            if "unique_imsi_count" in a:
                print(f"    Unique IMSIs: {a['unique_imsi_count']}")
    else:
        print("--- No anomalies detected in current analysis window ---")
    print()


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"Usage: {sys.argv[0]} <diameter_pcap_file>")
        sys.exit(1)

    pcap_file = sys.argv[1]
    print(f"Analyzing Diameter signaling from: {pcap_file}")
    parser = parse_pcap_diameter(pcap_file)
    print_report(parser)

0x0A 公开案例分析

案例1:SS7位置追踪攻击——多位记者被追踪

事件概述:2018年至2020年期间,多名使用O2-德国网络的记者被通过SS7信令漏洞进行了持续的位置追踪。攻击者利用SS7协议中的MAP_ProvideSubscriberLocation操作,通过与受入侵的电信运营商互连点发起位置查询请求,持续追踪目标记者的物理位置。

攻击链描述

阶段攻击动作技术手段MITRE ATT&CK
1. 初始访问攻击者入侵第三方运营商SS7网关或获取SS7接入权限利用运营商安全薄弱环节、社会工程T1199
2. 目标选择获取目标IMSI/MSISDN(通过暗网购买或内部渠道)OSINT、数据泄露、内部威胁T1597
3. 位置查询发送MAP_ProvideSubscriberLocation_RequestSS7协议滥用T1657
4. 持续追踪定期重复位置查询(每小时多次)批量化SS7查询T1657
5. 数据汇整汇总位置数据构建目标活动模式时间序列分析T1074

取证发现

  1. 运营商信令网关日志中发现大量来自特定互连点的MAP_ProvideSubscriberLocation请求,目标IMSI集中在少数记者的号码
  2. 请求频率异常——正常漫游场景下单个IMSI的位置查询频率通常不超过每6小时一次,而攻击期间频率达到每小时3-5次
  3. 查询来源为东欧地区的漫游合作伙伴,该合作伙伴的SS7网关安全防护薄弱
  4. 受影响设备的位置数据精度达到基站级别(约200-500米范围)

IOC

IOC类型说明
SS7来源GT特定漫游合作伙伴Global Title攻击信令入口
目标IMSI前缀特定MCC/MNC组合受影响用户特征
查询时间模式工作日08:00-22:00每1-2小时攻击者活动时间
请求类型MAP 133 (ProvideSubscriberLocation)SS7操作码
频率异常阈值同一IMSI 5分钟内>3次检测规则触发点

经验教训

  • 运营商需要对SS7互连点实施严格的信令过滤策略(信令防火墙)
  • SS7位置查询的频率限制和异常检测是防御位置追踪攻击的关键
  • 3GPP TS 33.200定义的SS7安全防护措施在实际部署中执行不力
  • 记者等高风险目标群体需要运营商提供增强保护

案例2:执法机构使用Stingray伪基站的大规模监控

事件概述:根据多家媒体调查和法院文件披露,美国多个执法机构长期使用Harris Corporation生产的Stingray设备(IMSI Catcher的商业化产品)进行嫌疑人定位和监控。该设备能够模拟商业基站,诱使覆盖区域内的所有手机连接并暴露其身份信息和位置数据。2019年,FBI在波士顿部署的Stingray设备在一次行动中同时影响了覆盖区域内数千名无辜平民的通信。

攻击链描述(执法部署场景)

阶段操作动作技术手段取证关注点
1. 部署准备将Stingray设备部署在目标区域附近便携式RF发射器+控制笔记本RF信号异常
2. 信号广播广播比周围基站更强的信号功率控制、频段匹配邻区关系异常
3. 设备连接诱使目标区域内手机连接强信号压制大量NAS连接请求
4. 身份捕获获取连接设备的IMSI/TMSINAS层信令拦截IMEI/IMSI采集日志
5. 通信监控截获目标设备通信内容2G/3G MITM加密降级事件
6. 位置追踪持续追踪目标移动轨迹信号测量连续位置数据

取证发现

  1. RF频谱监控在目标区域检测到异常基站信号——信号强度持续高于周围合法基站10-20dB
  2. 网络优化系统报告大量设备异常重选(Cell Reselection)事件
  3. 部分设备被检测到从4G回落到3G/2G网络,表明存在加密降级攻击
  4. 目标区域内基站的邻区关系表出现未知小区ID
  5. MME(4G)或AMF(5G)日志中检测到大量异常的TAU(Tracking Area Update)请求

IOC

IOC类型说明
异常信号强度比邻区高15-25dBStingray功率特征
未知Cell ID不在运营商配置数据库中的小区标识伪基站标识
回落事件4G→3G/2G切换频率异常加密降级攻击
TAU风暴单基站区域每分钟>50次TAU设备重连Stingray
频率偏移与标称频率偏差>0.3ppm非运营商设备特征
设备厂商Harris Corporation设备特征码Stingray指纹

经验教训

  • IMSI Catcher的检测需要在RF层面部署持续监控系统
  • 5G的SUPI/SUCI机制可以缓解部分身份追踪风险,但不能完全消除
  • 运营商与执法机构之间需要建立合法拦截的标准化流程
  • 公民隐私保护要求在使用此类技术时实施严格的司法授权和比例原则

0x0B 参考资料

编号类别资料名称链接
13GPP标准3GPP TS 33.501 - Security architecture and procedures for 5G Systemhttps://www.3gpp.org/DynaReport/33501.htm
23GPP标准3GPP TS 33.200 - Security of Network Functions (NF)https://www.3gpp.org/DynaReport/33200.htm
3安全研究ENISA - 5G Security Measures and Toolshttps://www.enisa.europa.eu/publications/5g-security/measures
4安全研究NIST SP 1800-33 - 5G Cybersecurityhttps://www.nccoe.nist.gov/5g-cybersecurity
5开源工具Open5GS - Open Source 5G Core and EPChttps://open5gs.org/open5gs/docs/guide/01-quickstart/
6开源工具srsRAN - Open Source SDR LTE/5Ghttps://docs.srsran.com/projects/5g/
7威胁情报ENISA Threat Landscape for 5G Networkshttps://www.enisa.europa.eu/topics/threat-landscape/5g-threat-landscape
8攻击研究5G SBA API Security - 3GPP SA3 Working Documentshttps://www.3gpp.org/specifications-groups/sa3-security