☰
5G-AKA主动攻击韧性新思路:认证与密钥协商的工程实践
2026/10/19 10:16:51 网站建设 项目流程

1. 从“能通信”到“能扛攻击”:重新审视5G认证这件事

用一句话概括:5G里的认证与密钥协商(AKA),本质上是在回答两个问题——你是谁,以及凭什么信你。听上去很简单,但在真实网络里,这两个问题牵动着SIM卡、接入网、核心网、边缘业务平台之间一长串的信任链条。很多刚入行的朋友,一看到认证就条件反射地想到“加密”,以为算法够强就万事大吉;等到自己抓包分析才发现,真正让系统翻车的往往不是密码算法本身,而是协议状态机被主动攻击者反复玩弄后的连锁反应。

主动攻击韧性和传统安全测试不太一样。传统的被动攻击假设攻击者站在旁边听,能破解密文、能伪造消息就算攻击成功;主动攻击则假设攻击者已经站在信道中间,会插话、会篡改、会诱骗终端回到弱安全通道,甚至能让核心网一侧短暂“失忆”或“错位”。5G-AKA虽然把身份保护、密钥分层、双向认证做得比前代细致,但面对这些主动动作,仍然存在可以被利用的间隙。这篇文章想做的事情,就是把认证与密钥协商这条主线拆开,先看它原本想防御什么,再分析主动攻击到底从哪些缝隙里钻进来,最后给出我在实测中总结出的一些新思路和可以直接落地的测试方法。

如果你正在做5G核心网测试、协议安全分析,或者刚接触移动通信安全并想系统梳理AKA的细节,这篇内容会比较对胃口。后面涉及的消息名和参数比较多,我会尽量用大白话解释它们为什么存在,以及它们被主动攻击者盯上时会出什么问题。

1.1 核心需求解析

先说清楚“主动攻击韧性”到底是什么。常规安全测试关心的是能不能攻破,韧性关心的是攻破之后还能不能快速恢复。放在5G认证场景里,就是系统在被伪基站诱导、被重放旧认证消息、被降级到弱安全协议、甚至内部节点被拿下之后,用户的身份是否仍然保密,会话密钥是否仍然隔离,后续业务是否还能继续建立信任。

这里的核心需求有三个:第一是身份不可追踪,攻击者不能通过认证消息把同一用户在不同时间、不同地点的行为关联起来;第二是密钥不可扩散,某个网络节点被攻击后,攻击者不能顺着密钥链往上摸到根密钥,也不能横向摸到其他网元的密钥;第三是状态不可污染,即使攻击者恶意制造重放、超时和同步失败,合法用户与网络也要能重新快速对齐状态,而不是陷入长时间无法注册的怪圈。

1.2 为什么单独谈“新思路”?

如果只看5G-AKA的协议设计,会感觉它在4G基础上已经改了不少:身份从IMSI升级成了加密的SUCI,服务网和归属网的密钥从一套变成了分层的KSEAF/KAUSF/K,还增加了HXRES*这类哈希校验值。但标准协议是一回事,真实部署是另一回事。设计者默认网络内部节点可信、默认终端能力一致、默认攻击者只能在信道上被动监听。主动攻击偏偏要把这些默认条件一条条剥掉。

所以谈“新思路”,不是简单否定现有AKA,而是把它放到一个更大的韧性框架里重新审视:认证与密钥协商不再只是上线前验证一次就结束的功能,而是需要持续检测、动态轮换、故障隔离和自动恢复的系统能力。这从理念上已经和“实现一套流程跑通”完全不同。

2. 5G认证与密钥协商的骨架:先理解它防什么

2.1 从4G到5G,认证链路多出来的三层角色

4G时代,认证基本是MME和HSS之间的事,终端和网络共享根密钥K,由网络侧生成RAND和AUTN完成双向认证,接着派生KASME交给访问网络。5G把这条链路拆成了UE、SEAF、AUSF、ARPF/UDM四层。ARPF拥有根密钥K,负责生成认证向量;AUSF负责与SEAF配合完成对服务网络的认证;SEAF相当于访问侧代表,从AUSF手里拿到KSEAF,再继续向终端侧派生接入网密钥。

