好的,我们继续深入第六章的最后一节,这是一个看似简单却在密码学上至关重要的部分。我们已经有了坚固的认证机制(AKA)、层次分明的密钥体系(Key Hierarchy)以及清晰的上下文管理规则。现在,我们将聚焦于一个微小但关键的组件——一个32位的计数器,它在整个安全体系中扮演着“时间戳”和“新鲜度源泉”的双重角色。

本文将深度解析6.5节 Handling of NAS COUNTs (NAS COUNT的处理),揭示这个不起眼的计数器是如何成为防止重放攻击和避免灾难性密钥重用漏洞的核心。

深度解析 3GPP TS 33.401:6.5 NAS COUNT的处理机制

本文技术原理深度参考了3GPP TS 33.401 V18.3.0 (2025-03) Release 18规范中,关于“6.5 Handling of NAS COUNTs”的核心章节,旨在为读者阐明NAS COUNT在EPS安全中的双重关键作用,以及规范为何对其重置(reset)行为制定了极其严苛的规则,以防止致命的 keystream reuse 攻击。

在我们的主角“小明”的手机后台,有两个计数器在不知疲倦地“滴答”作响。一个是他手机里的上行NAS COUNT,每当手机要发送一条受保护的NAS信令给核心网时,它就加一;另一个是在核心网MME里为小明维护的下行NAS COUNT,每当MME要发送一条受保护的NAS信令给小明手机时,它也加一。

这两个看似简单的计数器,就是本节的主角。它们是EPS安全体系的“脉搏”,其跳动的规律性直接关系到整个通信信道的安全命脉。

1. “脉搏”的双重使命:NAS COUNT的关键作用

在深入规则之前,我们必须理解NAS COUNT为何如此重要。它在NAS安全中承担着两大核心使命:

  1. 抗重放攻击的“防火墙”NAS COUNT的核心组成部分是一个序列号(SQN)。接收方(UE或MME)会记录下一次期望收到的COUNT值。如果收到的消息中的COUNT值小于或等于已收到的最大值,那么这条消息将被视为一个“过时”的或“重复”的消息,并被丢弃。这可以有效防止攻击者截获一条合法的历史消息(比如一条“去附着”信令),并在未来的某个时间点重新发送给接收方,从而造成破坏。

  2. 密钥派生的“新鲜度源泉”:在6.2节的密钥体系中我们学到,空口基站密钥KeNB是由KASME和**上行NAS COUNT**一同派生出来的。NAS COUNT作为一个动态变化的输入参数,确保了即使在KASME保持不变的情况下,每次派生出的KeNB都是全新的、独一无二的。这个特性是防止“密钥流重用(keystream reuse)”攻击的根本保障。

2. 致命的威胁:密钥流重用 (Keystream Reuse)

在流密码(如SNOW 3G或AES-CTR)中,加密过程可以简化为 密文 = 明文 ⊕ 密钥流。解密过程则是 明文 = 密文 ⊕ 密钥流。这里的“密钥流”是由密钥和一些动态参数(如COUNT)生成的伪随机比特流。

如果因为某种原因,同一个密钥被用来加密两条不同的明文,那么攻击者只需要将两条截获的密文进行异或操作,就能得到两条明文异或的结果 (C1 ⊕ C2 = P1 ⊕ P2)。这虽然没有直接破解出明文,但已经泄露了大量的明文信息,对于经验丰富的密码分析者来说,这往往是破解的突破口。因此,在密码学中,密钥流重用被视为一种灾难性的漏洞。

在EPS中,空口加密的密钥流是由KeNB和空口COUNT生成的。如果UE和eNB两次使用了完全相同的KeNB,就极有可能在空口产生相同的密钥流,从而导致上述漏洞。而KeNB是由KASME和上行NAS COUNT派生的。

因此,所有问题的根源归结为一点:绝对不能让同一对 (KASME, NAS COUNT) 被使用两次来派生KeNB 这就是6.5节所有规则设计的根本出发点。

3. 核心原则:永不回头的时间之尺

为了避免上述灾难,规范开宗明义地提出了最核心、最严格的原则。

It is essential that the NAS COUNTs for a particular KASME are not reset to the start values (that is the NAS COUNTs only have their start value when a new KASME is created). This prevents the security issue of using the same NAS COUNTs with the same NAS keys, e.g. key stream re-use, in the case a UE moves back and forth between two MMEs and the same NAS keys are re-derived.

