2019年9月,AdaptiveMobile Security披露了一种针对SIM卡上S@T Browser应用的远程攻击方法,被称为“Simjacker”。攻击者通过向目标手机发送一条精心构造的短信,就能实现远程定位等操作,潜在危害巨大。鉴于SIM卡的普遍使用,其安全问题影响范围极广。据当时估算,全球可能有超过10亿台设备的SIM卡易受此攻击。本文将对SIM Jacker的攻击原理进行一次较为深入的技术分析。
一、背景知识:短信是如何发送的?
在深入了解攻击之前,我们需要对移动通信的基本框架有所认识。GSM(全球移动通信系统)是由ETSI制定的第二代(2G)数字蜂窝移动通信标准,其信令和语音信道均为数字式,俗称“全球通”。
短信(Short Message Service, SMS)是基于GSM网络的核心服务之一。其发送流程主要涉及三个主体:发送者、短信中心(SMSC)和接收者。短信必须经由短信中心转发才能到达接收者的SIM卡。

具体步骤简述如下:
- 发送者编辑短信,通过无线信号发送至附近基站。
- 基站将消息经一系列网元处理,转发至运营商的短信服务中心。
- 短信服务中心处理后,将数据转发至接收者附近的基站。
- 接收者附近的基站将短信内容发送给接收者。
二、PDU模式短信格式解析
GSM收发短信主要有三种模式:BLOCK模式(已很少使用)、TEXT模式(仅支持ASCII码)和PDU模式。PDU模式虽然编解码复杂,但被所有手机支持,且能使用任何字符集(如发送中文),是手机的默认编码方式。
下面以一个实际的十六进制PDU串为例进行分解:
0891683108200805F011190D91683188902848F40008FF108FD9662F4E0067616D4B8BD577ED4FE1
这条PDU可以被拆解为以下部分:
- 短信中心地址 (SCA):
0891683108200805F0
- First Octet (FO):
11
- 消息参考值 (MR):
19
- 接收者号码 (DA):
0D91683188902848F4
- 协议标识 (PID):
00
- 数据编码方案 (DCS):
08
- 有效期 (VP):
FF
- 用户数据长度 (UDL):
10
- 用户数据 (UD):
8F......E1
关键字段详解:
-
First Octet字段: 此字段至关重要,每位都有特定含义。将十六进制11转换为二进制00010001,从最低位(右)开始解读:
- 位1-2 (MTI):
01,表示此为SMS-SUBMIT(从移动设备发往短信中心)。00则表示SMS-DELIVER(从短信中心发往设备)。
- 位3 (RD):
0,表示不接收重复消息。
- 位4-5 (VP):
10,表示使用相对有效期。
- 位6 (SSR):
0,不请求状态报告。若为1,则要求短信中心返回送达报告,此特性曾被用于定位研究。
- 位7 (UDHI):
0,表示用户数据为普通短信。若为1,则表示用户数据包含头信息,这正是OTA消息(如SIM Jacker利用的)的关键标志。
- 位8 (RP):
0,设置回复路径。

-
数据编码方案 (DCS): 08 表示使用UCS2编码,可用于发送中文等Unicode字符。00为7-bit编码(英文),04为8-bit编码。
三、动手实验:在Android设备上发送PDU短信
理解了PDU格式后,我们如何实际发送一条呢?最直接的方法是使用GSM模块。为了方便实验,这里使用一台已获取Root权限的Android手机(例如魅族M3 note)进行演示。
首先,确保通过ADB连接并已获得Root权限。


在Linux内核的Android系统中,一切皆文件,SIM卡通信接口也被映射为一个设备文件。我们需要先找到这个文件。可以通过监控Radio日志来定位:
logcat -b radio | grep dev
插入SIM卡后,日志会输出大量信息,从中可以找到SIM卡映射的设备节点(例如/dev/pts/4)。

