分类目录归档:sim

智能卡安全机制比较 StarCOS

作者: smarticcard (微信号)

StarCOS是捷德公司的推出的智能卡COS,和前面说过的几种COS不同的是,国内的用户对于StartCOS可以说非常熟悉,而且因为握奇、明华、天喻等公司的安全机制都基本上是脱胎于StarCOS,所以经常会给大家造成一种错觉,好像智能卡的COS就该是这样的。其实完全不然,稍后会介绍握奇的TimeCOS,从TimeCOS V1.0中可以看出来,和StarCOS还是有很大差别的。

捷德中国为了满足国内PBOC的需求,在StarCOS的基础上推出了Star China,安全机制和StarCOS相同。

StarCOS的文件结构除了通常的二进制透明文件、线性定长记录文件、线性变长记录文件、循环记录文件之外,还多了一种名为compute的文件结构,从形式上看compute文件和循环记录文件类似,但是每条记录又有自己固定的结构定义。

StarCOS的MF和每个DF都有自己的初始安全状态,当卡片上电后首先默认选择MF,安全状态为MF的初始状态,当选择某个DF后,当前DF的安全状态就是该DF的初始状态。MF和DF的初始状态在文件建立的时候可以设定。

在整个卡片的操作过程中分别保存两个当前安全状态,一个是MF的,另一个是当前DF的。只有通过验证PIN或者外部认证、双向认证才能改变当前的安全状态。

总共有1到15种状态可以设定,用半字节来表示。

在MF下有建立EF、安装密钥、建立DF、注册DF的安全条件;在DF下有建立EF和安装密钥的安全条件;对于EF而言分别有读、写、锁定、解锁、增值、减值等操作的安全条件。

所谓的安全条件AC就是定义卡片应该处于什么样的安全状态下,才能满足相应的操作。安全条件为一个字节,具体定义为:

其中高两位b8b7定义比较模式,分别为等于、小于、大于等于、不等于;b6用来定义是否采用安全报文;b5用来表示和当前DF的安全状态比较还是和MF的安全状态比较;b4b3b2b1则表示比较时参考的安全状态。

简单地说如果卡片MF的安全状态是05,当前DF的安全状态是08,如果在当前DF下有一个EF的读AC=43、写AC=99,那么就可以对该EF进行读操作,但是不能写。

在密钥中有两个安全条件值ACV,其中第一个ACV用来指明这个密钥的使用条件、而第二个ACV的后四位数据用来指明正确认证密钥后将要转换的后续状态。同样每条密钥中还有一个用来指出更新密钥需要遵循的安全状态。

下图用来说明安全状态的转换

该图说明只有在MF下验证DES密钥之后,才能进入DF下进行PIN验证,并且将DF的安全状态改变为c。

StarCOS的安全机制是目前见到过的最灵活和最有效的安全机制,对于文件的不同操作可以非常方便地定义安全条件,即可以参考当前的DF值也可以参考MF下的值。

唯一的限制是在98年版的StarCOS S2.1中,仅支持二级文件目录,亦即在MF下只有一级DF,虽然稍显不足,但是也基本上可以满足大多数应用的需求。

智能卡安全机制比较 TimeCOS

http://blog.sina.com.cn/s/blog_4df8400a0100gpm6.html

TimeCOS是握奇公司推出的智能卡操作系统,也可以说是国内早期自己开发的为数不多的几款COS之一。当然随着后来国内公司对于CPU卡开发的投入,其他公司的COS产品也纷纷推出。

其实从握奇的TimeCOS来看,早期的1.0版本和目前流行的TimeCOS版本之间在安全机制方面存在很大的差别。TimeCOS1.0采用的是按位比较的状态机机制,也就是说TimeCOS1.0在内存中维护一个安全状态字节,这个字节的每个位分别对应一种安全状态,在初始情况下这个状态字节为00,只有通过外部认证或者是通过PIN的验证之后这个字节的某个位才能从0转变为1。而某个文件或者应用的安全状态一般都需要这个安全状态字节的某些位必须被置1之后才能被访问或者操作。这种模式简单易行,基本可以满足各种基本的应用需求。

但是在随后的TimeCOS版本中,握奇借鉴了StarCOS的安全机制模式,也采用前后顺序状态,以及状态数值之间的大小比较来确定安全状态是否被满足。

在握奇各种细分的COS版本中,基本上都采用了这种类StarCOS的安全机制,其中包括:PBOC产品、PKI产品、PSAM产品等。

具体的实施方法是:卡片的内存中同样会有一个安全状态字节,不过这个字节的变化不是按位改变,而是由认证密钥(或者PIN)中预设的“后续状态”来直接指定,对于卡片中存储的任何一个密钥(含PIN)都有一个所谓的“后续状态”。

