跳到內容

WUP-SAK 與 Vanity SAK 技術參考(含複製卡實測)

本頁是 WUP-SAK 是什麼?門禁靠它抓出 MIFARE 複製卡的原理與應對 的詳細解說版,收錄完整實測矩陣、正品組合對照與名詞出處考據。想直接知道「該買哪種複製卡」請看該篇文章。


名詞說明:哪些是官方定義、哪些是社群俗稱

「名詞說明:哪些是官方定義、哪些是社群俗稱」章節
  • ISO/IEC 14443 只定義「SELECT 之後回傳的 SAK」這一個概念,位元定義請見 SAK 位元說明
  • NXP 的 MF1S50YYX_V1 手冊把 Block 0 描述為 “the IC manufacturer data”,結構是 UID/NUID + BCC + manufacturer data,並未把其中任何一個 byte 定義為 SAK 或 ATQA。把那幾個 byte 稱為 SAK / ATQA 是 MCT、MifareOneTool 這類工具的慣例命名。
  • 因此規範上這兩個值之間沒有任何必然關係。 各家晶片實際燒進去什麼值,只能實測。
俗稱是什麼怎麼看
WUP-SAK卡片在 SELECT 之後、由晶片協定層即時回傳的 SAKMCT 的「Display Tag Info」
Vanity SAKBlock 0(第 0 區)記憶體裡存的那個 bytedump 出來的第 11~12 個十六進位數字

SAK 在握手流程的哪個位置

「SAK 在握手流程的哪個位置」章節
讀卡機 卡片
│ REQA (0x26) / WUPA (0x52) │ ← 「有人在嗎?」
│ ────────────────────────────▶ │
│ ATQA │ ← 卡片舉手回應
│ ◀──────────────────────────── │
│ Anti-collision │ ← 解決多張卡同時在場
│ ◀──────────────────────────▶ │
│ SELECT │ ← 「就選你了」
│ ────────────────────────────▶ │
│ SAK ← 這個! │ ← 卡片回傳 SAK(1 Byte)
│ ◀──────────────────────────── │
  • REQA(0x26:Request 指令,喚醒場中「閒置(IDLE)」的卡片。
  • WUPA(0x52:Wake-Up 指令,連「已被 HALT 掉」的卡片也一起喚醒。
  • 卡片在 SELECT 之後回傳的 SAK 就是 WUP-SAKWUP 這個字頭即取自 WUPA(Wake-UP type A)。

門禁在還沒讀任何資料之前就拿到 WUP-SAK 了,這是它能拿來當第一道篩選的原因。

Block 0 結構與 Vanity SAK 的位置

「Block 0 結構與 Vanity SAK 的位置」章節
Block 0 = UID(4) + BCC(1) + SAK(1) + ATQA(2) + 廠商資料(8)
└─卡號─┘ └校驗┘ └─┬─┘ └─┬─┘
Vanity SAK ATQA

用 MCT App dump 出來,把 Block 0 那一長串十六進位攤開:

  • 11~12 個十六進位數字 = SAK(Vanity SAK)
  • 13~16 個十六進位數字 = ATQA

正品 MIFARE Classic 1K 有哪幾種組合

「正品 MIFARE Classic 1K 有哪幾種組合」章節

網路上常見「正品就是 WUP 08 搭 Block 0 88」的說法,但那只描述了其中一種族群。目前有據可查的至少三種:

族群WUP-SAKVanity SAK兩者關係出處
NXP 版 MIFARE Classic 1K0808相同台灣最常見
Infineon 版 MIFARE Classic 1K8888相同flipperzero-firmware #1342
部分系統配發的卡0888不同libnfc #487(描述為未依規範用法)

MIFARE Classic 4K 的 WUP-SAK 則是 18


實測:複製卡的 SAK 會不會跟著 Block 0 走?

「實測:複製卡的 SAK 會不會跟著 Block 0 走?」章節

網路上常說「便宜複製卡都會把 WUP-SAK 直接映射自 Block 0」。我們拿店內販售的 UID 卡與 CUID 卡逐一寫入測試,結果如下。

寫入 Block 0 的 SAK實測 WUP-SAK實測 Vanity SAK有映射嗎?
888888✅ 有
180818❌ 沒有
280828❌ 沒有
200820❌ 沒有
000800❌ 沒有
寫入 Block 0 的 SAK實測 WUP-SAK實測 Vanity SAK有映射嗎?
880888❌ 沒有
180818❌ 沒有
280828❌ 沒有

ATQA:兩種卡都會映射

「ATQA:兩種卡都會映射」章節
卡種寫入 Block 0 的 ATQA實測 WUP-ATQA實測 Vanity ATQA
UID 卡000200020002
UID 卡034403440344
CUID 卡004400440044
CUID 卡000200020002
CUID 卡034403440344
  • 卡號(UID):映射。
  • ATQA:映射。
  • SAK基本上不映射,一律固定回 08。唯一的例外是 UID 卡寫入 88,此時 WUP-SAK 才會跟著變成 88

門禁比對的是「配對指紋」,不是「一樣或不同」

「門禁比對的是「配對指紋」,不是「一樣或不同」」章節

先把兩個層次分開:

層次用詞指的是
卡片端行為SAK 映射(mirroring)卡片把 Block 0 的 SAK 直接拿來當握手回應
門禁端策略SAK 一致性檢查門禁比對 WUP-SAK 與 Vanity SAK 是否符合預期組合

門禁廠商知道自己發出去那批原卡的 (WUP-SAK, Vanity SAK) 配對是什麼。驗卡時:

1. 握手時記下 WUP-SAK;
2. 再對 Block 0 讀一次,拿到 Vanity SAK;
3. 拿這一組值跟原廠卡的預期組合比對,對不上就擋。

複製卡難就難在它未必湊得出任意配對。依照上面的實測,各種卡能到達的座標是有限的:

卡種能做出的 (WUP-SAK, Vanity SAK) 配對
UID(Gen1a)(08, 任意非 88 的值)(88, 88)
CUID(Gen2)(08, 任意值)
Gen4兩個值都可自訂,理論上任意配對

只要原卡的配對落在複製卡做不到的座標上,就會被擋下來。依此挑選複製卡的完整決策表請見 WUP-SAK 文章

Proxmark3 文件記載 Gen4 UMC 可用 CF<passwd>35<2b ATQA><1b SAK> 直接指定 ATQA 與 SAK,與 Block 0 無關;Gen4 GDM 則透過設定區塊(hf mf gdmsetcfg)指定。


名詞考據:「SAK Swapping」與「The Double Cross」

「名詞考據:「SAK Swapping」與「The Double Cross」」章節

這兩個名詞出自 equipter 的 gist,是目前中文資料轉載的主要源頭。該文把上一節的第 2、3 步稱為 The Double Cross,並描述門禁是在「驗證 WUP-SAK 與 Vanity SAK 兩者的不相同」,但我們前面說過了 WUP-SAK 與 Vanity SAK 到底該不該相同,在 MF1S50YYX_V1 手冊上其實是沒有定義的。

所以更精確的講法是:

門禁比對的是「配對是否符合預期」,而不是「兩者是否不同或相同」這條規則。

The Double Cross 是社群為了描述某些門禁廠商實作行為而取的名字,不是協定層面的規範。實務上各家廠商怎麼設計都有可能,甚至有廠商會刻意把 WUP-SAK 與 Vanity SAK 設成不同值,當作管控複製卡的手段。

資料來源的對照表也與我們的實測有出入:它把 Gen1a 標為「映射」、Gen2 CUID 標為「強制 08」,而 Proxmark3 文件對兩代都註明「有些映射、有些固定」。