Mifare ClassicはNFCカードの一つで、導入コストが極めて低いことから学生証や入退室キーとして未だに利用されることがあります。しかし、Mifare Classicには偽造がとんでもなく容易であるという恐ろしい仕様上の欠陥があります。特に入退室キーなどに利用している場合、近年問題になっている「退職者、入館証を貸与した来訪者による建造物侵入、盗難」を招くことがあり、大変危険です。
テレビやニュースなどでは、偽造にはProxmark31のような特殊なNFCリーダー/ライターが必要とされていますが、今回は秘密鍵の解析を省略して、NFCリーダーライターとしてAndroid端末だけを用いて実際にキーを複製します。なぜなら秘密鍵を設定していない(そもそもその機能を知らない)場合も多いからです。
結論から言うと簡単に複製が可能です。機密情報のある部屋への入退室などにはFelicaなど偽造例のないセキュアなNFCカードを使うことで、このような犯罪が起こるのを未然に防ぐことができるはずです。
目次
Mifare Classicの危険性を検証するための実験です。絶対に真似しないでください。私は責任を負いません。
また、実際には秘密鍵の解析という手順がありますが、今回は秘密鍵がわかっているという前提で検証します。
前知識
Mifare Classicの詳細はこちら ※PDF直リンク。
NFCは主に3種類(A,B,F)に分けられます。ざっくり言うと、Type-AはMifare系、Type-FはFelicaのことです。Type-Bは運転免許証とかに使われています。今回使用するのはType-AのうちMifare Classicと呼ばれるものです。Type-Aの中でもTaspoはMifare PlusというClassicの後継が利用されています。ちなみに、Type-Vというものもありますが滅多にお目にかかれません。
今回は省略しますが、Mifare Classicは48bitの長さの秘密鍵を有していて、総当たり攻撃でも比較的短時間で解析可能であることがわかったということが主な理由で10年ほど前から危険視されています2。
Mifare Classicは構造としてSector: 0からSector: 15の16セクタで構成されていて、そのうちSector: 0のBlock: 0(画像でいう一番上の行)以外は自由に書き込みができる場所です。ここは「UID」と「IC manufacturer data」の2つから構成されていて、それぞれ「カード固有の番号」、「製造番号」を表しています。このうちUIDは、カードに固有であって書き換えられないという理由でカードを識別するための情報に使われていることが多いです。
しかし、世の中にはこのUID部分を書き換えられるように改造された特殊なカード(UID Changeableなカード)が存在し販売されています。これによって本来書き換えられないという前提で識別されていたUIDを複製して偽造することができてしまいます。その他の部分は普通に読み書き可能であるためフルコピーが可能になり、カード外装以外ではオリジナルと区別がつかないという恐ろしいものになっています。
準備
必要なもの
- Mifare Classic (秘密鍵がわかっていれば何でもOK)
- 複製用の特殊なMifare Classic(解説参照)
- Nexus 7 (2012) ……Mifare Classicが読み書き可能なNFCリーダー/ライター搭載のAndroid端末なら何でもOK
- MIFARE Classic Tool(以下「MCT」、Githubはこちら)
解説
複製用の特殊なMifare Classicのカード(UID Changeableなカード)には、大きく分けて2つあります。一つはProxmarkなどの機器が必要な「第一世代のMagic Tag」、もう一つはAndroid端末でもUIDが書き込める「第二世代のMagic Tag」です。後者は特殊な機器が必要ない分前者に比べて比較的高値ですが、そもそもUIDを簡単に書き換え可能なのでUID情報さえ端末に保存していればカード1枚でいつでも切り替えられます。 よくある失敗例として、RC522ではUID書き換えが成功するのにMCTで失敗するのは、第一世代のMagic Tagを使っているためです。
Mifare Classicが読み書き可能なNFCリーダー/ライター搭載のAndroid端末は最近はなかなか販売されていません。それはMifare Classic自体のセキュリティの低さ故に意図的に対応させていない場合が多いからです。こちらから対応端末を探すことになるのですが、YesとなっていてもSoCや地域、キャリアの違いによって対応していない場合がそこそこあったので、実際に動作確認された端末を用意するのが良いです。今回はNexus 7(2012)を使用します。
手順
必要なものさえ準備すれば簡単です。Mifare Classicの情報をフルコピーした後、UID Changeableなカードに書き込むだけです。
MCTの「TOOLS」には「Clone UID」というまんまな機能がありますが、今回はUID以外の部分も完全に複製するため使いません。
- 端末のNFCを有効にしてMCTの「READ TAG」を起動し、NFCリーダー/ライターに複製したいカードをかざす。

- 「START MAPING AND READ TAG」で読み込む。「std.keys」「extended-std.keys」にキーが含まれていなければ編集して書き込んでおく。パスは
/sdcard/MifareClassicTool/key-files/。extended-std.keysは用意されているキーが多いので読み込みに時間がかかる場合がある。
- Dump Editorが表示されたら「Save dump」からダンプファイルとして保存。

- 「WRITE TAG」を起動して、ラジオボタンを「Write Dump (Clone)」に合わせて「Show Options」をチェックし、「Advanced: Enable writing to manufacturer block」をチェックする。

- 「SELECT DUMP」からダンプファイルを開き、書き込むSectorsとしてすべてにチェックを入れて「OK」で進む。

- UID ChangeableなカードをNFCリーダー/ライターにかざしたら「START MAPING AND WRITE DUMP」でダンプファイルを書き込む。


無事書き込めると図のように表示される