第4章:GP规范与JCOP——GlobalPlatform标准、GP API、GP安全通道协议、GP命令集
好,咱们进入正题。这一章讲的是GP规范,也就是GlobalPlatform。说实话,这是智能卡安全绕不过去的一道坎。你想想看,JCOP卡上跑的所有安全逻辑,底层都是靠GP这套标准在撑。我刚开始接触JCOP时,也以为只要会写Java Card Applet就够了,结果第一次做安全测试就被GP安全通道给卡住了。嗯,从那以后,我老老实实把GP规范啃了一遍。
4.1 GlobalPlatform标准到底是什么?
GlobalPlatform,简称GP,说白了就是一套跨平台的智能卡管理标准。它定义了卡上怎么装应用、怎么删应用、怎么保证通信安全。JCOP作为Java Card的实现,完全遵循GP规范。
我个人习惯把GP分成三层来看:
- 卡管理层:负责应用的生命周期管理,比如安装、删除、锁定
- 安全域层:每个安全域相当于一个独立的保险箱,管理各自的密钥
- 应用层:咱们写的Applet就在这层跑
为什么要有GP?你想想看,如果没有统一标准,每家芯片厂商自己搞一套管理接口,那做应用开发的人得疯掉。GP把这一切统一了,JCOP只是其中一个实现者。
核心要点:GP规范定义了卡上资源的管理权归属。谁拥有ISD(发行者安全域),谁就是卡的主人。这个在安全攻防中非常关键——拿到ISD的控制权,基本就等于拿到了整张卡。
4.2 GP API——你实际调用的接口
GP API是GlobalPlatform提供给上层应用的编程接口。在JCOP平台上,这些API封装在javacard.framework和org.globalplatform包里。
我记得第一次用GP API时,最让我困惑的是GPSystem类。它提供了卡管理相关的静态方法,比如:
// 获取当前应用的生命周期状态
byte state = GPSystem.getCardContentState();
// 锁定应用
GPSystem.lockCard();
// 获取安全域信息
GPSystem.getSecureChannelData(...);
这里有个坑,我踩过。GP API的调用是有权限限制的。不是随便哪个Applet都能调用GPSystem.lockCard()。只有拥有对应安全域权限的应用才能执行这些敏感操作。我曾经在项目里写了一个测试Applet,想直接锁卡测试恢复流程,结果抛了个安全异常——权限不够。
实战技巧:做安全测试时,可以先枚举卡上所有安全域,看看哪些API被暴露了。有时候厂商会不小心把敏感API开放给普通应用,这就是一个绕过点。
4.3 GP安全通道协议——通信的加密隧道
GP安全通道协议,简称SCP(Secure Channel Protocol)。目前主流的是SCP01、SCP02、SCP03。JCOP卡通常支持SCP02和SCP03。
安全通道的作用是什么?说白了,就是保证你发给卡的指令,中途没人能偷看,也没人能篡改。我打个比方:你往卡里写密钥,如果明文传输,中间人一抓包,密钥就泄露了。安全通道就是给这条通信链路加了一把锁。
SCP协议的核心流程:
- 初始化:终端和卡互相交换随机数,协商会话密钥
- 外部认证:终端证明自己知道主密钥,卡验证通过后建立安全通道
- 安全通信:后续所有APDU指令都经过MAC校验或加密
我遇到过最典型的安全问题是什么?有些卡为了兼容老旧终端,保留了SCP01的支持。SCP01的加密强度相对较弱,而且存在已知的漏洞。攻击者可以强制降级到SCP01,然后发起攻击。嗯,这就是所谓的协议降级攻击。
警告:在生产环境中,务必禁用SCP01,只启用SCP02或SCP03。我曾经审计过一个项目,卡上同时支持SCP01和SCP03,结果测试团队用SCP01成功绕过了安全校验。这个教训很深刻。
4.4 GP命令集——你发给卡的每一条指令
GP命令集定义了终端如何与卡交互。这些命令都是基于APDU格式的。常用的GP命令包括:
| 命令 | CLA | INS | 用途 |
|---|---|---|---|
| SELECT | 0x00 | 0xA4 | 选择应用或安全域 |
| INITIALIZE UPDATE | 0x80 | 0x50 | 初始化安全通道 |
| EXTERNAL AUTHENTICATE | 0x84 | 0x82 | 外部认证,建立安全通道 |
| INSTALL | 0x80 | 0xE6 | 安装应用或可执行文件 |
| LOAD | 0x80 | 0xE8 | 加载应用代码 |
| DELETE | 0x80 | 0xE4 | 删除应用 |
| GET STATUS | 0x80 | 0xF2 | 获取卡上应用状态 |
这些命令看起来简单,但组合起来能玩出很多花样。比如,GET STATUS命令可以用来枚举卡上所有已安装的应用和安全域。做安全测试时,我第一步就是发这个命令,看看卡上到底藏了什么东西。
再比如INSTALL和LOAD命令,它们负责应用的安装流程。如果安全通道没建立好,或者权限校验有漏洞,攻击者就能偷偷往卡上装恶意应用。我曾经在实验室里复现过这种攻击——通过构造畸形的INSTALL命令,绕过权限检查,成功安装了一个后门Applet。
关键点:GP命令的执行严格依赖安全通道状态。没有建立安全通道时,大部分管理命令都会被拒绝。但有些卡实现有bug,可能在特定条件下绕过这个检查。这就是我们要找的漏洞。
4.5 知识体系结构图
下面这张图展示了GP规范与JCOP的核心关系。我习惯用这种图来理清思路,你也试试看。
这张图你看懂了吗?从上到下,GP规范在最顶层,下面分出了API、安全通道、命令集三大块。这三块最终都在JCOP平台上落地实现。做安全测试时,我们就是在这三个维度上找漏洞。
个人建议:刚开始学GP时,别急着啃完整规范文档。先搞懂安全通道的握手流程,再熟悉几个常用命令,最后再看API。这样循序渐进,效率高很多。我当年就是反着来的,结果看了两周文档还是一头雾水。
好了,这一章的内容就到这里。GP规范是JCOP安全的基础,后面讲安全认证绕过时,你会反复用到这些知识。记住:安全通道是防线,命令集是武器,API是接口。三者缺一不可。
公众号:蓝海资料掘金营,微信deep3321