这个字节被划分为前后两个半字节,分别用来指出MF和当前DF的状态。

卡片各种操作的权限的获得就是通过这个状态的转变来实现,该状态的取值范围是0到15,操作的权限用一个字节表示,分为左右两个半字节,其中左半字节和右半字节的取值均为0-15(0x0-0xF),可以表示为0xXY,如果当前DF的安全状态值V满足Y<=V<=X的条件,那么就获得了操作权限。 比如一个文件的读权限是0x52,而写权限是0x84;密钥1的后续状态是0x03,而密钥2的后续状态是0x05。那么认证密钥1之后可以文件满足读权限,但是不可写;认证密钥2后可以满足文件的写权限,但是不可读。 如果要把某个权限设定为可以自由操作,无需认证密钥,那么可以设为0xF0,这种情况下无论安全状态字节的值V是什么都满足0<=V<=15的条件。当然如果要把某个权限设定为禁止,即无论认证多少密钥都不能满足权限,那么可以设定为0x1F,在这种情况下无论S为任何值V都不能满足小于等于1并且大于等于15的条件。 特别地如果操作权限为0x0Y(即0xXY中的X=0),则表示需要比较MF下的安全状态大于Y。 如果仔细分析了StarCOS的安全机制,可以发现握奇采用的机制是在StarCOS的基础上进行的一个改进版本,因为StarCOS可以定义比较模式,也就是StarCOS可以更灵活地定义比较安全状态究竟是采用大于、小于还是等于或者不等于的模式。 国内另外一些厂商推出的COS多数借鉴握奇的TimeCOS安全机制,比如明华的所谓SmartCOS,以及复旦的FMCOS。 而航天金卡的PowerCOS则是完全照搬了StarCOS的安全机制。 国内的一些应用开发商和某些行业标准制定者,在进行系统开发和行业标准规划的过程中根本没有去认真阅读ISO7816的相关标准,仅把某家厂商的用户手册作为唯一的参考,甚至错误地认为全世界所有的COS都应该是这样的,实在让人无语!

智能卡cos开发的一些传说

某位大神(微信号:smarticcard)说:

上个世纪90年代初期曾经在一家中字头的公司工作过,当时的主要任务就是开发智能卡COS。和摩托罗拉、德州仪器等芯片公司接触颇多。印象比较深的是
当时还和著名的王爱英教授有过交流,王教授领导手下的研究生也开发了一款COS,但是苦于没有市场应用,4K的程序代码,能够完成基本的文件管理
和安全管理。王教授开价5万转让,沟通了几次最后没有谈成。

...
在这个时期CPU卡的价格维持在几十元人民币。包括金普斯(Gemplus)、捷德(G&D)、布尔(雅斯拓)、欧伽(ORGA)、飞利浦等国外公司的CPU卡
产品价格也都非常高。
...

随着CPU卡市场的逐渐普及,部分卡商也开始开发自己的COS。明华、航天、东信和平等原来更多地注重卡片封装生产的卡厂转而投入到COS开发的队伍当中。另外
像长城计算机等一些原来使用CPU卡进行系统集成开发的公司也加入到COS开发的行列,还有像武汉天喻这样的公司在成立之初就瞄准了COS开发。

越来越多的国内公司开发出了自己的COS产品,国外的公司也没有袖手旁观,捷德、金普斯等开始在国内建立研发团队针对中国市场开发COS产品。

到2000年前后,国产COS已经占据一定的市场份额,这时CPU卡的价格也跟随着下降。再加上部分国产CPU卡芯片也进入市场,所以CPU卡诱人的高利逐步降低。
2002年原雅斯拓的部分人员成立上海科斯,以迅雷不及掩耳之势同时获得中国移动和中国联通的入围资格,让众多还在为如何获得移动或者联通SIM卡入围
资格而苦思冥想的国内厂商惊诧不已。(像江苏恒宝这样的企业也是因为前一段时间收购了凤凰微电子手中的东方英卡股份才获得入围中国移动的资格。)

....


对于GSM的SIM卡因为没有合法获得A3A8算法的渠道,所以国内的厂商几乎没有自己开发SIM卡COS的,部分入围SIM卡的国内厂商也是直接从国外公司进口SIM卡
的模块,然后进行卡片封装。

国外的厂商比如斯伦贝谢(PayFlex)、金普斯(MPCos)、捷德(StarCOS)都力推自己的产品,而国内当时唯一成型的COS厂商握奇也在推广自己
的TimeCOS1.0。另外一家国内的COS厂商卡斯特也在物美集团下属的超市推广自己的产品。
......