这么拆的核心原因是,访问网络不再直接触碰最高级的根密钥材料,与归属网络之间的信任边界变得更清晰。如果SEAF被攻击者控制,他最多拿到KSEAF,没法反推KAUSF和K,根密钥仍然留在ARPF;如果AUSF被控制,它拿到的材料也不足以直接冒充用户身份向另一个服务网长期欺骗。这种分层拆解本身就是对主动攻击的第一道抵抗:攻击者必须同时拿下网络内部的多个节点,才能横向扩大战果。

2.2 认证流程里的关键消息与防作弊设计

5G-AKA的完整流程可以简化为六个关键步骤:

  1. UE发起注册时,把SUCI交给SEAF。SEAF不知道用户真实身份,但能确认UE带来了可识别的归属网络信息。
  2. SEAF向AUSF发起认证请求,AUSF再向ARPF取认证向量。ARPF用根密钥K、SQN、RAND算出AUTN、XRES*等参数。
  3. AUSF把一部分校验参数转给SEAF。注意,不是XRES明文,而是经过哈希的HXRES,避免访问网络侧直接看到终端的完整认证响应。
  4. SEAF把RAND和AUTN发给UE,UE的USIM验证AUTN中的MAC和SQN,确认网络是真的,然后派生RES*回给SEAF。
  5. SEAF把收到的RES与HXRES做哈希比对,通过后再把RES*交给AUSF做最终比对,AUSF确认后派生KSEAF发给SEAF。
  6. SEAF保存KSEAF,后续链路的完整性和加密密钥都由它继续往下推。

这里有几个防作弊设计值得强调。SQN用来检测重放,避免攻击者直接把上一次的AUTN再次抛给UE。MAC绑定RAND和SQN,防止SEAF或中间人篡改消息。HXRES是一个哈希值,SEAF无法直接看到终端的RES明文,减少了服务网侧泄露认证响应的面。最后,AUSF把KSEAF下发给SEAF时,两者之间的接口本身要建立安全上下文,防止第三方截获密钥材料。

下面这张表整理了核心参数在主动攻击视角下的含义:

参数作用主动攻击视角
RAND随机挑战,每次认证唯一的输入若可预测或可重放,认证向量就能被复用
AUTN认证令牌,包含MAC和SQN攻击者会尝试延迟、重放、替换
SQN序列号,防重放主动干扰可让状态失步,并触发同步风暴
MAC完整性校验,绑定挑战参数防止篡改AUTN内容
RES*/HXRES*终端响应/哈希后的服务网比对值需要防止提前泄露以伪造响应
KSEAF服务网锚点密钥一旦泄漏,后续接入网密钥可能全部告破

2.3 不可否认的短板:它防的是“被动”,不是“主动”

再看一遍上面的流程,会发现一个有意思的事实:整套机制假设网络内部节点是可信的、消息通道是基本不可读的。协议设计的大量精力放在“让终端和网络对同一串随机数做出只有持卡者才能正确计算的响应”。可主动攻击者不按牌理出牌,他不去破解算法,而是不断制造超时、重发、错误状态,等你状态错乱时再下手。

这部分不是标准缺陷,而是任何有状态协议都会面临的通用问题。5G-AKA只是把状态机暴露面放大了。比如SQN同步机制依赖终端和网络两侧都维持一个不断递增的计数,攻击者不需要知道计数值,只要反复触发同步失败,就能让两侧的计数越跑越远。等到系统真的需要认证时,合法用户反而被认为是恶意用户。后面第三部分就具体拆这些场景。

3. 主动攻击场景拆解:这些坑不靠补丁能填平

3.1 身份追踪:从IMSI捕获到SUCI指纹

伪基站最大的杀伤力不是偷听电话,而是在终端还没接入真正的网络之前,用更强的信号让终端主动上报身份。4G时代IMSI明文报上来的事屡见不鲜。5G引入SUCI之后,终端会把SUPI放进一个带有归属网络公钥的加密信封里,正常情况只有归属网络一侧的私钥能解开。

