SIMの認証情報(IMSI/Ki/OPC)を書き換え可能なSIMカード(sysmoUSIM-SJS1)を試してみた

## ■ はじめに
**SIMカード**には加入者を特定するための番号や認証情報等，数100以上ものパラメータが保存されています(※これらパラメータはMNO・フルMVNO事業者等のSIM発行者により任意に設定されています)．MNOやフルMVNO事業者は**SIMカード**に含まれる認証情報が正しいか**Home Subscriber Server(HSS)**で確認することで個人の所有する携帯端末が契約済みのものか判断し，NW接続サービスを提供しています．このHSSの認証において重要となるパラメータがIMSI/Ki/OPCとなります．

IMSI	：管理用番号(先頭3桁は国番号(MCC)，4~5桁目は事業者番号(MNC))
Ki/OPC	：認証用情報

通常の用途であれば，これら認証情報が書き換え可能でも全く意味はありません．
というのも，**HSSの認証情報**と**SIMの認証情報**が一致しないことにはどこにも繋がらず，"自営"でHSSを持っていないことにはSIM情報を書き換えても何のメリットもないからです．
※MNOの認証用情報はもちろんわからないため，MNOのSIM情報に書き換えてMNOのSIMを偽装することすらできないです．(そもそもこれをやると法的にアウトでしょうが...)

