Analisi tecnica · spyware

«Assistenza Clienti»: l'app il cui server può accendere il microfono

Un'applicazione presente su Google Play, distribuita come assistenza clienti di un operatore telefonico, non ha quasi nulla dentro di sé: carica la propria schermata dal server di chi la gestisce. E a quel server mette in mano tre leve sul telefono — leggere l'identificativo, registrare il microfono su file, prelevare un file. Non è dedotto dai permessi: è scritto nel suo stesso codice.

Riccardo Bacci — Mythos Sentinel, Terni · 5 settembre 2026

Identità del campione

Di quale app stiamo parlando

  • Nome sullo store — «Assistenza Clienti», distribuita sul canale accesso in anteprima di Google Play, quello con controlli più leggeri.
  • Identificativo del pacchettocom.itassistenzaclienti, versione 1.0.
  • Editore dichiarato — Telecomunicazione Mobile.
  • Certificato di firmaCN=teleit: nessuna organizzazione, nessun paese. Un editore anonimo a fronte di permessi per microfono, gestione delle chiamate e installazione di pacchetti.

La scheda su Play, nella sezione Sicurezza dei dati compilata dall'editore, dichiara «nessun dato raccolto». I contatori di rete del sistema operativo, sul dispositivo di prova, la misurano invece mentre invia 6,5 MB, saliti a 15,1 MB, contro 0,53 MB ricevuti: circa dodici a uno in salita, verso un solo server privato. Non serve sapere cosa stia uscendo perché la dichiarazione risulti smentita: basta il volume.

Il punto decisivo

Tre metodi messi in mano all'HTML remoto

All'avvio l'app è una WebView che carica la propria interfaccia da https://telecomunicazioni-mobile.com/support/. La pagina che serve oggi può cambiare domani, perché è il loro server a deciderla. Ciò che invece è congelato nel pacchetto — e che quindi conta davvero — è cosa quel server può ordinare al telefono.

L'activity principale registra un oggetto nativo con addJavascriptInterface sotto il nome mysupport, ed espone alla pagina remota tre metodi:

  • getToken() — restituisce il codice di abbinamento fra dispositivo e operatore. La pagina osservata durante l'analisi lo interrogava una volta al secondo e lo mostrava come «il tuo ID univoco, comunicalo all'operatore».
  • openVoiceNotesActivity() — avvia una seconda schermata dell'app che possiede un oggetto android.media.AudioRecord e un metodo che restituisce un file: registra il microfono e lo salva su disco. È codice dell'applicazione, non della libreria video di terze parti che incorpora.
  • pickFile(...) — apre un selettore di file: preleva un file dal dispositivo.

Nella stessa activity ci sono i gestori onCallReceived(...) e onUrlReceived(...): il server può anche spingere al telefono eventi di tipo «chiamata» e «apri questo indirizzo».

A corredo

Quattro cose che un'app di assistenza non ha motivo di fare

Impedisce gli screenshot

Ha FLAG_SECURE: le sue schermate si catturano come zero byte mentre il resto del sistema si fotografa normalmente. Né la persona che usa il telefono né un analista possono documentare cosa mostra.

Nasconde le proprie stringhe

Il nome mysupport, gli indirizzi e le azioni sono stringhe cifrate decodificate solo a runtime, e il codice è appesantito da calcoli inutili — xor, moltiplicazioni, resti — il cui unico scopo è rendere illeggibile il flusso.

È generata da uno strumento

Otto classi chiamate tutte ComponentNNNNNNN con numerazione casuale: il codice non è stato scritto a mano.

Chiede poco, ma mirato

Microfono, MANAGE_OWN_CALLS e installazione di pacchetti. Niente fotocamera, SMS, rubrica, posizione o archivio: non è un'app avida, è un'app puntata.

Un dettaglio che chiude il quadro: durante l'analisi il server dell'operatore ha risposto con un errore 502, e in quel momento l'app non ha mostrato e non ha fatto nulla. Senza il proprio server è un guscio vuoto — conferma, per l'ennesima via, che è pilotata interamente dall'esterno.

Ripetibile

Come abbiamo letto il traffico cifrato