到1977年才有三家公司参与智能卡的开发,那就是布尔(Bull)、斯伦贝谢(Schlumberger)以及SGS汤姆逊(SGS-Thomson),现在说来已经是三十年前的事情了。

1988年从SGS汤姆逊公司出来了5个员工,单打锣鼓另开张,创立了金普斯(Gemplus),并且为法国电信市场提供巨量的电话卡,从此一发而不可收,并且于1995年收购了Datacard集团位于欧洲和美国的卡片生产部门。

布尔为了强化智能卡市场也成立了独资公司就是著名的Bull CP8。但是布尔CP8因为整个布尔集团的结构策略调整而于2001年以3.5亿欧元的价格卖给了斯伦贝谢。

后来斯伦贝谢又将智能卡业务部门独立出来成立了雅斯拓(Axalto)。

从此雅斯拓和金普斯就成为整个智能卡行业的领头羊。分别提供各种行业的智能卡产品和终端机具,以及个性化服务和整体解决方案。

随着竞争的加剧,利润水平逐渐降低,这两个老大终于坐到了一起,从竞争转而开始讨论合并。并且历时一年左右的时间终于完成了合并,新的公司取名为“Gemalto”,中文翻译为“金雅拓”。为此削减了大量的冗余人员,降低了运营成本。

AT+CSIM(通用SIM访问命令)

3rd Generation Partnership Project; Technical Specification Group Core Network and Terminals;
AT command set for User Equipment (UE)
TS27.007

将命令APDU通过modem传递给SIM卡,然会返回响应APDU
这个命令,允许使用任意的APDU(但是 逻辑通道管理, 以及选择AID等命令, 可能会被AT命令实现,而不是用APDU: +CCHO=aid )

命令格式:

+CSIM=<length>,<command>

响应:

+CSIM: <length>,<response>

实战

红米6A,  一个终端运行
cat  /dev/pts/6


另外一个终端运行 (10是长度,是所有APDU命令的字符长度)
echo -e 'AT+CSIM=10,"A020000100"\r\n' > /dev/pts/6

AT+CSIM=14,"A0A40000027F20" 
AT+CSIM=42,"A088000010FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
选择7FF0 echo -e 'AT+CSIM=14,"00A4000C027FF0"\r\n' > /dev/pts/6 运行鉴权算法


一加5T

cat /dev/at_mdm0

echo   -c  'AT\r\n'      > /dev/at_mdm0 
echo  -c  'AT+CGSN\r\n' > /dev/at_mdm0
 echo  -c  'AT+CSIM=26,"0020000A083935323739353237"\r\n' > /dev/at_mdm0
回应
+CME ERROR: operation not supported



高通芯片不支持AT+CSIM, 但是对AT+CRSM支持得比较好

比如读ICCID

echo -c 'AT+CRSM=176,12258,0,0,10\r\n'  > /dev/at_mdm0

Androd将softsim加入到后台白名单

除了在 设置->电池优化 或者 设置-> 应用程序里 进行设置外

还可以在 adb shell 里调整

$ adb shell dumpsys deviceidle whitelist +com.mediatek.vsim
Added: com.mediatek.vsim

$  adb shell dumpsys deviceidle whitelist +im.softs.softsim
Added: im.softs.softsim

或者
adb shell cmd deviceidle  whitelist +com.mediatek.vsim
adb shell cmd deviceidle  whitelist +im.softs.softsim

从白名单中移除:
adb shell cmd deviceidle whitelist  -com.tencent.mm



查看 adb shell cmd 命令 (在Android N中添加了这个命令, 之前是没有的)