一方で，現在Private-LTE技術が少しずつ流行り始め，将来的には個人で自営HSSを運用することが可能となりつつあります．(参考：https://qiita.com/m0ch1m0ch1/items/7561ba1cfc3f056da14c)
また，自営でHSSを運用可能となった場合は，SIMの認証情報を自営HSS用に書き換えるなど様々な用途が出てきそうです．

そのため，今回はPrivate-LTEにsysmoUSIM-SJS1という認証情報を何度でも書き換え可能なSIMカードを購入し，認証情報を変更してみました．

【参考】：Nadeem, Muhammad Aamir, Muhammad Anwaar Saeed, and Imran Ali Khan. "A Survey on Current Repertoire for 5G." (2017). Fig.3. EPC Architecture
![](https://www.researchgate.net/profile/Muhammad_Nadeem98/publication/313471592/figure/fig1/AS:461301458706434@1486994246711/EPC-Architecture-6_W840.jpg)

## ■ sysmoUSIM-SJS1について
- 学術・研究用のSIMカード
- 通常版とwith ADM keys版の違い⇒認証情報を書き換え可能か否か
  - 今回はwith ADM keys版を購入
- SIMのパラメータ情報一覧はMailで届く
- 購入先：
  - microSIM：http://shop.sysmocom.de/products/sysmousim-sjs1
  - nanoSIM：http://shop.sysmocom.de/products/sysmousim-sjs1-4ff

## ■ 検証環境
- SIMカード：sysmoUSIM-SJS1
- SIM情報書き換え用端末：Ubuntu 18.04 LTS Server
- SIMカードリーダー：IDBridge CT30 (https://www.gemalto.com/japan/product/pcusbtr)

## ■ SIM情報書き換え用端末の環境設定
```bash
$ sudo apt install pcscd libccid pcsc-tools python-pip swig python-dev python-pyscard python-serial libpcsclite-dev git
$ sudo pip install pyscard pytlv
$ git clone git://git.osmocom.org/pysim
$ git clone git://git.sysmocom.de/sysmo-usim-tool
```

## ■ SIMカードリーダーの動作検証
- SIMカードリーダーにSIMを挿入
- SIMカードリーダーが正常に接続されていれば以下の画面が出力

```bash
$ pcsc_scan
=============================================
PC/SC device scanner
V 1.5.2 (c) 2001-2017, Ludovic Rousseau <ludovic.rousseau@free.fr>
Using reader plug'n play mechanism
Scanning present readers...
0: Gemalto PC Twin Reader (13342C04) 00 00

Mon Oct 29 13:45:26 2018
 Reader 0: Gemalto PC Twin Reader (13342C04) 00 00
  Card state: Card inserted,
  ATR: 3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 43 20 07 18 00 00 01 A5

ATR: 3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 43 20 07 18 00 00 01 A5
+ TS = 3B --> Direct Convention
+ T0 = 9F, Y(1): 1001, K: 15 (historical bytes)
  TA(1) = 96 --> Fi=512, Di=32, 16 cycles/ETU
    250000 bits/s at 4 MHz, fMax for Fi = 5 MHz => 312500 bits/s
  TD(1) = 80 --> Y(i+1) = 1000, Protocol T = 0
-----
  TD(2) = 1F --> Y(i+1) = 0001, Protocol T = 15 - Global interface bytes following
-----
  TA(3) = C7 --> Clock stop: no preference - Class accepted by the card: (3G) A 5V B 3V C 1.8V
+ Historical bytes: 80 31 A0 73 BE 21 13 67 43 20 07 18 00 00 01
  Category indicator byte: 80 (compact TLV data object)
    Tag: 3, len: 1 (card service data byte)
      Card service data byte: A0
        - Application selection: by full DF name
        - BER-TLV data objects available in EF.DIR
        - EF.DIR and EF.ATR access services: by GET RECORD(s) command
        - Card with MF
    Tag: 7, len: 3 (card capabilities)
      Selection methods: BE
        - DF selection by full DF name
        - DF selection by path
        - DF selection by file identifier
        - Implicit DF selection
        - Short EF identifier supported
        - Record number supported
      Data coding byte: 21
        - Behaviour of write functions: proprietary
        - Value 'FF' for the first byte of BER-TLV tag fields: invalid
        - Data unit in quartets: 2
      Command chaining, length fields and logical channels: 13
        - Logical channel number assignment: by the card
        - Maximum number of logical channels: 4
    Tag: 6, len: 7 (pre-issuing data)
      Data: 43 20 07 18 00 00 01
+ TCK = A5 (correct checksum)

Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
3B 9F 96 80 1F C7 80 31 A0 73 BE 21 13 67 43 20 07 18 00 00 01 A5
        sysmoUSIM-SJS1 (Telecommunication)
        http://www.sysmocom.de/products/sysmousim-sjs1-sim-usim
=============================================
```

## ■ SIMカードの認証情報の取得
- Mailに届いているSIMカードのパラメータ情報一覧からADMのパラメータ(8桁)を取得
  - 本記事上は仮に**01234567**とします
- ./sysmo-usim-tool.sjs1.pyのオプションは以下
  - -i　現在のIMSIの出力
  - -k　現在のKi値の出力
  - -o　現在のOPC値の出力
- 取得できた現在のパラメータ値：
  - IMSI：001010123456789
  - Ki：00112233445566778899aabbccddeeff
  - OPC：000102030405060708090a0b0c0d0e0f

```bash
$ cd sysmo-usim-tool/
$ ./sysmo-usim-tool.sjs1.py --adm1=01234567 -iko
sysmoUSIM-SJS1 parameterization tool
Copyright (c)2017 Sysmocom s.f.m.c. GmbH

Initializing smartcard terminal...

Detected Card ICCID: 0000011111222223333

Authenticating...
 * Remaining attempts: 3
 * Authenticating...
 * Authentication successful
 * Remaining attempts: 3

Detected Card IMSI: 001010123456789

Reading OP/C value...
 * Initalizing...
 * Reading...
 * Current OP/OPc setting:
   OPc: 000102030405060708090a0b0c0d0e0f

Reading KI value...
 * Initalizing...
 * Reading...
 * Current KI setting:
   KI: 00112233445566778899aabbccddeeff

Done!
```

## ■ SIMカードの認証情報の変更
- Mailに届いているSIMカードのパラメータ情報一覧から，ICCID,ADM,ACCの情報を取得する
  - その他のパラメータは変更したい任意の値を記入

```bash
$ cd pysim
$ ./pySim-prog.py --pcsc-device=0 --type="sysmoUSIM-SJS1" --mcc=001 --mnc=01 --imsi=001019876543210 --opc=100102030405060708090A0B0C0D0E0F --ki=10112233445566778899AABBCCDDEEFF --iccid=0000011111222223333 --pin-adm=01234567 --acc=0100 --dry-run
Generated card parameters :
 > Name    : Magic
 > SMSP    : e1ffffffffffffffffffffffff0581005155f5ffffffffffff000000
 > ICCID   : 0000011111222223333
 > MCC/MNC : 1/1
 > IMSI    : 001019876543210
 > Ki      : 10112233445566778899AABBCCDDEEFF
 > OPC     : 100102030405060708090A0B0C0D0E0F
 > ACC     : 0100

Dry Run: NOT PROGRAMMING!
Done !

$ ./pySim-prog.py --pcsc-device=0 --type="sysmoUSIM-SJS1" --mcc=001 --mnc=01 --imsi=001019876543210 --opc=100102030405060708090A0B0C0D0E0F --ki=10112233445566778899AABBCCDDEEFF --iccid=0000011111222223333 --pin-adm=01234567 --acc=0100
Insert card now (or CTRL-C to cancel)
Generated card parameters :
 > Name    : Magic
 > SMSP    : e1ffffffffffffffffffffffff0581005155f5ffffffffffff000000
 > ICCID   : 0000011111222223333
 > MCC/MNC : 1/1
 > IMSI    : 001019876543210
 > Ki      : 10112233445566778899AABBCCDDEEFF
 > OPC     : 100102030405060708090A0B0C0D0E0F
 > ACC     : 0100

Programming ...
Done !
```
## ■ 結果
- 変更前：
  - IMSI：00101 **0123456789**
  - Ki：**0**0112233445566778899aabbccddeeff
  - OPC：**0**00102030405060708090a0b0c0d0e0f
- 変更後：
  - IMSI：00101 **9876543210**
  - Ki：**1**0112233445566778899aabbccddeeff
  - OPC：**1**00102030405060708090a0b0c0d0e0f