但实际测试中,有几条口子会被主动攻击利用。第一,如果终端不支持保护算法方案或配置错误,UE可能以明文SUCI发送,等于回到4G时代。第二,攻击者虽然解不开SUCI,但同一批终端的SUCI长度、加密算法标识、路由信息很可能形成稳定的指纹,哪怕隔几天出现在不同小区,攻击者也能把多个观察点串成轨迹。第三,GUTI重新分配本身不是强制的,时间窗口内如果网络拒绝分配或终端异常掉线退回SUCI,同样暴露。

“主动攻击韧性”的含义在这里很清晰:不是让攻击者永远看不到身份,而是在被盯上之后仍然保持不可关联性。也就是说,身份保护不能依赖单一机制,必须靠SUCI、GUTI、重注册策略共同维护。

3.2 重放攻击与状态失步:撕开SQN的遮羞布

SQN这套机制在理想情况下没问题:终端本地维护一套接收过的SQN最大值,网络侧维护一套为每个用户当前分配过的SQN值。收到AUTN后,终端会检查AUTN中的SQN是否大于本地最大值,如果小于等于,就认为可能是重放,回一个AUTS消息并带上预期的SQN,网络侧再根据AUTS做同步。

看起来闭环了,但主动攻击者可以不断把旧的AUTN发给终端,每次都会触发AUTS;与此同时,攻击者又在别处干扰网络侧的下发消息,让网络侧收不到AUTS,导致网络侧SQN继续上涨。几次下来,终端的SQN和网络侧SQN会飞出很远。等到真网络下发一个正常的AUTN时,终端一看SQN比本地低,又回AUTS,网络却认为终端在恶意提交错误状态而不做同步,注册就失败了。

更麻烦的是,每次回AUTS的过程还可能被攻击者用来观察时间侧信道,辅助判断当前SQN的范围,为后续构造伪AUTN做铺垫。测试中我遇到不止一次“大规模注册失败风暴”,一开始怀疑核心网Bug,最后抓包发现是攻击脚本反复重放同一个RAND/AUTN造成的状态污染。这说明重放攻击在高版本协议里并没有消失,只是从直接绕过认证变成了干扰状态同步。

3.3 降级攻击:安全性的“木桶短板”

降级攻击是主动攻击里性价比最高的一种。攻击者只需要制造一个假的4G小区,同时干扰或屏蔽5G小区,终端在信号层面就会自然重选到4G。5G在系统设计时考虑了向下兼容,UE注册进4G网络后走EPS-AKA,在归属网络侧通过双注册、切换、迁移机制继续协商。

问题在于,4G侧很多老基站或核心网不支持完整的安全能力协商,或者配置了允许NULL完整性算法。很多测试脚本恰恰只关注5G注册流程,忽略回落,导致终端跑到4G后完整性检查是关闭的。攻击者不仅能看到明文NAS消息,还能以合法身份往终端注入某些配置。

对韧性设计来说,这是最典型的系统性风险:协议本身没问题,但多代系统互操作让攻击者总是选择最弱的一环。韧性思路不能只加固5G一面,还要给降级路径定义同样严格的安全策略,比如终端侧配置“无完整性算法则不允许建立数据连接”的强制策略。否则,5G做得再强,回落口子一开,整体安全性立刻回到十年前。

3.4 密钥泄漏与后量子威胁:主动攻击的长期窗口

很多人觉得主动攻击是“实时破坏”,其实有一种更阴险:长期被动收集加事后解密。假设攻击者在认证链路中某个点拿到了KSEAF或者相关密钥材料,他不需要当场发动攻击,而可以等攒下足够多的会话密文后,用算力逐步推开。

5G AKA的对称根密钥体系在数学上还能扛,但未来若引入量子计算对公钥基础设施的冲击,认证流程涉及的证书、信任根、信令保护密钥都会有被历史性覆盖的风险。这个问题的核心是“韧性”:我们既要在时间维度上限制密钥寿命,也要在密码学维度上切换到抗量子算法,并做好抗量子的证书体系和密钥交付升级。

稍微靠谱的思路,是给KSEAF之后的派生再叠加一个周期性轮换的临时密钥。即使根层材料被历史性破解,已经破解的密文也未必能关联到后续新密钥保护的会话。这四类场景合在一起,基本覆盖了主动攻击的主要路径:身份追踪、状态污染、降级暴露、历史解密。

4. 新思路:把防空袭当作系统工程,而不是修单车

4.1 动态身份与零信任:让伪基站失效

