閃付卡(QuickPass)隱私泄露原理


0×00 前言

說到閃付卡,首先要從EMV開始,EMV是由Europay,MasterCard和VISA制定的基於IC卡的支付標准規范。目前基於EMV卡的非接觸式支付的實現有三個:VISA的payWave,MasterCard的PayPass以及銀聯的閃付QuickPass。目前從外觀來看,銀聯發行的卡面有芯片的IC卡均支持閃付,部分銀行支持VISA的payWave。

0×01 閃付卡隱私泄露風險

想象一下當路人拿着巴掌大的設備靠近你的時候,你身上的銀行卡的卡號、發卡行、最近十筆的交易記錄等,甚至是姓名、身份證號都泄露出去將會有多恐怖。通過這些信息攻擊者就可以大致刻畫出卡主人的消費習慣和生活水平等等。當然,這並不是閃付卡或金融IC卡的“漏洞”,這些信息是需要在交易過程中由POS機發送給發卡行進行驗證的。

0×02 閃付卡工作流程

本文所指的工作流程只局限在跟信息泄露相關的流程上,不涉及數據認證、支付、聯機交易等內容。

應用選擇

(2PAY.SYS.DDF01)

應用初始化

讀取數據

后續流程等

應用選擇

應用選擇包括目錄選擇法 與 AID列表法。讀卡器會首先使用目錄選擇法,如果失敗,則會使用AID列表法。簡單來說,目錄選擇法就是讀卡器從卡片讀取其所支持的所有應用,而AID列表法則是讀卡器將其所支持的所有應用一個一個發給卡片,當有響應時則卡片支持該應用,無響應則不存在。而后構造出一個支持的列表,供讀卡器或持卡人選擇。以目錄選擇法為例:

SELECT的命令報文格式為為00 A4 04(通過名稱選擇) 00(僅有一個) + 數據長度 + DATA的ASCII碼
如選擇qPBOC
00 A4 04 00 0E + 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 (2PAY.SYS.DDF01的ASCII碼)

應用初始化

此處與交易有關,與本文隱私泄露關系不大,但因為是中間步驟,所以做簡單描述。在上一步應用選擇時卡片返回了PDOL(處理選項數據對象列表,可以理解為由卡片提供的組包格式),應用初始化時,按照PDOL組包向卡片發送GPO命令,包括金額、時間、國家代碼、貨幣代碼等。進入GPO就代表着交易的開始。

讀取數據

此部分是我們主要關注的位置,通過GET DATA或READ RECORD命令來讀取,READ RECORD通過SFI讀取數據內容,主要關注的是讀取個人化數據(DGI),GET DATA讀取一些標簽里的內容(如貨幣代碼、金額限制、上限、交易日志格式等)。DGI的第一個字節為01-1E,是SFI,第二個字節是記錄編號。常用的DGI有0101(2磁道等價數據、持卡人姓名(不建議存儲)、1磁道自定義數據) 0102(2 磁道等價數據、1磁道自定義數據),0201(數據認證數據)等,具體的DGI表可參考《中國金融集成電路(IC)卡規范》的第十部分 表1。

GET DATA的命令報文的格式為80CA + 標簽 + 00

如讀取電子現金余額(9F79)發送 80CA9F7900。

READ RECORD的命令報文的格式為00B2 + 記錄號 + 引用控制參數 + 00

其中引用控制參數為 SFI(Bin)左移三位 + 100(Bin)

 如讀取DGI0101時,第一個01為SFI,第二個01為編號。計算引用控制參數如下,0000 0001左移三位得到00001 + 100 得到 0000 1100轉換為Hex為 0C,得到的APDU為 00 B2 01 0C 00。

0×03 測試過程

需要准備的工具如下:

ACR122u或同類支持APDU的讀卡器

讀卡器驅動及應用

支持閃付的銀行卡

本文使用的測試卡如下圖所示:

下面操作均會以ACR122U為讀卡器操作,在安裝好驅動及ACR122U Tool后,插入讀卡器並啟動ACR122U Tool。首先連接讀卡器設備,點擊菜單中的Reader Commands -> New connection

連接成功后,可以使用該工具直接發送APDU,點擊 Send Commands -> APDU Command

按照閃付卡的工作流程構造APDU發包,第一步是應用選擇,選擇qPBOC(2PAY.SYS.DDF01)

APDU:00 A4 04 00 + 0E + 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 (2PAY.SYS.DDF01的ASCII)
​
響應包如下
6F 30 (FCI文件控制信息)
84 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 (DF專用文件,2PAY.SYS.DDF01的ASCII)
A5 1E (FCI專用模板)
BF 0C 1B (FCI自定義數據)
61 19 (目錄入口)
4F 08 A0 00 00 03 33 01 01 01 (返回的AID,下一步選擇的AID)
50 0A 50 42 4F 43 20 44 45 42 49 54 (應用標簽,此處為PBOC DEBIT)
87 01 01(應用優先指示器)
90 00 (狀態字:正常)