adb shell cmd -l
cactus:/ $ cmd deviceidle whitelist                                                                    
system-excidle,com.android.updater,9802
system-excidle,com.android.providers.downloads,10014
system-excidle,com.android.shell,2000
system-excidle,com.android.deskclock,10096
system,com.android.updater,9802
system,com.android.providers.downloads,10014
system,com.android.shell,2000
system,com.android.deskclock,10096
user,com.android.cts.priv.ctsshim,10006
user,org.simalliance.openmobileapi.uicc2terminal,10064
user,com.miui.contentextension,10030
user,com.miui.fm,10048
user,com.android.providers.calendar,10000
user,com.xiaomi.vipaccount,10052
user,com.android.providers.media,10014
user,com.milink.service,10085
user,com.mobiletools.systemhelper,10094
user,com.xiaomi.account,10075
user,com.android.wallpapercropper,10019
user,com.xiaomi.micloud.sdk,10035
user,com.miui.packageinstaller,10001
user,org.simalliance.openmobileapi.service,10051
user,com.android.documentsui,10021
user,com.android.externalstorage,10031
user,com.mediatek.vsim,10153
user,com.xiaomi.gamecenter.sdk.service,10036
user,com.android.htmlviewer,10084
user,com.miui.securityadd,10060
user,com.android.companiondevicemanager,10103
user,com.miui.gallery,10025
user,com.android.quicksearchbox,10009
user,im.softs.softsim,10152
user,com.android.providers.downloads,10014
user,com.xiaomi.payment,10100
user,com.mediatek.omacp,10080
user,com.android.browser,10033
user,com.android.soundrecorder,10004
user,com.android.defcontainer,10015
user,com.miui.guardprovider,10095
user,com.android.providers.downloads.ui,10014
user,com.android.pacprocessor,10045
user,com.miui.micloudsync,10074
user,com.xiaomi.ab,10073
user,com.android.certinstaller,10063
user,com.android.carrierconfig,10028
user,com.google.android.marvin.talkback,10076
user,com.android.contacts,10003
user,com.miui.hybrid,10065
user,com.mi.webkit.core,10023
user,com.android.mms,10032
user,com.android.mtp,10014
user,com.android.backupconfirm,10039
user,se.dirac.acs,10024
user,com.xiaomi.simactivate.service,10047
user,com.miui.player,10042
user,com.android.statementservice,10011
user,com.android.calendar,10037
user,com.miui.translation.kingsoft,10043
user,com.miui.virtualsim,10107
user,com.miui.compass,10124
user,com.miui.vpnsdkmanager,10057
user,com.android.sharedstoragebackup,10013
user,com.android.printspooler,10078
user,org.simalliance.openmobileapi.uicc1terminal,10097
user,com.miui.personalassistant,10026
user,com.android.dreams.basic,10090
user,com.android.incallui,10007
user,com.fido.xiaomi.uafclient,10059
user,com.fido.asm,10079
user,com.android.bips,10102
user,com.xiaomi.mircs,10034
user,com.miui.translation.youdao,10070
user,com.miui.cloudbackup,10040
user,com.google.android.webview,10050
user,android.ext.shared,10049
user,com.android.onetimeinitializer,10038
user,com.mipay.wallet,10061
user,com.android.camera,10041
user,com.android.printservice.recommendation,10058
user,com.xiaomi.upnp,10071
user,com.xiaomi.xmsf,10077
user,android.ext.services,10027
user,com.android.calllogbackup,10003
user,com.svox.pico,10010
user,com.android.proxyhandler,10016
user,com.miui.notes,10119
user,com.miui.video,10018
user,com.xiaomi.market,10069
user,com.miui.translationservice,10087
user,com.miui.cloudservice,10074
user,com.android.managedprovisioning,10022
user,com.miui.hybrid.accessory,10055
user,com.miui.translation.xmcloud,10099
user,com.sohu.inputmethod.sogou.xiaomi,10098
user,com.xiaomi.providers.appindex,10046
user,com.mediatek.op09clib.telecom,10067
user,com.android.smspush,10093
user,com.miui.calculator,10148
user,com.android.wallpaper.livepicker,10054
user,com.miui.miwallpaper,10081
user,com.miui.securityinputmethod,10068
user,com.xiaomi.metoknlp,10091
user,com.android.storagemanager,10008
user,com.miui.analytics,10088
user,com.miui.weather2,10147
user,com.xiaomi.scanner,10122
user,com.android.cts.ctsshim,10089
user,com.miui.yellowpage,10003
user,com.android.vpndialogs,10017
user,com.mediatek.op01.telecom,10053
user,com.android.email,10117
user,com.miui.voiceassist,10083
user,com.android.providers.blockednumber,10003
user,com.android.providers.userdictionary,10003
user,com.miui.providers.weather,10012
user,com.android.emergency,10020
user,com.miui.greenguard,10101
user,com.android.deskclock,10096
user,com.android.bluetoothmidiservice,10086
user,com.miui.smsextra,10092
user,com.mediatek.mtklogger,10072
user,com.android.thememanager.module,10044
user,com.lbe.security.miui,10005
user,com.android.providers.contacts,10003
user,com.android.captiveportallogin,10062
user,com.mediatek.mtklogger.proxy,10104
user,com.mediatek.dataprotection,10105
user,com.miui.core,10056
user,com.miui.home,10002

还有,appos允许后台运行

adb shell appops set  com.mediatek.vsim RUN_IN_BACKGROUND allow
或者
adb shell cmd appops set  com.mediatek.vsim RUN_IN_BACKGROUND allow
adb shell cmd appops set im.softs.softsim RUN_IN_BACKGROUND allow

