niedziela, 21 stycznia 2018

Karty Mifare Classic 1k oraz Mifare Classic 4k

W tym poście chciałbym opisać strukturę karty Mifare Classic 1k oraz 4k pracujące z częstotliwością 13,56MHz.

[Źródło: www.wikipedia.pl]

Co prawda sposób uzyskania dostępu do kluczy zapisanych na karcie został już złamany i nie stanowi on zbytniego problemu, to karty w tej technologii są dosyć często stosowane. Jeśli ktoś planuje nowy produkt w tej technologii to lepiej przejść na karty w standardzie Mifare Plus.

Specyfikacja karty 1k:


Karta Mifare 1k posiada pamieć EEPROM o pojemości 1024B (1kB), które są podzielone na 16 sektorów po 4 bloki. Każdy z bloków posiada 16B pamięci. Dane możliwe do zapisu przez użytkownika są umieszczone na 752B. Dodatkowo każdy z sektorów można zabezpieczyć kluczem dostępu. 

Możliwość utrzymania danych na karcie definiowana jest na 10 lat. Kartę można zapisać do 200000 razy.

Specyfikacja karty 4k:


Tutaj różnica polega na ilości dostępnej pamięci. Cała karta posiada 4096B pamięci. Podzielono ją na 32 sektory po 4 bloki oraz 8 sektorów po 16 bloków. Każdy z nich posiada 16B. Dla użytkownika dostępne jest 3440B.

Blok z numerem seryjnym:


Jest to pierwszy zapisany blok danych w pierwszym sektorze. Składa się z 16 bajtów. 

Pierwsze 4 bajty (pozycja 0 do 3) zawiera numer NUID (Non-Unique ID), reszta bajtów (pozycja 4 - 15) zawiera dane producenta.

Jest też możliwość stworzenia drugiej wersji, w której stosowany jest numer UID na 7 bajtach (pozycja od 0 do 6). Reszta zarezerwowana jest na dane producenta.

Pozostałe bloki:


W związku z tym, że każdy z sektorów zawiera 4 bloki danych, to dostęp do swobodnego zapisu, jest możliwy na trzech z nich. W przypadku sektora zerowego dostępne są tylko dwa bloki, ponieważ jeden z nich zawiera dane producenta opisane wcześniej.

Dane w blokach dostępnych można zapisać, odczytać oraz wprowadzić wartość liczbową. Ta wartość jest zapisywana w dosyć specyficzny sposób. Informacje są przedstawione na czterech bajtach. Od pozycji 0 do 3 wpisane są dane od bajtu najmniej znaczącego (LSB pozycja 0) do najbardziej znaczącego (MSB pozycja 1). Dalej zapisywane są te same dane w takiej samej kolejności z tą różnicą, że wartości są odwrócone. Kolejne 4 bajty zawierają dane w takiej samej kolejności jak na pozycjach 0 do 3. Ostatnie cztery bajty zawierają dane o adresie wpisywane na zmianę najpierw normalne potem odwrócone.

Ostatni blok w sektorze (ang. sector trailer). W nim zdefiniowane są klucze dostępu (A i B, oba po 6 bajtów) oraz bity dostępu (ang. access bits), które przechowują typy zapisanych danych oraz warunki dostępu dla zabezpieczonych bloków.

Dla karty przesłanej przez producenta wszystkie klucze wynoszą FFFF FFFF FFFF. Natomiast Access Bits zostały ustawione na FF078069.

Struktura bloku 3 wygląda następująco:

Bajty od 0 do 5 - klucz A wymagany i obowiązkowy.
Bajty od 6 do 9 - Access bits. Bajt na pozycji 9 może zostać do dyspozycji użytkownika.
Bajty od 10 do 15 - klucz B opcjonalny. Może być używany do zapisu zwykłych danych.

Każdy sektor ma ustawiany własne klucze dostępowe oraz bajty dostępu. Przykładowe ustawienia bajtów dostępu mogą być następujące (są to typowe i zarazem najczęściej występujące ustawienia):

FF 07 80 69 - typowy klucz najczęściej stosowany, odczyt i zapis przy pomocy klucza A. Klucz B nie pozwala na żadne operacje na blokach. Odczyt klucza A jest zablokowany.
EF 07 80 69 - możliwy tylko odczyt zapis zablokowany
FE 17 80 69 - odczyt dla obu kluczy zapis przy pomocy tylko klucza B
EF 06 91 69 - odczyt oraz zapis za pomocą klucza B
FE 16 90 69 - odczyt za pomocą klucza B, zapis zablokowany

Należy pamiętać, że w przypadku błędnego ustawienia kluczy dostęp do sektora może zostać na stałe zablokowany.

Kalkulator pozwalający na obliczanie wartości można znaleźć pod tym linkiem.

Operacje na blokach:


Tutaj oprócz zwykłego zapisu oraz odczytu możliwe są także procesy inkrementacji czy dekrementacji. Dwie ostatnie możliwe są tylko dla danych liczbowych (value). Dodatkowo jest jeszcze procedura transferu zapisująca dane z  bufora do bloku oraz tzw. Restore, który przenosi dane z bloku do bufora.

Przed uzyskaniem dostępu do danych zapisanych w blokach należy podać klucz.

W celu uzyskania dostępu do zakodowanego bloku należy wykonać procedurę autoryzacji, po czym przystąpić do odczytu bądź zapisu.

Autoryzacja wygląda następująco:

Wysyłana jest informacja z kluczem jaki będzie wykorzystywany, następnie adres sektora do odczytu. Po tych informacjach podawane są cztery bajty numeru seryjnego. Po autoryzacji można odczytać lub zapisać dane do poszczególnych bloków.

Zapis wykonuje się poprzez podanie kodu operacji 0xA0 po czym wprowadza się informacje o bloku do którego będzie wykonywana operacja. Dalej obliczany jest CRC i następuje wysłanie komendy do karty. Gdy operacja się powiedzie to należy przesłać 16 bajtów danych do zapisania razem z obliczonym CRC.

Jeśli chodzi o procedurę odczytania to przesyła się kod 0x30 odpowiedzialny za odczytanie bloku, po nim podaje się adres a następnie obliczone CRC. Jeśli mamy dostęp do tych rejestrów to w odpowiedzi zostaną zwrócone odczytane dane.

Złamanie zabezpieczeń:


Sposób uzyskania dostępu do danych na karcie został przedstawiony np. w tym artykule.

W skrócie dostęp uzyskuje się poprzez sprawdzanie kluczy dostępowych do bloków. Jeśli nie zostały one zmienione (czyli klucze są standardowe dla tej technologii) to dostęp jest możliwy w kilka sekund. Gdy zostały one zmienione to program przechodzi do próby złamania klucza. Po jego złamaniu zwracany jest pełny kod z danymi oraz kluczami. Oczywiście dla sektorów do których klucz udało się rozpracować.

Czasem zdarza się, że firmy nie zabezpieczają dodatkowymi kluczami swoich kart. I dostęp zabezpieczony jest tylko przez numer karty nadany przez producenta. W takim przypadku wystarczy posłużyć się kartą programowalną Mifare, która jest trochę droższa, i przepisać blok 0 sektora 1 do nowej karty np. przy użyciu gotowych kodów na Arduino i MFRC522.

Podobnie sytuacja wygląda w przypadku gdy są informacje zapisane na karcie ale nie są zabezpieczone kluczami indywidualnymi tylko standardowymi bądź typowymi. W takim przypadku również wystarczy telefon z NFC bądź Arduino z MFTC522.

Bibliografia:


[1] Mifare and handling of UID's 
[2] Mifare Classic EV1 1K
[3] Wikipedia