はじめに
日立ソリューションズグループでは、昨年10月~11月に社内セキュリティコンテスト(いわゆる社内CTF)を開催しました。 コンテストで出題された問題のうち、私が作成したものについて本記事でご紹介します。
問題作成時のコンセプトとして「身近だけど中身があまり知られていないものを」という考えが自分の中であったので、交通系ICカードを取り上げてみました。
問題内容
問題文は省きますが、下記のような交通系ICカードデータのダンプから、このICカードを使って関東圏で5,000円以上の買い物をした
- 日にち
- 最寄り駅
- 購入額
を答えてもらう問題を作成しました。
交通系ICカードについて
日本で利用されている交通系ICカードには主にFelicaチップが搭載されており、チップ内に乗降履歴や改札入出場履歴などが記録されています。 誰でもチップ内の全データを読めるわけではありませんが、一部のデータはスマートフォンやNFCリーダーなどで読み取り可能です。 上記の画像には表示されていませんが、実際に出題したダンプには「IC type」としてFelicaという記述があったので、以降はこのダンプをFelicaチップ内のデータとして解析していきます。
Felicaチップ内の交通系ICカード関連情報を取得するには、システムコードとサービスコードを指定する必要があり、これらは日本鉄道サイバネティクス協議会によって制定された規格(通称:サイバネ規格)によって定義されています。 この規格は参画事業者のみが参照可能ですが、ある程度の情報は有志の方々によるまとめサイトなどから取得できます。(参照先(キャッシュ):サイバネ規格 (ICカード)
問題の解法
与えられたデータでは、システムは1つ(System Code: 0x0003)だけ読み取れていました。 読み取れたデータを、サイバネ規格をもとに見ていくと、重要そうなのは下記です。
System Code 0x0003 * Area #7: - Service: 0x008B →カード種別およびカード残額情報 - Service: 0x090F →乗降履歴情報 - Service: 0x108F →改札入出場履歴情報
ICカードの持ち主は、このカードにチャージされた電子マネーを使って買い物をしたことが分かっているので、乗降履歴情報(Service: 0x090F)を見ていきます(本記事に掲載したデータではあらかじめ0x008Bと0x108Fのサービス領域のデータを省いています)。
乗降履歴の各データ(ブロック)について、下位バイトから数えて0xAバイト目と0xBバイト目がリトルエンディアン形式でカード残額を表しています。(下図の赤枠部分)
カード残額部分に着目して各データごとの消費金額を算出してみると、5,000円以上消費しているブロックは[0008]のみで、(0x2A0F - 0x0D6C =)7,331円消費しています。
またブロック[0008]の1つ前である[0009]のデータを見てみると、年月日と出場駅コードは下記のようになっています。
年月日:27 35 出場駅コード:1D 08
サイバネ規格に則って年月日を求めると「2019/09/21」になります。 出場駅コードについてはサイバネ規格と同様に有志の方々が情報をまとめられているので、それを参考に調べると出場駅は「JR東日本 根岸線 新杉田駅(線区コード:0x1D、駅順コード:0x08)」であることが分かります。
以上から、このICカードの持ち主は2019/09/21に根岸線 新杉田駅周辺の店で7,331円の買い物をしたと考えることができます。
おわりに
公共交通機関などでの移動や買い物などで手軽に使えるICカードですが、中にどんなデータが入っているかを知っている方はあまりいらっしゃらないのではないでしょうか。 これを機に、駅の改札を通過したり買い物の決済をしたりする際にICカードのデータについて思いをはせていただければ幸いです。


記事の著者
セキュリティ診断業務に10年間従事後、2016年よりシニアセキュリティアナリストとしてペネトレーションテスト業務に従事。
診断業務開始当初は社内イントラサイトの脆弱性に対する過激な指摘により物議を醸したが、
現在はだいぶおとなしくなっている。好きな周波数は13.56MHz。
GXPN、GAWN、GREM、GPEN、GDAT、GCPN、GCFA、GCFE、CRTE、CARTP、CEH
関連記事
RELATED ARTICLE