查询允许运行在后台

adb shell cmd  appops  query-op  RUN_IN_BACKGROUND allow

禁止后台运行

adb shell cmd appops set com.sina.weibo RUN_IN_BACKGROUND deny
adb shell cmd appops set com.tencent.mm  RUN_IN_BACKGROUND deny




联想手机还有几处设置:
1.安全中心-->内存加速-->设置(右上角图标)-->加速保护名单
2.最近的应用列表:下滑加锁
 3.   电池管理-->电池优化-->待机省电 



几种虚拟卡COS实现的比较

1.红茶移动  (深圳红茶移动科技有限公司/深圳杰睿联科技有限公司)
在Java层面 对 SIM卡文件系统进行建模
对文件系统的访问,转换成对Java对象的访问
底层存储系统基于自建的ByteString对象

2.果通 (Shanghai Gotell Communication Technology Holdings Co., Ltd)
在C层面对SIM卡文件系统建模, 完全是传统的单片机COS源代码移植过来, 将内存的一块区域当成一块Flash存储

3. 二六三移动
在C层面,对APDU进行系统建模,  分fcp和bin 做为 内置数据
广州263已经退出虚拟SIM卡行业

4.小米
在Java层面,对APDU进行建模, 直接返回响应

简评:
设计得最漂亮的是 红茶
支持的最完善的是 果通
二六三设计得最直接,简单有效
最差的是小米

小米的开发人员,对SIM卡理解得还不够,估计是直接逻辑分析仪抓数据后,填的空,
很多响应,莫名奇妙返回901E,  其实那是STK交互, 提示modem卡有Proactive Cmd,它们都没搞明白

MSPL

格式

起始bit   位长  内容                  值      名称               注释
1      16     0000000000001111         15              MSPL_SIZE
17        8     00000001                 1             CUR_MMSS_P_REV
25       16    0000000000000001         1                MSPL_VER_ID
41       8      00000001                 1             NUM_MSPL_ID
49       8      00000001                 1             MSPL_ID
57       8      00000011                 3             NUM_MSPL_RECS

65       8      00000111                 7             SYS_TYPE                     EUTRAN (LTE)
73       4       0000                   0               PRI_CLASS                   HOME Only
77       1         1                    1               SYS_PRI                      More
78       3        000                    0              HIGHER_PRI_SRCH_TIME         1分钟
81      1         0                   0                NETWORK_CAP_IND


82      8         00000100            4                SYS_TYPE                        cdma2000 HRPD
90      4        1111                   15              PRI_CLASS                      Any
94      1        0                     0               SYS_PRI                         Same
95      3        000                    0              HIGHER_PRI_SRCH_TIME           1分钟
98      1        0                     0               NETWORK_CAP_IND

99       8       00000011             3                SYS_TYPE                      cdma2000 1x
107      4       1111                15                 PRI_CLASS                    Any
111      1        0                  0                   SYS_PRI                         Same
112      3        000                 0                  HIGHER_PRI_SRCH_TIME           1分钟
115      1       0                     0               NETWORK_CAP_IND

116      4       0000                   0              RESERVED                          保留将来使用

中国电信2016版MSPL

001B010008020104071F000E007D001E80204071F030F8147C03EE

phone book Index Administration Phone book

文件标识符: 4FXX (由PBR的内容决定)

如果参考文件(EF_PBR)中指示了标签’A9’,则存在该文件

EF包含指向作为电话簿一部分的文件中的不同记录的指针。 指数管理文件记录号/ ID与相应的EF_ADN一对一映射(记录到记录对应)。

该指数管理文件包含与EF_ADN相同数量的记录。

EF_IAP中指针的顺序应为与参考文件记录(PBR)中标签’A9’指示的TLV对象中出现的文件ID的顺序相同。

数量记录中的字节数等于标签’A9’后表示EFPBR的文件数。

值’FF’是无效的记录号/ ID,用于任何位置以表示没有相应的记录指示的文件可用。
在个性化阶段,EF_IAP的内容设置为“FF”。

phone book Change Counter

文件标识符: 4F23
文件大小: 2字节

更改计数器(CC)将用于检测对电话簿所做的更改。每次更新/删除现有电话簿条目或添加新电话簿条目都会导致终端增加EF_CC的值。 拥有CC的概念使得可以在不同的终端更新电话簿,它仍然能够检测到变化(例如,不同手机和/或第二代和第二代之间的不同的终端)。

跟EF_PSC一样, 当且仅当 USIM支持 电话簿同步时, 这个文件必须存在