5G认证与密钥协商:5G AKA协议流程、EAP-AKA'扩展、SUCI与隐私保护、密钥层次结构与派生
各位同学,今天我们来啃一块硬骨头——5G的认证与密钥协商。说实话,这部分内容在3G/4G时代就已经很复杂了,到了5G,因为引入了SBA架构和更强的隐私保护需求,整个流程又上了一个台阶。我在做5G核心网安全测试的时候,经常发现很多工程师对AKA流程的理解停留在「发几个消息就完事了」的层面,结果一遇到实际的信令交互问题就抓瞎。嗯,今天我们就把它彻底讲透。
5G AKA协议流程:从SEAF到AUSF再到UDM的三角博弈
5G AKA,全称是5G Authentication and Key Agreement。说白了,就是手机(UE)和网络之间互相确认身份,然后协商出一套加密密钥的过程。你想想看,如果这一步出了问题,后面所有的通信都是裸奔。
整个流程涉及三个核心网元:SEAF(安全锚点功能)、AUSF(认证服务器功能)和UDM(统一数据管理)。我习惯把SEAF看作是「守门员」,AUSF是「裁判」,UDM是「球员数据库」。为什么这么比喻?因为SEAF只负责转发认证请求,真正做决策的是AUSF,而UDM负责提供用户的长期密钥和认证向量。
流程大致如下:
- UE向SEAF发起注册请求,携带SUCI(后面会细讲)。
- SEAF一看,这哥们要认证,于是把请求转发给AUSF。
- AUSF再找UDM要认证向量。UDM根据SUCI解析出SUPI,然后生成一个包含RAND、AUTN、XRES*、KAUSF的认证向量。
- AUSF拿到向量后,自己再派生出一个KSEAF,然后把RAND和AUTN发给SEAF,SEAF再转发给UE。
- UE收到后,自己算一遍,如果AUTN验证通过,说明网络是真的。然后UE回复RES*。
- SEAF把RES*发给AUSF比对,如果一致,认证通过。
这里有个关键点:SEAF其实看不到用户的长期密钥,它只持有KSEAF。这种设计是为了防止SEAF被攻破后泄露用户核心密钥。我在项目中遇到过一种攻击场景,攻击者如果控制了SEAF,最多只能影响当前会话,拿不到用户的根密钥。这就是分层设计的妙处。
核心要点:5G AKA相比4G最大的变化是引入了AUSF作为独立的认证功能,实现了认证逻辑与接入网络的解耦。说白了,就是让专业的人干专业的事。
EAP-AKA'扩展:当5G需要对接非3GPP接入时
EAP-AKA',这个名字听起来有点绕。其实它就是EAP框架下的AKA协议变种。为什么要搞个「'」?因为5G需要支持非3GPP接入,比如Wi-Fi、卫星网络等。这些网络不认识标准的NAS消息,但都认识EAP。
我记得第一次在实验室调EAP-AKA'的时候,被那个「'」坑了一把。它和普通的EAP-AKA有什么区别?关键就在密钥派生上。EAP-AKA'在计算密钥时,多了一个网络标识符(Network Name)作为输入参数。这样做是为了防止「重定向攻击」——攻击者把用户从5G网络骗到一个假的Wi-Fi网络上,然后用同样的密钥去解密通信。
流程上,EAP-AKA'和5G AKA大同小异:
- UE和SEAF之间走EAP消息。
- SEAF把EAP消息封装在NAS里发给AUSF。
- AUSF内部完成AKA认证,然后通过EAP-Success告知结果。
你可能会问:为什么不用统一的AKA协议?原因很简单——非3GPP接入网可能根本不支持5G NAS协议栈。EAP就像一个万能适配器,什么网络都能接。我在做物联网终端接入测试时,就遇到过只支持EAP的模组,这时候EAP-AKA'就是唯一的选择。
避坑指南:我曾经在配置EAP-AKA'时忘记设置正确的Network Name,结果UE一直认证失败。后来抓包发现,UE算出来的密钥和网络侧对不上。所以,请务必确保UE和网络侧配置的Network Name完全一致,包括大小写。
SUCI与隐私保护:让攻击者找不到北
SUCI,全称Subscription Concealed Identifier。说白了,就是用户的「马甲」。在4G时代,UE直接发送IMSI(国际移动用户识别码)给网络,这简直是给攻击者送人头。攻击者只要在空口抓包,就能拿到用户的永久身份,然后进行位置追踪或者假冒。
5G怎么解决的?UE在发送身份之前,先用网络侧的公钥对SUPI(永久身份)进行加密,生成SUCI。加密算法用的是椭圆曲线加密(ECC),具体来说是HPKE(Hybrid Public Key Encryption)。
流程是这样的:
- UE从网络侧获取公钥(通过注册请求的响应或者预配置)。
- UE用公钥加密SUPI,加上一些元数据(比如加密算法标识、公钥标识),生成SUCI。
- 网络侧收到SUCI后,用私钥解密,得到SUPI。
这里有个细节:SUCI不是一成不变的。UE每次生成SUCI时,都会加入一个随机数(称为「加密盐」),所以即使同一个用户,每次生成的SUCI都不同。攻击者就算抓到了SUCI,也无法关联到同一个用户。
我在做隐私保护测试时,曾经尝试过用彩虹表去破解SUCI。结果发现,因为每次加密盐都不同,彩虹表根本没用。而且ECC的密钥长度是256位,暴力破解的时间复杂度是2^128,基本不可能。
注意事项:SUCI虽然保护了用户身份,但有一个前提——网络侧的公钥必须安全分发。如果公钥被篡改,攻击者可以冒充网络,让UE用攻击者的公钥加密SUPI,然后攻击者就能解密得到永久身份。所以,公钥的分发必须走HTTPS或者预配置在USIM卡中。
密钥层次结构与派生:从根密钥到会话密钥的层层保护
5G的密钥层次结构,我称之为「洋葱模型」——剥开一层还有一层。每一层密钥都只用于特定目的,即使某一层被攻破,也不会影响其他层。
整个层次从上到下是这样的:
| 密钥名称 | 存储位置 | 用途 | 派生依据 |
|---|---|---|---|
| K | USIM卡和UDM | 根密钥,永久不变 | 预置 |
| CK/IK | USIM卡和UDM | 加密密钥和完整性密钥 | 从K通过AKA算法派生 |
| KAUSF | AUSF和UE | 认证服务器密钥 | 从CK/IK派生 |
| KSEAF | SEAF和UE | 安全锚点密钥 | 从KAUSF派生 |
| KgNB | gNB和UE | 接入网密钥 | 从KSEAF派生 |
| KRRCenc/KRRCint | gNB和UE | RRC信令加密/完整性密钥 | 从KgNB派生 |
| KUPenc | gNB和UE | 用户面加密密钥 | 从KgNB派生 |
你发现没有?每一层派生都引入了新的参数,比如接入网标识、算法标识、会话随机数等。这样做的好处是:即使攻击者拿到了KgNB,也只能解密当前接入网的通信,无法回溯到KSEAF,更无法影响到其他接入网。
派生算法用的是HMAC-SHA-256或者AES-CMAC。我个人习惯用HMAC-SHA-256,因为它的安全性经过长期验证,而且实现起来不容易出错。
举个例子,从KSEAF派生KgNB的公式是:
K_gNB = KDF(K_SEAF, "5G-NAS-enc", gNB_ID, ABBA)
其中KDF是密钥派生函数,ABBA是Anti-Bidding-down Attack参数,防止攻击者诱导UE使用低版本算法。
实战经验:我在一次安全审计中发现,某个厂商的实现中,KgNB的派生没有包含gNB_ID。这意味着攻击者可以伪造一个gNB,然后用同样的KgNB去解密用户面数据。嗯,这属于典型的「密钥绑定缺失」漏洞。所以,请务必检查你的实现是否绑定了所有必要的上下文参数。
知识体系总览
下面这张图展示了本章的核心逻辑,从认证触发到密钥派生的完整链路:
好了,以上就是5G认证与密钥协商的核心内容。从AKA协议流程到EAP-AKA'的扩展,从SUCI隐私保护到密钥层次结构,每一步都环环相扣。你想想看,如果没有这些机制,5G网络的安全就无从谈起。下一节我们会深入探讨这些密钥在实际信令流程中是如何被使用的,以及攻击者可能利用的漏洞点。
个人建议:如果你刚开始接触5G安全,建议先动手搭建一个开源的核心网模拟环境(比如free5GC),然后抓包分析AKA流程的每条消息。纸上得来终觉浅,绝知此事要躬行。