既然静态身份容易追踪,一个直接思路是把身份变成“会动的东西”。标准协议里已经有GUTI临时身份,但GUTI的分配周期往往偏长。更主动的做法是缩短GUTI生命周期,并引入身份轮换触发条件:终端检测到异常拒绝、跨TA边界或者多次认证失败时,立刻请求新GUTI。配合SUCI的加密标识定期更换,攻击者即使抓到两个时刻的信令,也很难判断是不是同一个用户。

在核心网内部,零信任模型同样值得引入。5G服务化架构里,网元之间的调用不再默认互信,每个服务请求都要做二次认证和动态授权,双向TLS和短时令牌按需校验。这样即使主动攻击拿下了一个网络功能,也不能顺着内部调用链横向移动。换句话说,动态身份解决“用户被追踪”的问题,零信任解决“网络节点被拿下后还能不能扩散”的问题。这两点配合起来,才是真正的主动攻击韧性。

4.2 密钥分层与快速轮换:让泄漏也有限

密钥层次像公司门禁卡,你不能让一个外包保洁拿着总经理办公室的万能钥匙满楼跑。AKA里KSEAF只给访问网络使用,已经是一种隔离,但KSEAF的生命周期仍然可能和用户会话一样长。更主动的做法,是在KSEAF下面再增加一个短生命周期的会话密钥层,每隔几分钟由接入网与终端重新派生,不触碰根密钥。

同时,把重派生过程嵌入到切换、服务更新等正常流程里。这样即使某个时刻的会话密钥泄漏,攻击者能解密的时间窗口也非常短。最坏情况下,系统损失被限制在单个网络功能或单个会话内,而不会从一把钥匙摸到所有门。这种思路在工程上并不难,难的是让控制面信令开销和密钥更新自动化程度平衡。我在模拟项目X里试过把密钥刷新周期设为五分钟一次,业务层面基本无感,但攻击者拿到旧密钥后能解出来的数据量大幅下降。

此外,后量子方向也值得提前布局。在现有AKA之外增加一层基于后量子算法的短期密钥封装,在终端和归属网络之间做一次额外握手,可以减少未来量子计算对历史密文的威胁。这条路不需要推翻现有AKA,只要把认证之后的密钥交付阶段做成“可插拔”的,新算法到来时就能平滑切换。

4.3 形式化验证:把攻击路径自动挖出来

手工测试很难覆盖所有状态组合。新思路之一,是把AKA协议建模成一套可执行规则,交给自动化安全协议分析工具去穷举攻击路径。建模时不需要把整个信令栈都搬进去,只需要关注UE、SEAF、AUSF、ARPF四个角色,以及每个角色身上的状态变量:SQN、计数器、密钥集合。

具体流程可以分五步:

  1. 把每个角色定义成接收和发送事件的规则,写清楚每条消息触发后的状态更新条件。
  2. 声明主动攻击者能力:可拦截、延迟、重放、修改消息,可发起并发会话,可选择性丢包。
  3. 定义安全目标:不可伪造RES*、无法重放旧认证、无法在SQN失步后获得认证、无法单点控制导致全局密钥暴露。
  4. 运行分析工具,让它自动搜索所有可能的攻击序列。
  5. 把结果整理成攻击树,节点是攻击步骤,边是前置条件,再按实现成本排序,以此决定先修哪个问题。

某实验室在一次验证中就发现了一个“HXRES校验提前结束”的漏洞,攻击者可以通过伪造一个长度异常的RES让SEAF跳过哈希比对。这个漏洞手工测试很难发现,但形式化验证几分钟就能跑出来。把这种验证嵌入到日常CI里,每次协议配置变更都自动跑一遍,漏洞挖掘就从碰运气变成了可审计的活动。

4.4 韧性的闭环:检测、隔离、恢复

所谓韧性,不是让攻击不可能发生,而是让攻击尽管发生,系统也能迅速定位、限制损失、恢复正常。只做防御不做响应,那不叫韧性,叫门槛。因此,每个环节都要同时设计检测信号和恢复动作。

