首页 › security › 5G安全模式命令SMC机制拆解

5G 双层安全模式命令(NAS/AS SMC)信令机制全链拆解

一、引言:认证成功,不等于"已上锁"

很多工程师对 5G 安全的第一印象停留在"5G AKA 认证完成、KAMF 算出来就安全了"。这是一个危险的误解。认证流程(TS 33.501 Section 6.1)只是让网络与 UE 共享了一个根密钥 KAMF,并互相确认了身份;但此时空口的 NAS 信令、RRC 信令、用户面数据全部仍是明文、未完整性保护的裸奔状态。从"握有一把钥匙"到"真正把门锁上",中间还差两个关键动作——NAS 安全模式命令(NAS SMC) 与 AS 安全模式命令(AS SMC)。

这正是本文聚焦的核心机制。它定义在 3GPP TS 33.501(5G 安全架构)Section 6.6 / 6.7、TS 24.501(5GMM)Section 5.4.2、TS 38.331(NR RRC)Section 5.3.4 三份规范里。理解双层 SMC,本质上是理解 5G 安全上下文如何被"激活"、算法如何协商、密钥如何分层推演、以及规范如何用一招"回放 UE 安全能力"来抵御降级攻击。

本文将按"触发时机 → NAS 层握手 → AS 层握手 → 密钥推演 → 防降级 → 抓包识别 → 排错"的顺序,把这条安全激活链路完整拆开。


二、双层 SMC 在 5G 系统中的定位

2.1 两条 SMC,各管一摊

5G 的安全在协议栈上被刻意拆成两层,分别由不同的网络功能激活:

维度 NAS SMC AS SMC
规范定位 TS 33.501 §6.7.2 / TS 24.501 §5.4.2 TS 33.501 §6.6 / TS 38.331 §5.3.4
信令发起方 AMF(核心网) gNB(接入网)
保护对象 UE↔AMF 的 NAS 信令 UE↔gNB 的 RRC 信令 + 用户面数据
依赖输入密钥 KAMF KgNB(由 KAMF 推演)
激活的密钥 KNASint、KNASenc KRRCint、KRRCenc、KUPint、KUPenc
触发时机 鉴权成功后;或切换/重激活场景 AMF 下发 Initial Context Setup 后

这种"NAS 安全由 AMF、AS 安全由 gNB 各自激活"的分工,是 5G 相对 4G 的重要演进:4G 中 MME 与 eNB 同样分层,但 5G 进一步强化了"AS 安全必须在 NAS 安全建立之后才激活"的时序约束,从而把空口密钥与核心网安全状态绑定,提升整条链路的抗攻击能力。

2.2 触发时机:注册流程中的精确位置

在初始注册场景中,双层 SMC 的位置非常固定。下表给出 TS 23.502 Section 4.2.2.2(注册流程)中安全相关步骤的真实排布:

flowchart TD
    A["1. Registration Request<br/>(UE→AMF, 无保护)"] --> B["2. 5G AKA 鉴权<br/>(产生 KSEAF → AMF 推 KAMF)"]
    B --> C["3. NAS Security Mode Command<br/>(AMF→UE, 完整性保护, 不加密)"]
    C --> D["4. NAS Security Mode Complete<br/>(UE→AMF, 完整性+加密)"]
    D --> E["5. Initial Context Setup Request<br/>(AMF→gNB, 携带 UE 安全能力+KAMF)"]
    E --> F["6. AS Security Mode Command<br/>(gNB→UE, RRC 完整性保护, 不加密)"]
    F --> G["7. AS Security Mode Complete<br/>(UE→gNB, RRC 完整性保护)"]
    G --> H["8. Registration Accept<br/>(AMF→UE, NAS 加密, 经已加密 RRC 传输)"]

注意一个关键约束:AS 安全绝不会先于 NAS 安全激活。AMF 必须先与 UE 完成 NAS SMC,确认 NAS 层已上锁,才会触发 Initial Context Setup 把安全上下文交给 gNB。这条时序是 TS 33.501 §6.1.1 强制要求的,目的是避免"空口已加密但核心网认证未完成"这种半安全状态被攻击者利用。


三、NAS 安全模式命令(NAS SMC)全链拆解

3.1 完整信令时序

