前幾天有則資安相關新聞,有名高中生竄改悠遊卡餘額後去自助退費機台退刷或小額支付購物,成功變現了數十萬元。坦白說,看到新聞我沒太驚訝,因為類似的事 14 年前(2011)已經上演過一次,不意外地人也很快被抓,最後判刑 2 年,緩刑 5 年,另外要賠 100 萬及義務教電腦 240 小時

由此看來,偷改悠遊卡餘額不是太困難的事,且只要能離線交易就可能矇混過關,但事後一回傳資料保證會被發現,如何偷改盜用還不會被抓到才是真正的挑戰。

我對晶片卡電子交易的想像停在「非對稱式公私鑰」、「由硬體保護私鑰永不外流無法複製」、「暴力破解需幾萬年」(註:量子電腦正要摧毀這道防線)... 哪有可能這麼輕易被破解,因而對悠遊卡多次被竄改感到不解,堂堂電子交易晶片卡好似豆腐做的,EsayCard 連破解都很 Easy。

thumbnail

但好奇歸好奇,資安不是我的主修專業,新聞看過就算了,沒想要再進一步挖掘。

今天看到 Huli 在粉絲專頁分享了破解悠遊卡的技術細節,資訊完備,不搞懂好像對不起原 PO,便順著連結讀了下資料,解開久懸心中的謎團。

其實,在 2010 年 HITCON 大會就有台大電機教授示範破解修改悠遊卡用的 MIFARE Classic 晶片,同一年年底的混沌通訊大會資安研究員 Harald Welte 也做了一場悠遊卡破解的技術分享 - How the EasyCard allows you to print your own digital money,有留下影片跟簡報 (隔年犯案的敦陽資安顧問應該就是看了研討會,一時熱血決定身體力行吧 😄),另外在 Huli 貼文甚至有網友留言分享一篇完整攻略,看來悠遊卡能被破解早已不是祕密。

我志不在動手破解,沒必要深究底層細節,一心只想解答「為什麼悠遊卡怎麼好破解?」,非對稱式金鑰不該這麼脆弱才對。

Harald Welte 投影片對這個議題有完整扼要的整理,是我主要的參考依據,另外我也參考了一些網路資料。以下是重點整理:

  • Harald 是位德國資訊安全專家,對 RFID 讀卡技術有研究,過去曾在台灣打工多年,因而知道悠遊卡。
  • 悠遊卡採用 MiFARE Classic RFID 晶片卡,並沒有使用非對稱式金鑰,而是用 48 位元金鑰的 NPX CRYPTO1 演算法保護資料。
  • MiFARE Classic 最大的敗筆在於採取 Security by Obscurity 策略,意思是透過不取公開演算法及協定細節防止外界找到破解方法。
    然而這種概念如同靠混淆器保護程式邏輯,只怕遇上有心人,被解開是早晚的事。CRYPTO1 在 2008 年就已被人用逆向工程破解並公開(論文),導致金鑰可被破解,幾已無安全性可言。
  • 題外話:我心中真正安全的做法應遵守 柯克霍夫原則 / Kerckhoffs Principle - 一個加密系統的安全性應該只依賴於金鑰的保密,而非演算法的保密。
    延伸閱讀:密碼要怎麼儲存才安全?該加多少鹽?-科普角度
  • 悠遊卡若只做為大捷運輸小額付費,或採線上交易能即時檢核,就算被破解問題也不大,主要是獲利有限,犯罪動機不強(沒什麼人會花功夫偽造一元硬幣)。但後來悠遊卡使用範圍擴展到商店支付,卡片可儲值高達一萬元新台幣且允許離線交易,提高被攻擊的可能性。
  • MIFARE Classic 是基於 ISO 14443 的 13.56 MHz RFID 卡系統,具有 1024 或 4096 位元儲存空間,分為扇區和區塊,毎個區塊可設定不同金鑰加密保護。
  • 悠遊卡並未使用預設的製造商金鑰,而是在所有扇區都設了自訂金鑰。Harald 使用了開源的 MFCUK (MiFare Classic Universal toolKit,MiFARE Classic 專用破解工具包),對晶片卡進行 Dark Side Attack (針對 NXP MiFARE Classic RFID 的金鑰還原攻擊技巧),利用卡片內部隨機數產生器 (RNG) 隨機數(Nonce)可被預測或重複利用的弱點,反覆與目標卡片進行認證協議,蒐集足夠資料後再利用 CRYPTO1 已知弱點算出特定分區的金鑰。最後 Harald 花了大約三小時還原出所有扇區的 A / B 金鑰。
  • 取得分區金鑰後即可讀取或寫入該分區資料,進而竄改卡片內容或複製卡片。
    悠遊卡的餘額資訊存在扇區 2 中,並採用 MIFARE value block 設計,即實際的計數器值會儲存三次(正向、反向),並允許透過不同的密鑰進行增減操作。但既然演算法已知,再複雜都能被算出來。
  • 除了餘額之外,扇區 3 到 5 儲存了交易日誌,每筆記錄包含交易 ID、費用、餘額、捷運站代碼、RFID 讀取器 ID、交易類型和時間戳。扇區 7 則儲存最近一次捷運進出站記錄,扇區 15 則記錄了每日最高消費金額。
  • Harald 測試了減少卡片餘額、增加卡片餘額以及繞過每日消費上限,並在實際商店和公共交通系統使用修改後的卡片完成驗證,確認了人工增加的金額可以正常消費且不會被後續儲值操作抵消(儘管他最後強調並未從中獲利)。

簡單總結:悠遊卡用的 MiFARE Classic 沒有用能防暴力破解的高強度金鑰,而是企圖靠不公開演算法讓人猜不到(Security by Obscurity),該演算法早在 2008 年被人逆向工程破解,找出還原金鑰的做法。2010 年資安研討會已有破解悠遊卡修改餘額的相關研究發表(隔一年就有資安顧問照著做被抓)。針對悠遊卡所用晶片卡的破解軟體工具、破解資料齊全,要破解並不算難事。

只是花了一堆功夫,只能離線小額交易一點一點回收,又幾乎篤定會被抓,好個扛賣白粉的風險,收賣白菜的錢,會這麼幹的人真的聰明嗎?


Comments

# by ChrisTorng

也許已經有很多人很小心地賺錢,都沒被發現,沒上新聞?

Post a comment