DEF CON 33 - RF Village - The dirty laundry of stored value washing cards - Aidan Nakache, Equip
三句話摘要
安全研究員通過逆向工程揭露My Fair Classic洗衣卡的RFID芯片設計缺陷,展示如何利用數據結構中的鏡像機制任意修改儲值余額。 RFID儲值系統的安全漏洞往往因升級成本過高、單次損失有限、使用者認知不足而長期存在,廠商會理性選擇承受已知風險而非投入巨額改造。 設計根本缺陷:余額作為可讀寫的明文整數存儲在扇區,系統未採用真正的加密認證,只靠簡單校驗位防護,無法抵禦有物理卡片的攻擊者。
重點整理
重點- 1
設計根本缺陷:余額作為可讀寫的明文整數存儲在扇區,系統未採用真正的加密認證,只靠簡單校驗位防護,無法抵禦有物理卡片的攻擊者。
- 2
鏡像機制反而成為破綻:為防止故障,卡片在塊2、4、8等多個位置存儲余額副本,但不同表示方式(十進制、十六進制、位元組反轉)的並存讓驗證邏輯完全暴露。
- 3
線性公式可被複制:交易ID和遞增計數器等驗證字節與余額值之間滿足線性關係,攻擊者只需修改一個字節,其他驗證位可通過公式自動生成,系統形同虛設。
- 4
升級困境驅動風險承受:修復需要全北美更換數百萬台編碼器硬件,成本數千萬美元;而單次欺詐金額低,加上消費者安全意識薄弱,廠商選擇承受持續漏洞風險。
實用技巧與重點
乾貨- 卡片規格:My Fair Classic 1-2代,容量~1KB(720字節),16個扇區×4個塊
- 余額編碼:整數美分制($18.75 = 1875 = 0x753),小端序存儲
- 關鍵位置:余額在塊2的第9-10字節;塊4、8為鏡像副本
- 驗證公式:中間字節 = xFF XOR 余額字節(即y = -x + 255)
- 其他數據:交易ID、遞增計數器、終端位、卡號(存為十六進制化十進制)
- 攻擊工具:Proxmark讀卡設備 + Python自動計算腳本
- 受影響廠商:Kiosoft(數據結構商)、Coinomatic、CSC等,涵蓋公寓、宿舍、校園自助洗衣房
- 影子模式:第4代卡引入,案例中價格被鎖定為$6,969
- 無法空生成:新卡須由同位置編碼器初始化,不能跨位置使用
結論
結論“RFID儲值系統的安全漏洞往往因升級成本過高、單次損失有限、使用者認知不足而長期存在,廠商會理性選擇承受已知風險而非投入巨額改造。”
完整解析
詳細從去年Defcon大會歸來,研究團隊萌發了對儲值洗衣卡的好奇心。My Fair Classic RFID卡廣泛部署於北美公寓、宿舍和大學,存儲加值信息供讀卡機驗證。他們的第一步是瞭解卡片架構。每張卡包含16個扇區,每個扇區由4個數據塊(共4或16字節)組成,總容量約720字節。第0塊存儲卡的身份標識(UID、製造商代碼等)且不可修改,其他塊則可讀寫。
早期分析中,他們發現$18.75的余額在卡片內存中表現為整數1875,進一步轉換為十六進制0x753。當他們搜尋這個值時,驚訝地發現它在多個位置重複出現——不僅在塊2,還在塊4和塊8,甚至以反向字節序(0x3507)的形式存在。這表明系統採用了大量冗餘來確保數據完整性,但正是這種冗餘暴露了內部邏輯。
突破點出現在分析驗證機制時。研究團隊注意到兩個神秘的「中間字節」在每次充值時都會變化。通過多組測試數據(分別充值$3、$10、$20),他們發現這些字節與余額值之間存在精確的數學關係:用余額值異或xFF即可得到驗證字節,反之亦然。更簡潔的表達是公式y = -x + 255。這一發現意味著他們不需要逆向整個加密流程,只需修改一個數值,其他防護層都能自動計算出來。
為了驗證可行性,他們使用Proxmark(一款RFID讀寫設備)和自寫Python腳本進行實驗。腳本先讀取卡片現有數據,計算目標金額對應的所有字節值(含驗證位),然後寫回卡片。演示中,一張原本余額$18.75的卡被成功修改為$85,整個過程耗時不到一分鐘。他們甚至發現了第4代卡引入的「影子模式」(Shadow Mode),某張測試卡的余額被永久固定在$6,969。
討論環節暴露了為何漏洞至今未被修復的根本原因。卡片無法空生成——新卡必須由同一位置(如特定公寓樓、大學宿舍)的編碼器初始化並分配卡號,這限制了廣泛欺詐的可能。更重要的是,修復系統需要更換全北美數百萬台編碼器和洗衣機硬件,涉及數千萬美元成本。相比之下,單個用戶的欺詐損失(通常不超過幾十美元)對廠商而言微不足道。消費者也普遍缺乏安全意識,不會因為漏洞公開而改變購買或使用決策。在這種經濟動機缺失的環境下,系統升級難以推進。
關鍵時刻
Pipeline v2帶時間戳的重點,會在逐字稿層級分析上線後產生。目前請先透過原始影片觀看。
事實查核
Pipeline v2說法查證是下一次管線升級的一部分。KeyFrame 只會顯示它真正能驗證的內容。