L'app non si fida delle autorità di certificazione del sistema, né di quelle che l'utente aggiunge. Nel proprio network_security.xml dichiara una sola radice di fiducia: un file grezzo imbarcato nel pacchetto, res/raw/bundle.pem, con 145 certificati pubblici. Non c'è alcun pinning applicativo. Quel file è l'intera barriera all'ascolto.

  • Abbiamo aggiunto la nostra autorità di analisi a bundle.pem, portandolo da 145 a 146 certificati, e verificato che l'ultimo fosse esattamente il nostro. Essendo un file grezzo e non una risorsa compilata, non è servito alcun decompilatore.
  • Il pacchetto è stato ricomposto come archivio (527 voci, identiche), allineato, e ri-firmato in tutte e quattro le parti — base più gli split arm64_v8a, hdpi e it — con un'unica chiave usa-e-getta, perché l'installazione a più parti pretende una firma coerente.
  • Il traffico del dispositivo è stato instradato al nostro punto d'ascolto. Nessuna autorità è stata aggiunta al sistema operativo: la fiducia è stata messa dentro l'applicazione, dove l'applicazione la cerca.

Al primo avvio il traffico decifrato mostra GET /support/9.html?language=it&packagename=com.itassistenzaclienti che risponde 200 (2.555 byte), seguito da main.css e icon.png. Negli header non viaggia alcun identificatore sensibile in chiaro: solo x-requested-with e il modello del dispositivo.

Il limite, dichiarato

Cosa questa analisi non afferma

Non abbiamo catturato i dati in uscita. Per farlo avremmo dovuto sostituirci all'operatore, ordinare al telefono di accendere il microfono e leggere i byte che tentava di caricare: significa mettere in funzione dal vivo lo strumento di sorveglianza, e non è un'azione che si compie a prescindere dal fine. Quindi qui si parla di capacità dimostrata e comportamento misurato, non di contenuti intercettati.

Per la stessa ragione due cose presenti nel pacchetto non le contiamo come prova. I riferimenti a registrazione dello schermo, WebSocket e caricamento in più parti vengono dall'SDK video di Stream e dalla libreria di rete Retrofit che l'app incorpora: la loro sola presenza non dimostra un uso. E la schermata di registrazione non parte da sola — apre un'interfaccia con pulsanti e richiede un tocco, il che significa che l'operatore deve guidarci la persona al telefono. Lo scriviamo perché la regola che ci siamo dati è descrivere il comportamento, non attribuire l'intenzione.

Per chi difende

Indicatori di compromissione

  • Dominiotelecomunicazioni-mobile.com
  • Indirizzo IP93.186.254.171 (host171-254-186-93.serverdedicati.aruba.it, server dedicato Aruba in Italia — unico destinatario su 30 campionamenti)
  • Pacchetto Androidcom.itassistenzaclienti
  • Certificato di firmaCN=teleit, SHA-256 c37ab648 96d44ffe 831f6309 e5f66541 3f47b42f 6341d1ef a81b23ba 5d6545ad
  • Traccia su disco — una cartella nascosta /storage/emulated/0/.AReaper con dentro un file identificativo

Ricontrollato il 5 settembre 2026: il dominio risolve ancora su quell'indirizzo, il certificato Let's Encrypt è stato rinnovato il 21 luglio 2026 e il pannello risponde ancora 200 con lo stesso script che chiama mysupport.getToken(). L'infrastruttura è mantenuta e attiva.

Questi indicatori sono stati proposti a mvt-indicators, la raccolta usata dal Mobile Verification Toolkit di Amnesty International, così che chiunque usi MVT possa controllare un telefono contro di essi.

Se temi per il tuo telefono

Cosa portarsi a casa

Il travestimento funziona perché è noioso: un'app che si chiama «assistenza clienti», un operatore al telefono, un codice da leggere ad alta voce. Niente di ciò che appare sullo schermo somiglia a un attacco. Le difese pratiche sono altrettanto noiose: installare partendo dalla scheda che hai cercato tu e non da un link che ti hanno mandato, diffidare di qualunque «assistenza» che pretenda una propria app e un codice dettato a voce, e controllare ogni tanto quali app hanno il permesso del microfono.

Mythos Sentinel — cercare spyware e stalkerware su Android

Read this analysis in English →