4、IMS注册流程漏洞:注册劫持、注册耗尽攻击、P-Asserted-Identity欺骗、鉴权绕过
IMS注册流程,说白了就是用户向网络证明「我是谁」的过程。这个过程中涉及SIP信令交互、鉴权向量计算、身份头域传递等多个环节。任何一个环节出现设计缺陷或实现疏忽,都可能被攻击者利用。
我个人习惯把IMS注册漏洞分为四类:注册劫持、注册耗尽、PAI欺骗、鉴权绕过。这四类漏洞的利用思路不同,但最终目标都一样——让攻击者获得非法的网络接入权限。
4.1 注册劫持
注册劫持的核心思路是:攻击者冒充合法用户,向S-CSCF发送REGISTER请求,把自己的联系地址(Contact头域)注册上去。这样,后续发往该用户的呼叫或消息,就会被路由到攻击者控制的终端。
我在项目中遇到过一种典型场景:某运营商的IMS网络没有对REGISTER请求中的From头域和Authorization头域做一致性校验。攻击者可以构造一个REGISTER请求,From头域填受害者的URI,但Authorization头域用自己的凭证。S-CSCF只验证了Authorization的正确性,就把受害者的绑定关系更新成了攻击者的Contact地址。
防御手段其实不复杂:S-CSCF必须验证REGISTER请求中From头域的URI,与Authorization头域中的username参数一致。另外,网络侧应该支持「隐式注册」机制——当用户通过鉴权后,网络自动绑定该用户的公共身份和Contact地址,不接受客户端随意指定。
4.2 注册耗尽攻击
注册耗尽攻击属于拒绝服务类攻击。攻击者发送大量伪造的REGISTER请求,导致S-CSCF或HSS的处理资源被耗尽,合法用户无法完成注册。
你想想看,S-CSCF处理每个REGISTER请求都需要:解析SIP消息、查询用户状态、生成鉴权挑战、与HSS交互获取鉴权向量。这些操作都是计算密集型的。如果攻击者以每秒几千个请求的速率发起注册,S-CSCF很快就撑不住了。
我记得有一次在实验室做压力测试,一台中端配置的S-CSCF,在收到每秒5000个REGISTER请求时,CPU直接飙到100%,合法用户的注册响应时间从50毫秒变成了15秒。
防御注册耗尽攻击,我建议从三个层面入手:
- 网络层: 在P-CSCF或SBC上做源IP限速,每个IP每秒最多允许N个REGISTER请求
- 协议层: 对未鉴权的REGISTER请求,S-CSCF只生成挑战并返回401,不查询HSS
- 应用层: 引入CAPTCHA或动态令牌机制,增加自动化攻击的成本
4.3 P-Asserted-Identity欺骗
P-Asserted-Identity(PAI)是IMS网络中的一个信任头域。它由网络侧(P-CSCF或S-CSCF)插入,用于标识经过鉴权的主叫身份。问题是,如果网络侧没有正确删除或覆盖用户提供的PAI头域,攻击者就可以在请求中伪造PAI,实现主叫号码欺骗。
说白了,PAI的设计前提是「网络侧可信」。但如果P-CSCF的实现有缺陷,没有删除用户发来的PAI头域,那么下游节点就会信任这个伪造的身份。
我在某厂商的IMS设备上发现过一个具体案例:该P-CSCF在处理INVITE请求时,只检查了是否已有PAI头域,如果有就直接透传,没有做覆盖。攻击者可以在INVITE请求中插入一个伪造的PAI,内容为任意合法用户的号码。下游S-CSCF看到PAI已经存在,就不再插入新的PAI,直接转发。结果被叫侧显示的主叫号码就是伪造的。
防御PAI欺骗的标准做法是:P-CSCF必须无条件删除用户侧发来的所有PAI头域,然后根据鉴权结果重新插入正确的PAI。S-CSCF也应该校验PAI与鉴权身份的一致性。
4.4 鉴权绕过
鉴权绕过是IMS注册漏洞中危害最大的一类。攻击者完全跳过鉴权流程,直接以合法用户的身份注册成功。
常见的鉴权绕过方式有几种:
| 攻击方式 | 原理 | 利用条件 |
|---|---|---|
| 空鉴权 | REGISTER请求中不携带Authorization头域,S-CSCF直接接受 | S-CSCF配置错误,允许无鉴权注册 |
| 重放攻击 | 截获合法的REGISTER请求,重放给S-CSCF | S-CSCF未校验nonce的唯一性或时效性 |
| 算法降级 | 强制使用弱鉴权算法(如MD5),然后暴力破解 | S-CSCF支持多种算法,且未强制要求强算法 |
| SQN同步绕过 | 利用序列号同步机制,让HSS接受旧的鉴权向量 | HSS的SQN校验逻辑有缺陷 |
嗯,这里要注意空鉴权的问题。虽然3GPP标准明确要求REGISTER必须经过鉴权,但某些厂商的S-CSCF在特定配置下(比如内部测试环境),会允许无鉴权的注册请求进入生产网络。我见过一个案例:某运营商的IMS核心网升级后,新版本的S-CSCF默认配置中有一个参数叫「AllowUnauthenticatedRegister」,默认值是True。结果上线后,任何人都可以用任意号码注册。
对于重放攻击的防御,关键是nonce的生成和校验。nonce必须包含时间戳或序列号,并且S-CSCF要维护一个nonce使用记录表,每个nonce只能使用一次。另外,nonce的有效期不宜过长,我建议设置为5分钟以内。
4.5 知识体系总览
下面这张图展示了IMS注册流程漏洞的完整知识体系。你可以看到,四类漏洞分别对应注册流程的不同环节:
从图中可以看出,四类漏洞的防御思路各有侧重,但都围绕一个核心原则:不信任任何来自用户侧的身份声明,所有身份信息必须经过网络侧的鉴权验证。
好了,关于IMS注册流程的四个核心漏洞就讲到这里。这些漏洞在实际现网中并不少见,尤其是PAI欺骗和鉴权绕过,我几乎在每个运营商的IMS网络中都发现过类似问题。理解它们的原理和防御方法,是做好IMS安全的基础。