深度解读

  • 核心禁令:对于一个给定的KASME,与之关联的NAS COUNT绝对不能被重置回初始值。
  • 唯一例外NAS COUNT只有在一个全新的KASME被创建时,才能被赋予初始值。
  • 场景阐述:规范直接点出了最典型的危险场景——UE在两个MME之间来回移动。

场景串联(危险场景分析)

  1. 小明的手机在MME-A的覆盖区,当前的KASMEK1,上行NAS COUNT已经增长到100
  2. 小明移动到MME-B的覆盖区,通过上下文传递,MME-B获取了K1COUNT=100的状态。小明在MME-B下继续通信,COUNT增长到150
  3. 小明又回到了MME-A的覆盖区。如果此时MME-A没有从MME-B获取最新的COUNT=150的状态,而是错误地使用了自己本地缓存的旧状态COUNT=100,甚至更糟地将COUNT重置为0,会发生什么?
  4. 当小明的手机需要重新建立空口连接时,MME-A会使用 (K1, COUNT=0) 来派生KeNB。然而,在很久以前,当K1刚被创建时,(K1, COUNT=0) 这个组合已经被用来派生过一次KeNB了!
  5. 灾难发生:网络中出现了两个完全相同的KeNB,导致了密钥流重用,空口加密的安全性荡然无存。

因此,NAS COUNT必须像一把永不回拨的时间之尺,对于一个确定的KASME,它只能单调递增,贯穿其整个生命周期,无论UE在多少个MME、多少个eNB之间穿梭。

4. “归零”的合法时机:三大例外情况

既然NAS COUNT不能随意重置,那么它何时才能合法地“归零”呢?规范给出了三个且仅有的三个时机,它们的共同点是:一个全新的安全上下文(以及全新的KASME)即将诞生

The NAS COUNTs shall only be set to the start value in the following cases:

时机一:一次成功的原生AKA之后

  • for a partial native EPS NAS security context created by a successful AKA run,

深度解读:当UE和MME完成了一次全新的AKA认证后,会生成一个全新的、与之前毫无关联的KASME。既然“祖先”都是新的,那么它的“脉搏”自然可以从零开始计数。此时将NAS COUNT设为0是绝对安全的,因为 (新KASME, COUNT=0) 这个组合在历史上从未出现过。

时机二 & 三:从2G/3G切换或移动到4G之后

  • or for an EPS NAS security context created through a context mapping during a handover from UTRAN/GERAN to E-UTRAN,
  • or for an EPS NAS security context created through a context mapping during idle mode mobility from UTRAN/GERAN to E-UTRAN.

深度解读:当UE从2G/3G网络进入4G网络时,会创建一个“映射”的EPS安全上下文。这个过程会从旧的2G/3G密钥(CK, IK)派生出一个全新的映射K'ASME。与时机一的逻辑完全相同,既然K'ASME是全新的,那么为它关联的NAS COUNT也就可以安全地从0开始。

最后,规范明确了初始值:

The start value of NAS COUNT shall be zero (0).