找到设备后,由于不同设备对AT命令换行符的要求可能不同,需要测试正确的格式:
echo -e "AT+COPS?\n" > /dev/pts/4

确定格式后,即可发送一条测试短信:
echo -e "AT+CMGF=0\n" > /dev/pts/4 # 设置为PDU模式
echo -e "AT+CMGS=20\n" > /dev/pts/4 # 设置PDU数据长度
echo -e "0031000D9168xxxxxxxxxxxx00000005E8329BFD06\032\n" > /dev/pts/4 # 发送PDU数据,\032代表Ctrl+Z(结束符)
四、SIM Jacker攻击原理剖析
铺垫了以上基础知识后,现在可以深入探究SIM Jacker攻击的核心。
(1)OTA消息:攻击的载体
OTA(空中下载)消息,也称为二进制消息,是一种特殊的APDU消息,其中包含一组针对SIM卡内特定应用(如USIM应用工具包)的命令。这些命令可被SIM卡直接执行,功能包括拨打电话、发送短信、更新SIM文件等。
这类消息本应由运营商发送以管理用户SIM卡,但关键在于,普通用户也能构造并发送OTA消息。这就为攻击者打开了大门。
SIM Jacker攻击成功需要几个条件:
- 短信中心能够接收并转发PDU格式的短信。
- 接收方的SIM卡能够解析包含USAT命令的PDU消息。
- SIM卡上部署了S@T浏览器技术,并且其安全级别被设置为最低(“不应用任何安全措施”)。
回顾PDU格式,其中的UDHI位(First Octet第7位) 就是普通短信与OTA消息的“开关”。当此位设置为1时,用户数据(UD)部分就包含了可供SIM卡应用执行的命令头和数据。

如图所示,当UDHI=1时,用户数据(UD)部分结构变为:
- 用户数据头 (UDH): 包含头长度(UDHL)和头内容。头内容可指示是否包含安全头等。
- 命令包 (CP):这是核心部分,包含:
- 命令包长度 (CPL):整个命令包的字节数。
- 命令头长度 (CHL):命令头的字节数。
- 命令头:由6个关键字段组成,决定了消息的安全性和目标。
- 安全参数指示符 (SPI): 指定是否应用安全措施。在SIM Jacker攻击中,通常设置为
0x0000(无安全措施)。
- 加密密钥标识符 (KIC) / 密钥标识符 (KID): 设置为
0x00。
- 目标应用参考 (TAR): 指定SIM卡上接收消息的应用程序。对于S@T浏览器,TAR为
0x505348。
- 计数器 (CNTR & PCNTR): 通常设置为
0x0000000000 和 0x00。
- 安全数据: 这部分包含实际的STK字节码命令,即攻击载荷。例如,可以是指令S@T浏览器发起定位请求并将结果通过短信发送给攻击者。
(2)攻击示例分析
一个典型的SIM Jacker攻击PDU可能如下(通过AT命令发送):
AT+CMGF=0
AT+CMGS=69
>0041000B910516325476F87FF6XX027000YYYY0D0000000050534800000000000042230121...2D0C100383...2B00
(CTRL + Z)

上图中的XX和YYYY是占位符,分别代表FO字段和CPL字段的具体值。整个结构清晰地展示了如何将一个恶意STK命令封装在普通的短信PDU中。
五、检测与现状
目前已有工具可以检测SIM卡是否易受此类攻击,例如使用SIM卡读卡器和SIMTester等软件。用户可以在云栈社区的安全/渗透/逆向板块找到更多关于硬件安全和漏洞分析的技术讨论。

需要注意的是,根据公开信息,国内运营商发行的SIM卡受此攻击影响的案例较少,在个人测试中也较难复现。这可能是由于运营商对SIM卡安全配置策略不同所致。尽管如此,理解其背后的网络通信原理与协议漏洞,对于提高移动安全意识至关重要。
参考文献
- GSM短信详细流程
- PDU格式详解
- QuecPython SMS应用指导