sequenceDiagram
    participant UE
    participant AMF
    Note over UE,AMF: 前置:5G AKA 已完成,双方持有 KAMF<br/>ngKSI = 5G key set identifier
    AMF->>UE: 算法选择(依据 UE 安全能力 + 网络配置优先级)
    Note over AMF: 由 KAMF 经 KDF 推 KNASint / KNASenc
    AMF->>UE: NAS Security Mode Command
    Note right of AMF: IE: ngKSI, Selected NAS Security Algorithms,<br/>Replayed UE Security Capability,<br/>Additional 5G Security Info,<br/>(IMEISV Request)<br/>本条消息:用 KNASint 完整性保护,不加密
    UE->>UE: 校验完整性<br/>校验回放能力是否匹配<br/>校验所选算法是否在能力内
    alt 校验通过
        UE->>UE: 推 KNASint / KNASenc,挂载安全上下文
        UE->>AMF: NAS Security Mode Complete
        Note left of UE: 首条 加密+完整性 保护的上行 NAS<br/>(可携带 IMEISV)
    else 校验失败
        UE->>AMF: NAS Security Mode Reject
        Note left of UE: 进入 MM-DEREGISTERED,安全上下文作废
    end

3.2 关键 IE 逐项解读

IE 名称 所在消息 作用 取值/备注
ngKSI SMC 指明本次安全上下文对应的 KAMF(native 或 mapped) 0~6(值 7 保留)
Selected NAS Security Algorithms SMC 选定的 NAS 完整性 + 加密算法 如 NIA2/NEA2
Replayed UE Security Capability SMC 把 UE 在 Registration Request 中上报的安全能力原样回放 5GS + E-UTRA + 其他接入能力全集
Additional 5G Security Information SMC UE 应额外允许的算法集(防降级补强) 可选
IMEISV Request SMC 请求 UE 在 Complete 中返回 IMEISV 可选
IMEISV Complete 终端全球唯一标识(含软件版本) 受加密保护

重点 IE 一:Replayed UE Security Capability(防降级核心)

这是整个 NAS SMC 设计中最值得玩味的一笔。UE 在 Registration Request 里上报自己的安全能力时,那条消息是没有任何保护的——攻击者完全可以做中间人,把 UE 支持的强算法(如 NEA3)篡改成"只支持 NEA0 空算法",诱骗 AMF 选择弱算法。

规范给出的解法是:AMF 在已被完整性保护的 SMC 消息里,把 UE 当初上报的安全能力原样"回放"回去。UE 收到 SMC 后,会把"回放的能力"与"自己真正上报的能力"逐比特比对。一旦不一致,UE 立刻判定遭到篡改,发起 Reject。由于 SMC 本身有 KNASint 完整性保护,攻击者无法再篡改这条回放内容——降级攻击的窗口由此被关死。

重点 IE 二:SMC 消息本身的保护方式

这是一个反复被问倒工程师的细节:NAS SMC 用了完整性保护,但没有加密。原因很直观——这条消息里携带的是"UE 接下来要用哪个加密算法"。如果连这条消息本身都加密,UE 还没算出 KNASenc、还没确定算法,根本无从解密,会陷入鸡生蛋的死循环。所以规范规定 SMC 只完整性保护、不加密;而紧接着的 Security Mode Complete 才是第一条"加密 + 完整性"双重保护的上行 NAS 消息。

flowchart LR
    subgraph SMC下行["NAS SMC(下行)"]
        A1["完整性保护: ON (KNASint + NIAx)"] --- A2["加密: OFF"]
    end
    SMC下行 --> Complete上行
    subgraph Complete上行["NAS Security Mode Complete(上行)"]
        B1["完整性保护: ON"] --- B2["加密: ON (KNASenc + NEAx)"]
    end
    Complete上行 --> 后续
    subgraph 后续["后续所有 NAS 信令"]
        C1["完整性 + 加密 全程开启"]
    end

四、AS 安全模式命令(AS SMC)全链拆解

4.1 从 NAS 到 AS 的密钥交接

AS SMC 的触发来自 AMF 下发的 Initial Context Setup Request(N2 消息)。这条请求里,AMF 会把两样东西交给 gNB:UE Security Capability(UE 支持的算法集)和 KAMF(核心网根密钥的 AS 端入口)。gNB 拿到 KAMF 后,先推演出 KgNB,再独立完成 AS 算法选择与激活。

sequenceDiagram
    participant UE
    participant gNB
    participant AMF
    AMF->>gNB: Initial Context Setup Request<br/>(携带 UE Security Capability + KAMF)
    Note over gNB: KgNB = KDF(KAMF, 上行 NAS COUNT)<br/>选定 AS 算法 → 推 KRRCint/enc, KUPint/enc
    gNB->>UE: RRC Security Mode Command (TS 38.331)
    Note right of gNB: IE: securityConfig → securityAlgorithmConfig<br/>本条: RRC 完整性保护(KRRCint), 不加密
    UE->>UE: 校验完整性<br/>校验算法是否在能力内<br/>校验所选算法 >= NAS 已选算法(防降级)
    UE->>UE: 推 AS 各密钥, 激活 RRC 完整性+加密、UP 完整性+加密
    UE->>gNB: RRC Security Mode Complete
    Note left of UE: 完整性保护, 不加密
    Note over gNB,UE: 此后 RRC 与用户面进入 完整性+加密 全保护状态