韧性层次预防动作检测信号恢复动作
身份层动态身份轮换、SUCI加密标识更新SUCI异常重复出现、明文SUCI立即重分配GUTI并标记风险
认证状态层SQN上限保护、AUTS限流自动失步响应阈值触发重置状态,要求重新强认证
密钥层KSEAF下增加临时密钥轮换密钥更新频率异常强制会话重置,吊销旧密钥
节点信任层NF间二次认证、动态令牌异常调用链告警隔离NF,重新颁发凭证

这套闭环的核心是把安全事件当成可运维对象。主动攻击发生的那一刻,系统不仅能感知,还能通过自动动作把损失锁在一个小范围内。没有闭环的“新思路”只是换一种加密方式,本质上还是在和攻击者拼算力,拼不过的。

5. 实操:在隔离测试环境中验证主动攻击韧性

5.1 测试环境怎么搭

我在模拟项目X的测试环境里跑过一轮主动攻击韧性验证,环境包括一个真实UE协议栈、一套模拟核心网、一个用于挂载RAN分接口的代理。分接口上同时抓三类消息:UE到RAN的空中信令、RAN到AMF之间的NAS消息、AMF和AUSF之间的内部接口调用。

必须使用完全隔离的专用频段,并贴上授权测试标识。不要尝试在商用频段上做伪基站,一方面违法,另一方面干扰真实网络的变量会让你很难判断结果。我做这种测试时,一般把攻击发起点放在两个位置:一个在RAN和AMF之间,模拟“中间人核心网节点”;另一个在UE与RAN之间,模拟伪基站。

在这个环境里,最核心的验证目标是:攻击发生后,终端和核心网能否在指定时间内恢复有效信任关系,以及在攻击期间是否出现身份泄露或密钥泄露的可观测痕迹。

5.2 攻击注入与指标采集

针对四类主动攻击,可以分别设计注入方法:

  • 重放攻击:抓一份正常认证请求,在终端本地缓存AUTN,过一段时间后再重发一次,观察SQN冲突和AUTS是否出现。
  • 状态污染:连续发送大量乱序AUTN,观察核心网SEAF对同步失败的处理逻辑,是否触发限流,是否把用户状态标记为异常。
  • 降级攻击:把模拟RAN切成4G模式,强制终端执行回落流程,关闭完整性算法后发送注册请求,观察核心网和终端是否接受这种弱安全协商。
  • 身份追踪:在一小时内持续抓取SUCI出现情况,检查SUCI中的加密方式标识是否变动,GUTI是否及时重分配。

采集指标时,建议主看五类:注册成功率、AUTS出现次数、从攻击开始到成功恢复的时间、SUCI变动周期、密钥重新派生频率。每轮攻击至少跑十次,记录平均值和最大偏差,因为主动攻击往往带有随机性,只看一次结果容易误判。

5.3 用攻击树指导修复的实践顺序

攻击树的价值是把修复顺序从“凭感觉”变成“看成本”。我习惯按下面的优先级处理:

  1. 先解决降级攻击:在所有协议栈配置里禁用NULL完整性,在所有小区配置里禁用弱加密算法。这是收益最大、成本最低的一步。
  2. 再处理身份追踪:缩短GUTI重分配周期,对明文SUCI做实时告警。
  3. 处理状态污染:给AUTS处理增加限流,给SQN同步增加最大次数上限;如果连续同步失败,直接把用户状态改成“需强认证”。
  4. 处理密钥泄漏:部署短生命周期临时密钥派生,设定最大密钥年龄。
  5. 处理后量子威胁:对远端网管接口启用证书升级,评估抗量子签名算法的兼容性。这步成本高,确认需求后再动。

这套顺序我在多个测试里验证过,前两步往往在半天内就能完成,而且效果立竿见影;后两步需要改协议栈和部署架构,要放到版本计划里推进。

5.4 现场记录与结果判读

测试过程中最怕的是拿到一堆日志不会读。这里整理几个常见的日志特征和含义:

日志特征可能原因排查方向
UE回AUTS网络侧下发了SQN过旧或重放的AUTN检查重放窗口和攻击脚本
注册失败伴随sync failureSQN失步风暴检查是否重复发送同一AUTN
NAS完整性算法协商为NULL回落路径配置错误对比UE与网络侧算法支持列表
SUCI明文出现终端保护关闭或归属网络公钥未下发检查USIM配置和公钥生命周期
切换后重新认证失败KSEAF或临时密钥不同步查看锚点密钥更新时序