总结三大“归零”规则:只有在新KASME(或K'ASME)诞生时,NAS COUNT才能重置为0。这确保了密钥派生的输入对 (KASME, NAS COUNT) 的唯一性。

5. 禁令的再次强调

为了杜绝任何模糊的理解,规范在最后再次用一条shall not语句,强调了在其他所有移动性场景下,NAS COUNT都必须保持其连续性。

The NAS COUNTs shall not be reset during idle mode mobility or handover for an already existing native EPS NAS security context.

深度解读:这条规则是第一条核心禁令在具体移动场景下的应用。当小明在同一个运营商网络内部的不同MME之间进行空闲态移动(idle mode mobility),或者在eNB之间进行切换(handover)时,如果传递的是一个已经存在的“原生”安全上下文(即KASME没有变),那么与这个KASME关联的NAS COUNT绝不能被重置。新的MME或eNB必须继承并延续使用旧的COUNT值。这正是确保NAS COUNTKASME生命周期内单调递增的关键。

6. 总结

6.5节虽然篇幅短小,但其内容在安全实践中具有至高无上的重要性。它为NAS COUNT这个关键的安全参数,制定了一套简单而极其有效的“铁律”:

  1. 一个KASME,一条单增的时间线:只要KASME不变,NAS COUNT就只能向前,绝不后退或归零。
  2. KASME,新纪元:只有在一次全新的、干净的上下文创建(通过原生AKA或跨系统映射)时,NAS COUNT才能伴随着新KASME的诞生,开启一个新的、从零开始的计数周期。

这套规则,从根本上杜绝了因移动性管理不当而导致的密钥流重用风险,是4G网络能够在极其复杂的移动场景下依然保持强大加密安全性的基石之一。它再次向我们展示了3GPP规范在安全设计上的严谨与深刻。

至此,我们完成了对第六章 Security Procedures between UE and EPC Network Elements 的全部解读。从下一篇文章开始,我们将进入第七章,将焦点从核心网侧的流程,进一步下沉到UE与接入网元(eNB)之间的具体安全交互过程。


FAQ 环节

Q1:NAS COUNT的具体结构是怎样的?它是一个简单的32位整数吗? A1:NAS COUNT在结构上比一个简单的整数要复杂一些。它是一个32位的数值,但通常由两部分拼接而成:一个高位的“溢出计数器”(NAS OVERFLOW)和一个低位的“序列号”(NAS SQN)。NAS SQN通常在每条NAS消息的头部携带,而NAS OVERFLOW则由UE和MME各自在内存中维护。当NAS SQN达到其最大值(例如255)后再次递增时,NAS OVERFLOW就会加一。这种设计可以在保证序列号唯一性的同时,减少信令的空中开销(因为不需要每次都传输完整的32位COUNT)。

Q2:如果NAS COUNT达到了32位的最大值,会发生什么? A2:这是一个被称为“回绕(wrap around)”的临界状态。规范要求MME必须能够监测到NAS COUNT即将回绕。在回绕发生之前,MME必须主动发起一次新的AKA认证流程,为UE建立一个全新的KASME。一旦新的KASME和安全上下文建立,与之关联的NAS COUNT就可以安全地重置为0,从而开始一个新的计数周期。这个机制确保了NAS COUNT永远不会在同一个KASME的生命周期内重复。

Q3:UE和MME是如何保证它们的NAS COUNT同步的? A3:UE和MME各自独立维护一对NAS COUNT:上行计数器和下行计数器。

  • **上行NAS COUNT**由UE维护。UE每发送一条上行NAS消息,就将此计数器加一,并将低位的NAS SQN放入消息头。MME收到后,会检查收到的SQN是否符合其预期,以此实现抗重放。
  • **下行NAS COUNT**由MME维护。MME每发送一条下行NAS消息,就将此计数器加一,并将NAS SQN放入消息头。UE收到后也会进行同样的检查。 它们之间的同步,是靠NAS完整性保护机制来保障的。如果攻击者篡改了SQN,完整性校验会失败。如果消息丢失,接收方会检测到SQN的不连续,从而发现丢包。

Q4:为什么派生KeNB时使用的是“上行”NAS COUNT,而不是下行或两者的某种组合? A4:这是一个非常精妙的设计,主要出于UE侧主动性和新鲜度保证的考虑。空口安全(AS Security)的建立,通常是由UE发起的一个动作触发的(如Service Request)。使用UE侧生成的、最新的上行NAS COUNT作为派生KeNB的输入,有几个好处:1) UE可控的新鲜度:UE是这个新鲜度参数的直接生成者,它能确保自己每次提供的都是一个未使用过的值。2) 信令流程匹配:当UE发送Service Request(携带新的上行NAS COUNT)来请求建立无线承载时,MME可以用同一个COUNT值来派生KeNB,流程非常自然。3) 避免信令往返:如果使用下行COUNT,可能需要MME先向UE发送一个包含新COUNT的消息,增加了建立连接的时延。

Q5:NAS COUNT和在空口PDCP层用于加密的COUNT是同一个东西吗? A5:不是。它们是两个完全独立、在不同协议层、用于不同目的的计数器。

  • NAS COUNT:在NAS层使用,长度32位,用于NAS信令的抗重放保护和KeNB的派生。它的增长与NAS信令的收发频率一致。
  • PDCP COUNT:在AS层的PDCP子层使用,长度也是32位(在LTE中),用于空口数据(包括RRC信令和用户数据)的加密和完整性保护算法。它的增长速度非常快,与RRC信令包和用户数据包的收发频率一致。 两者虽然都叫COUNT,但作用域和生命周期完全不同,切不可混淆。