4.2 AS SMC 的两个硬约束

约束一:RRC 信令完整性保护永远开启。TS 33.501 §6.6.1.1 明确规定,NR 的 RRC 信令不允许使用空完整性算法(NIA0)。这与 NAS 层允许在"未认证紧急呼叫"时使用 NEA0/NIA0 形成鲜明对比——接入网层面不留这个口子。

约束二:用户面完整性保护必须被支持。这是 5G 相对 4G 的重大安全增强。4G 时代用户面只有加密、无完整性,导致"篡改用户面数据"成为现实威胁。NR 强制要求终端与网络都支持 KUPint,在多数商用配置中 UP 完整性默认开启,从而堵上了空口用户面篡改的漏洞。

约束三:AS SMC 同样只完整性保护、不加密。原理与 NAS SMC 一致:消息里携带算法选择,必须让 UE 明文读到。


五、密钥层级与 KDF 推演全图

flowchart TD
    K["K (USIM 永久根密钥)"] --> KA["5G AKA / EAP-AKA'"]
    KA --> KSEAF["KSEAF<br/>(AUSF→SEAF, TS 33.501 A.5)"]
    KSEAF --> KAMF["KAMF<br/>(SEAF→AMF, A.6, FC=0x6C)"]
    KAMF -->|"FC=0x69, dist=0x16"| KNI["KNASint (NIA)"]
    KAMF -->|"FC=0x69, dist=0x15"| KNE["KNASenc (NEA)"]
    KAMF -->|"FC=0x6E, 输入=上行NAS_COUNT"| KgNB["KgNB (A.6)"]
    KgNB -->|"FC=0x69, dist=0x18"| KRI["KRRCint"]
    KgNB -->|"FC=0x69, dist=0x17"| KRE["KRRCenc"]
    KgNB -->|"FC=0x69, dist=0x1A"| KUI["KUPint"]
    KgNB -->|"FC=0x69, dist=0x19"| KUE["KUPenc"]

5.1 KDF 通用结构(TS 33.220 Annex B.2)

5G 所有密钥推演都基于同一个 HMAC-SHA-256 框架:

Key = HMAC-SHA-256( Key_in , S )
S  = FC || L0 || P0 || L1 || P1 || ... || Ln || Pn

其中 FC 是函数码(1 字节),Pi 是输入参数,Li 是 Pi 的长度(2 字节大端)。双层 SMC 相关的两个关键 FC:

dist 值 推演目标 父密钥
0x15 KNASenc KAMF
0x16 KNASint KAMF
0x17 KRRCenc KgNB
0x18 KRRCint KgNB
0x19 KUPenc KgNB
0x1A KUPint KgNB

算法标识 alg_id 中,128-NEA1=1、128-NEA2=2、128-NEA3=3、128-NIA1=1、128-NIA2=2、128-NIA3=3;NEA0/NIA0=0 为空算法。


六、算法选择与防降级(Anti-Bidding-Down)

6.1 网络侧算法选择逻辑

无论是 AMF 选 NAS 算法,还是 gNB 选 AS 算法,遵循同一套规则(TS 33.501 §6.7.3):

  1. 取"网络本地配置的允许算法优先级列表"与"UE 上报安全能力"的交集;
  2. 在交集中按网络优先级选最高的一对(完整性算法 + 加密算法);
  3. 特例:仅"未认证紧急呼叫"可使用 NEA0/NIA0 空算法。

商用网络最常见组合是 128-NEA2(基于 AES)+ 128-NIA2,因其性能与安全兼顾、且有硬件加速支持;高安全场景会叠加 128-NEA3(基于 ZUC)。

6.2 三道防降级闸门

5G 在双层 SMC 中布下了三道互相印证的闸门,使中间人降级攻击极难得手:

闸门 机制 作用
闸门 1 NAS SMC 内回放 UE 安全能力 检测 Registration Request 阶段的能力篡改
闸门 2 AS 所选算法不得弱于 NAS 所选算法 UE 校验,防止接入网被降级到弱算法
闸门 3 UP 完整性保护强制支持 防止用户面数据被静默篡改

其中闸门 2 是一个常被忽略的细节:UE 在校验 AS SMC 时,会比较 gNB 选的 AS 算法强度与此前 NAS 已激活的算法强度。若发现"NAS 用 NEA2、AS 却被降到 NEA0",UE 有理由怀疑接入网链路被劫持,可据此拒绝。这条逻辑把 NAS 与 AS 的安全等级耦合起来,大幅压缩了攻击面。


七、抓包识别:如何在 Wireshark 里认出双层 SMC

实战中,工程师最常在 NGAP/NAS/RRC 联合抓包里定位安全激活。关键判据:

一个快速排错口诀:鉴权过、NAS SMC 过、却卡在 AS SMC → 优先查 gNB 是否收到 KAMF、UE 安全能力是否被正确传递;NAS SMC 都没到 → 回头看鉴权链路或 AMF 算法配置。


八、常见故障点与排错思路

故障现象 根因方向 排错动作
UE 回 NAS Security Mode Reject 回放能力不匹配;或所选算法 UE 不支持 核对 UE 上报能力、AMF 算法配置、排除中间人篡改
卡在 AS SMC,RRC 不 Complete gNB 未收到 KAMF/UE 安全能力;算法交集为空 查 NGAP Initial Context Setup 字段;查 gNB 算法许可列表
SMC 后仍可明文看到后续 NAS 加密实际未生效(NEA0 误配) 检查是否误启用空算法;紧急呼叫外禁用 NEA0/NIA0
切换后掉话/鉴权异常 KgNB 未随上行 NAS COUNT 刷新,密钥重用 核对 NAS SMC 触发与 key refresh 流程
IMEISV 一直收不到 SMC 未带 IMEISV Request,或 UE 拒绝 确认 AMF 策略与 UE 实现是否支持 IMEISV 上报

8.1 经典故障:空算法误开导致的"假安全"

某局点曾出现"抓包看到 NAS SMC 成功,但后续信令仍明文"。排查发现 AMF 在非紧急场景误配了 NEA0,导致名义上握手成功、实际未加密。这是闸门 1/2 失守的典型——既未触发 UE 拒绝(因 UE 也声明支持 NEA0),又失去保护。修复:AMF 侧将 NEA0/NIA0 限定为仅紧急呼叫可用,强制商用流程选 NEA2 及以上。


十、常见问题

Q1:NAS SMC 与 AS SMC 为什么必须分开、不能合并成一条? A:因为两层由不同的网络功能负责、保护不同的协议栈:NAS 层由 AMF 端到端保护 UE↔AMF 信令,AS 层由 gNB 保护 UE↔gNB 的 RRC 与用户面。二者密钥链路不同(KAMF vs KgNB)、生命周期不同(NAS 安全跨 gNB 切换保持,AS 安全随 gNB 变化而刷新)。合并会破坏这种分层解耦,也会让"AS 弱于 NAS"的防降级校验失去意义。

Q2:为什么 NAS SMC 消息只完整性保护、不加密? A:因为消息里携带"选定加密算法"和"回放的安全能力",UE 必须先明文读到这些信息,才能算出 KNASenc 并完成校验。若对 SMC 加密,UE 会陷入"无算法无法解密、无解密无法获知算法"的循环。规范把"加密生效"推迟到第一条上行 NAS Security Mode Complete。

Q3:NEA0/NIA0 空算法在 5G 里还有用吗? A:有,但被严格限定。它仅允许用于"未认证的紧急呼叫",使未插卡或鉴权失败的终端也能拨打紧急电话。除此以外的商用流程严禁使用,否则会触发降级风险。NR 的 RRC 层面更是完全禁止 NIA0,RRC 完整性永远开启。

Q4:KgNB 推演为什么要带"上行 NAS COUNT"? A:为了把 AS 密钥与 NAS 状态机绑定,保证每次 NAS SMC(每次安全激活)都产生全新的 KgNB,从源头杜绝密钥重用。这是一种前向安全强化——即便某次 KgNB 泄露,也无法回溯或横向复用到其他会话。

Q5:抓包时看到 NAS SMC 成功,但之后报文还是明文,问题在哪? A:几乎可断定是空算法(NEA0)被误启用,造成"握手成功但未加密"的假安全。应立即核查 AMF/gNB 算法许可列表,将 NEA0/NIA0 限定为仅紧急呼叫,并强制商用流程选用 NEA2/NIA2 及以上。


参考来源

  1. 3GPP TS 33.501 V18.10.0 — Security architecture and procedures for the 5G system — §6.6(AS 安全)、§6.7(NAS 算法选择与 SMC)、Annex A.6/A.7(密钥推演)
  2. 3GPP TS 38.331 V18.6.0 — NR Radio Resource Control (RRC) — §5.3.4 安全模式激活、§6.2.2 SecurityModeCommand 消息
  3. 3GPP TS 24.501 — Non-Access-Stratum (NAS) protocol for 5GS — §5.4.2 NAS Security Mode Control 过程
  4. 3GPP TS 33.220 — Generic Authentication Architecture; Generic key agreement and key derivation — Annex B.2 通用 KDF
  5. 5G NAS Security Mode Procedure Call Flow — 3glteinfo.com — 流程图与消息字段实战解读
  6. 5G NR Security Mode Command (RRC Message) — 3glteinfo.com — AS SMC 消息结构详解

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入