得到下一步的AID:A0 00 00 03 33 01 01 01,選擇該AID

APDU:00 A4 04 00 + 08 + A0 00 00 03 33 01 01 01
​
響應包如下
6F 54 (FCI文件控制信息)
84 08 A0 00 00 03 33 01 01 01 (DF名稱)
A5 48 (FCI專用模板)
50 0A 50 42 4F 43 20 44 45 42 49 54 (應用標簽,此處為PBOC DEBIT)
87 01 01 (應用優先指示器)
9F 38 18 9F 66 04 9F 02 06 9F 03 06 9F 1A 02 95 05 5F 2A 02 9A 03 9C 01 9F 37 04 (PDOL)
5F 2D 02 7A 68 (首選語言,zh)
9F 11 01 01 (發卡行代碼索引)
9F 12 0A 50 42 4F 43 20 44 45 42 49 54 (應用首選名稱,PBOC DEBIT)
BF 0C 05 9F 4D 02 0B 0A (發卡行自定義數據,9F4D為交易日志入口標簽)
90 00 (狀態字) 

接下來可以進行讀取數據的部分了,首先讀取DGI0201里存儲的數據。其數據定義如下表:

要讀取DGI0201,計算APDU如下,0000 0010 左移三位 得到 00010 加 100 得到 0001 0100 即 14(Hex)

APDU:00 B2 01 14 00
​
響應包如下
70 46 (模板)
5F 24 03 25 12 31 (25年12月31日失效日期)
5F 25 03 15 05 14 (15年05月14日生效日期)
5A 08 62 26 xx xx xx xx 45 00 (卡號)
9F 07 02 FF 00 (應用使用控制)
8E 0C 00 00 00 00 00 00 00 00 02 03 1F 00 
9F 0D 05 D8 60 04 A8 00 
9F 0E 05 00 10 98 00 00 
9F 0F 05 D8 68 04 F8 00 
5F 28 02 01 56 (0156中國)
90 00 (狀態字:成功)

此處可以獲取卡的生效日期、失效日期、卡號等內容,接下來嘗試讀取磁條2和持卡人信息的數據,需要讀取DGI0101和DGI0102,,經過上述方法計算需要發送的APDU為:

APDU:00 B2 01 0C 00
​
響應包如下
70 15 (模板)
57 13 62 26 22 10 06 40 45 00 (2磁道卡號)
D2 51 2 (有效期 25/12)
2 20 00 98 78 32 00 00 0F (補足)
90 00 (狀態字:成功)

APDU:00 B2 02 0C 00
​
響應包如下
70 36 (模板)
9F 61 12 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 (證件號,此處為空)
9F 62 01 05 (證件類型)
5F 20 1A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 (姓名ASCII,此處為空)
90 00 (狀態字:成功)

接下來嘗試讀取一下交易記錄,這里要注意首先要獲取交易記錄的格式,銀聯給出了推薦格式:

但是注意這里只是推薦格式,每個銀行的卡片實現不一定相同,所以讀取交易記錄時應先獲取交易記錄的格式,使用GET DATA命令讀取9F4F標簽(交易日志格式),根據該格式結合READ RECORD讀取出的交易日志解析。首先讀取交易日志格式:

APDU:80 CA  9F4F  00
​
響應包如下
9F 4F 19 
9A 03 
9F 21 03 
9F 02 06 
9F 03 06 
9F 1A 02
5F 2A 02 
9F 4E 14 
9C 01 
9F 36 02 
90 00 

經過比對發現與推薦格式相同,之后可以通過READ RECORD命令讀取從1-10讀取交易日志。首先要找到在選擇AID的時候的回包,9F4D指出了交易日志入口,通常為0B,根據上文計算其SFI為 0101 1100即5C。之后再構造APDU循環讀取其十條交易記錄

APDU:00 B2 01 5C 00:
​
響應包如下
17 09 13 (17年9月13號)
16 45 38 (16:45:38)
00 00 00 35 00 00 (3500.00元)
00 00 00 00 00 00 (其他金額)
01 56 (中國)
01 56 (人民幣)
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A (空)
21 (交易類型)
00 31 (應用交易計數器)
90 00 (狀態字:成功)

下表為使用手里現有的銀行卡的測試情況。

0×04 腳本

我們已經可以使用APDU發送的工具,獲取想要獲得的信息,剩下的工作就是腳本化。可以使用ACR122U的SDK,其提供了Delphi,Java,VB,C#,C++等語言,但個人更願意通過Python來實現,通過使用Python的pyscard庫,可以實現該功能。

0×05 防護方式

防護的措施可以考慮與讀卡器保持足夠的距離、使用鋁箔包裹卡片、專業的Pacsafe下屬的RFIDSafe系列或簡單便捷的屏蔽卡套等措施。原理都是通過金屬或液體屏蔽來屏蔽高頻信號。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM