2、SS7信令系统:SS7协议栈架构、MTP层、SCCP层、TCAP层、MAP协议基础
聊到核心网漫游攻击,SS7信令系统是绕不开的“老熟人”。
说实话,SS7这套东西设计于上世纪70、80年代,那时候互联网还没影呢。它骨子里就带着“信任”的基因——所有运营商之间默认是兄弟,互相不设防。结果呢?现在成了攻击者最爱的突破口。
我个人习惯,讲SS7一定要从协议栈开始。你只有看懂了每一层在干什么,才能明白攻击到底打在了哪里。
2.1 SS7协议栈架构
SS7协议栈,说白了就是一套分层打电话的“规矩”。它跟OSI七层模型有点像,但更精简,也更“电信”。
我画了一张图,帮你把这几层的关系理清楚:
这张图你得记住。每次分析攻击报文,我脑子里都会浮现这个分层结构。攻击者往往从上层(MAP)下手,但最终都要落到下层(MTP)去传输。
2.2 MTP层——信令的“高速公路”
MTP层,全称Message Transfer Part,消息传递部分。它负责把信令消息从一个节点可靠地搬到另一个节点。
MTP分三层:
- MTP-1(物理层):说白了就是线缆。传统上是64kbps的E1/T1时隙,现在很多已经IP化了(M3UA/SIGTRAN)。
- MTP-2(数据链路层):负责帧定界、差错检测、重传。它保证“这条链路上传的东西不会丢”。
- MTP-3(网络层):这是核心。它负责信令路由——根据DPC(目的信令点编码)把消息送到正确的目的地。
关键概念:信令点编码(SPC)
每个信令节点都有一个唯一的SPC,类似于IP地址。MTP-3就是靠SPC来路由的。
格式:3-8-3结构(中国常用14位编码),或者24位编码(北美标准)。
我在项目中遇到过一件事。有一次排查漫游失败,发现HLR一直收不到位置更新请求。抓包一看,MTP-3层的DPC写错了——源端把DPC配成了隔壁省的编码。消息发错了地方,当然没响应。这种问题,MTP层不熟根本查不出来。
2.3 SCCP层——让寻址更灵活
MTP只能根据SPC寻址,但SPC是固定的。你想想看,一个手机用户漫游到外地,他的HLR在归属地,MSC怎么知道HLR的SPC?
这时候就需要SCCP(Signalling Connection Control Part)出场了。
SCCP在MTP之上提供两种能力:
- 全局码(GT)翻译:用手机号(MSISDN)或IMSI来寻址,而不是用SPC。SCCP负责把GT翻译成SPC,再交给MTP-3发送。
- 子系统号(SSN):标识同一个信令点上的不同应用。比如HLR的SSN是6,MSC的SSN是8,VLR的SSN是7。
避坑指南
我曾经在配置SCCP GT翻译表时踩过坑。翻译规则如果配成“按最长匹配”,结果把+8613800138000翻译到了错误的HLR。后来我养成了习惯——GT翻译一定要做“逐位匹配测试”,尤其是国际漫游场景,前缀变化多,稍不留神就翻错。
SCCP的消息类型主要有两种:
- UDT(单元数据):无连接模式,发出去就不管了。大多数MAP消息都用这个。
- XUDT(扩展单元数据):带分段功能,适合大消息。
攻击者经常利用SCCP的GT翻译做文章。比如伪造一个GT,让SCCP把消息路由到攻击者控制的信令点。这就是典型的“SCCP劫持”。
2.4 TCAP层——事务的“管家”
TCAP(Transaction Capabilities Application Part),事务能力应用部分。它负责管理应用层消息的“对话”。
举个例子:MSC发一个位置更新请求给HLR,HLR处理完后回复一个响应。这个“请求-响应”的配对,就是由TCAP来维护的。
TCAP的核心概念:
- 事务ID:每个对话分配一个唯一ID,源端和目的端各有一个。通过事务ID,TCAP能把请求和响应关联起来。
- 组件(Component):真正承载业务逻辑的部分。比如Invoke(调用)、Return Result(返回结果)、Return Error(返回错误)、Reject(拒绝)。
TCAP消息结构(简化)
TCAP消息
├── 事务部分(Transaction Portion)
│ ├── 源事务ID(Originating Transaction ID)
│ └── 目的事务ID(Destination Transaction ID)
└── 组件部分(Component Portion)
├── Invoke(调用操作)
│ ├── 操作码(Operation Code)
│ └── 参数(Parameters)
└── Return Result(返回结果)
├── 调用ID(Invoke ID)
└── 结果参数
TCAP层有一个经典攻击手法——事务ID重放攻击。攻击者截获一个合法的事务ID,然后伪造一个恶意响应发回去。HLR一看事务ID对得上,就信了。嗯,这里要注意,TCAP本身没有任何认证机制,全靠下层网络信任。
2.5 MAP协议基础——漫游的“灵魂”
MAP(Mobile Application Part),移动应用部分。它是SS7协议栈最上层,直接承载了所有移动业务逻辑。
MAP协议定义了移动网络中各网元之间的交互流程。比如:
- 位置更新:MSC/VLR → HLR
- 取路由信息:GMSC → HLR
- 短消息转发:SMS-IWMSC → HLR → MSC
- 补充业务操作:激活/去激活呼叫转移等
MAP操作通过TCAP的Invoke组件来调用。每个操作都有一个唯一的操作码(Operation Code)。
| 操作名称 | 操作码(十进制) | 说明 |
|---|---|---|
| updateLocation | 2 | 位置更新 |
| sendRoutingInfo | 22 | 取路由信息 |
| sendAuthenticationInfo | 56 | 请求鉴权向量 |
| insertSubscriberData | 7 | 插入用户数据 |
| provideRoamingNumber | 4 | 请求漫游号码 |
安全警告
MAP协议在设计时没有考虑任何安全机制。所有操作都是“裸奔”的。攻击者只要能够接入SS7网络,就可以伪造任意MAP操作。
比如伪造一个insertSubscriberData,把用户的呼叫转移号码改成攻击者的号码。所有来电都会被转走。这就是典型的SS7攻击。
我记得有一次做安全审计,发现某运营商的HLR竟然接受来自非信任MSC的updateLocation请求。这意味着任何人都可以伪造一个位置更新,告诉HLR“用户在我这里”。HLR信了,就把用户的位置信息改了。后果是什么?用户的所有呼叫和短信都会被路由到攻击者指定的MSC上。
这种攻击,说白了就是MAP层没有任何源端验证。HLR收到一个MAP请求,它只看GT和SSN对不对得上,从来不问“你是谁?你凭什么发这个请求?”
所以,防护SS7攻击,核心思路就是打破这种“无条件信任”。在MTP层做白名单路由过滤,在SCCP层做GT翻译校验,在MAP层做操作权限检查。每一层都加一道锁,攻击者就没那么容易得手了。
个人经验
我建议你在学习SS7协议时,不要只背协议栈结构。拿Wireshark抓一个真实的MAP消息,一层一层剥开看。MTP-3的DPC是什么?SCCP的GT是什么?TCAP的事务ID是多少?MAP的操作码是哪个?看懂了真实报文,比看十遍书都管用。
公众号:蓝海资料掘金营,微信deep3321