判读要诀很简单:不要看到报错就认为是Bug。先问自己,如果我是攻击者,能不能用这个报错制造更多错误?能,那就说明这里不是故障,而是安全弱点。

6. 常见问题速查:5G-AKA主动攻击测试碰到过的怪问题

6.1 SUCI解密失败

这个问题最常见的三类原因:归属网络私钥没有同步到测试节点、终端公钥版本落后、加密模式标识不一致。排查时先看SUCI首字节里的方案标识和公钥标识,再检查两侧密钥生命周期是否重叠。要注意的是,别把解密失败全部归因于算法,主动攻击时攻击者也可能故意插入一个“垃圾版本”的SUCI,耗用网络侧解密资源,形成拒绝服务。因此,归属网络侧必须对SUCI解密加入速率限制。

6.2 SQN同步风暴

测试环境里出现同步风暴,很多时候不是攻击,而是多个节点复制了同一个SIM卡配置。多个节点同时抢用同一用户,会互相踩SQN,导致网络侧认为终端状态恶意。处理方法是给每个测试节点分配独立的SIM配置,或者关闭多节点并发抢占同一用户的功能。

如果确认是攻击脚本在重放,则要看核心网是否对AUTS做限流。我测试的那套模拟环境一开始没有限流,攻击脚本把认证请求频率拉满后,核心网CPU和内存都明显上涨。加上限流和后,系统才在攻击期间稳住注册成功率。

6.3 回落4G后完整性关闭

这类问题经常出现在“5G+A”的测试组合里,终端从5G回落4G后,NAS完整性算法协商成了NULL。网上查到的常见解释是“4G侧配置问题”,但实际排查时还要看UE携带的UE安全能力字段,确认终端是否支持5G侧常用的完整性算法。很多测试终端只支持AES和SNOW 3G,如果4G侧只配了祖传的NULL或Kasumi,就会协商出弱算法。

正确的做法是在4G侧把弱算法全部禁用,并且让终端在回落时强制校验完整性算法列表。如果某个小区不支持强完整性,直接拒绝接入,而不是降级使用。

6.4 伪基站总能抓住自己的终端

伪基站测试看起来简单,实际上很容易出现“抓到所有终端”的尴尬。主要原因是伪基站的PLMN、小区信号和重选参数设得太逼真,终端直接选择了伪小区。排查时先确认测试终端是否锁定在专用测试频点,或者是否禁用了PLMN自动选择。

做伪基站测试,核心目标不是“成功率多高”,而是“协议栈对异常小区的容忍度”。我建议分三个场景:完全陌生PLMN、同PLMN不同TAC、同PLMN同TAC但覆盖更强。三个场景的信号和输出完全不同,能帮助你定位到具体是哪一层信任逻辑出了问题。

6.5 形式化验证模型太大跑不完

如果一开始就把协议所有细节塞进验证框架,信令压缩、重传定时器、完整状态机一股脑建模,规则数量会爆炸,跑几天也结束不了。解决方案是抽象,只建模认证相关的三个状态变量:SQN、计数器、密钥状态。其他信令细节全部剔除。

先跑单会话,跑通之后再并发两个用户,逐步扩大规模。我在建模过程中发现,部分攻击路径只有在“某个状态更新之前就发消息”的情况下才会出现,这跟重放漏洞的本质是一致的。模型太大跑不完,通常不是工具的问题,而是建模范围没有收好。

最后说点实在的。我在模拟项目X里反复跑这些攻击时,最大的体会是:5G-AKA的核心矛盾不是“算法不够强”,而是“协议状态过度依赖双方长期保持一致的计数和序列号”。主动攻击者不需要破解密码,只要把状态搞乱,就能让合法用户和网络互相怀疑。韧性设计的价值,不是堆更多约束,而是让系统在状态被搞乱之后还能快速重新建立信任。

你可以把这些思路叠到自己的测试用例里,先做攻击树,再做针对性注入,最后把恢复动作写进架构而不是留给人肉排障。下一轮5G演进里,认证与密钥协商还会继续变形,但“把最坏情况提前想一遍”这个习惯,什么时候都不会过时。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询