Appunti di mobile malware analysis – revisione e aggiornamento (ottobre 2026)
Nota di revisione
Ho ripreso alcuni appunti, risalenti ormai al 2024 , li ho verificati sulla documentazione ufficiale corrente (MVT, androidqf, PortSwigger, Android Developers) e su fonti di threat intelligence. Pensavo fosse cambiato poco e invece:
- MVT non analizza più i dispositivi Android “dal vivo” via ADB. Il comando
check-adb, deprecato nella v2.7.0, è stato rimosso: la procedura supportata è acquisizione con androidqf → analisi conmvt-android check-androidqf. Anche il controllo VirusTotal si esegue ora sull’acquisizione androidqf. - Il repository di androidqf è passato sotto mvt-project (
github.com/mvt-project/androidqf); la mia versione 1.6 negli appunti è superata. - iOS: un backup cifrato va prima decifrato con
mvt-ios decrypt-backup;check-backuplanciato direttamente sul backup cifrato non funziona. Aggiunta l’analisi di sysdiagnose /shutdown.log. - MVT usa ora il calendar versioning (es. v2026.7.29, v2026.9.1) con rilasci mensili; l’installazione raccomandata è da PyPI (
pipx install mvt), quella da Git è per lo sviluppo. - Burp Suite su Android: spiegato perché da Android 7 serve il root (le app non si fidano delle CA installate dall’utente) e aggiunte le complicazioni di Android 14 (store CA nel modulo APEX Conscrypt). Le procedure valgono anche per Burp Community.
- Sezioni teoriche: verificate e corrette. Le correzioni puntuali sono nel Registro delle modifiche (§ 8).
- Data la pubblicazione sul blog, ho aggiunto una premessa metodologica forense, una tabella di strumenti open source integrativi e uno use case operativo.
1. Premessa metodologica
MVT e Burp rispondono a due domande diverse e vanno usati in momenti diversi.
| MVT + androidqf / libimobiledevice | Burp Suite (e proxy affini) | |
| Domanda | Questo dispositivo mostra tracce di compromissione note? | Che cosa trasmette questa app e a chi? |
| Natura | Triage forense consensuale, basato su IOC (STIX2) ed euristiche | Analisi dinamica del traffico (man-in-the-middle) |
| Dove | Sul dispositivo oggetto di verifica, con acquisizione documentata | In laboratorio, su dispositivo di test o emulatore con il campione |
| Esito | Rilevamento di indicatori noti; un esito negativo non prova l’assenza di compromissione | Endpoint C2, dati esfiltrati, protocolli |
Alcuni punti fermi, coerenti con ISO/IEC 27037 e NIST SP 800-101 Rev. 1:
- Autorizzazione e consenso. La verifica di un dispositivo altrui richiede titolo (consenso informato del titolare o provvedimento dell’Autorità Giudiziaria). In ambito penale valutare se l’operazione sia un accertamento ripetibile (art. 359 c.p.p.) o non ripetibile (art. 360 c.p.p.).
- Invasività minima e documentata. androidqf installa temporaneamente un agente di raccolta sul telefono e l’attivazione del Debug USB modifica le impostazioni: ogni azione va annotata (ora, operatore, comandi). androidqf produce command.log, acquisition.json e hashes.csv; MVT registra il proprio command.log.
- Integrità. Calcolare e verbalizzare gli hash (SHA-256) dell’archivio di acquisizione; conservare l’acquisizione grezza, così da poterla rianalizzare con IOC più recenti senza toccare di nuovo il dispositivo.
- Niente MITM sui reperti. Installare una CA di Burp e instradare il traffico di un dispositivo in sequestro altera il reperto e può esporre comunicazioni di terzi. L’analisi dinamica si fa sul campione (APK/IPA) in ambiente controllato.
- Riservatezza. L’invio di hash a VirusTotal è un’interrogazione verso un servizio esterno: è opt-in in MVT e va valutato caso per caso. Non caricare mai i campioni senza autorizzazione.
2. Mobile Verification Toolkit (MVT)
Repository: https://github.com/mvt-project/mvt – Documentazione: https://docs.mvt.re
MVT è sviluppato originariamente dall’Amnesty International Security Lab. Confronta gli artefatti estratti da dispositivi Android e iOS con indicatori di compromissione in formato STIX2 (Structured Threat Information Expression, https://oasis-open.github.io/cti-documentation/stix/intro.html) e segnala anomalie note (ad es. processi, domini, percorsi o profili di configurazione sospetti).
2.1 Installazione (Ubuntu/Kali)
MVT richiede Python 3.10 o superiore ed è supportato ufficialmente su Linux e macOS.
sudo apt install python3 python3-venv python3-pip sqlite3 libusb-1.0-0
sudo apt install pipx # Ubuntu 23.04+ / Kali
pipx ensurepath # poi aprire un NUOVO terminale
pipx install mvt # versione stabile da PyPI (raccomandata)
libusb-1.0-0serve solo permvt-android.- Sulle versioni Ubuntu 22.04 o precedenti:
python3 -m pip install --user pipx && python3 -m pipx ensurepath. - L’installazione da Git (
pipx install --force git+https://github.com/mvt-project/mvt.git) è destinata a provare funzioni in sviluppo; per tornare alla versione PyPI occorre primapipx uninstall mvt. - Il pacchetto installa tre comandi:
mvt(comandi comuni),mvt-ios, mvt-android. Verifica:mvt-android version. - Per Android servono gli Android SDK Platform-Tools aggiornati (
adb): i pacchetti delle distribuzioni (sudo apt install adb) possono essere troppo vecchi per i dispositivi recenti; in caso di problemi usare quelli ufficiali Google. - È disponibile anche un’immagine Docker (dalla release v2026.9.1 anche per ARM64).
2.2 Indicatori di compromissione (IOC)
mvt download-iocs # scarica gli indicatori pubblici e li carica automaticamenteModo 1: opzione --iocs nel comando di analisi. Vale solo per quell’esecuzione. Puoi ripetere l’opzione per caricare più file:
mvt-android check-androidqf --iocs ~/ioc/campagna1.stix2 --iocs ~/ioc/campagna2.stix2 \ --output ~/casi/2026-001/mvt/ ~/casi/2026-001/<UUID>/
Modo 2: variabile d’ambiente MVT_STIX2. La imposti una volta e vale per tutti i comandi MVT lanciati da quel terminale. I percorsi dei file vanno separati con :. Dopo l’export lanci l’analisi normalmente, senza --iocs:
export MVT_STIX2="/home/user/IOC1.stix2:/home/user/IOC2.stix2" mvt-android check-androidqf --output ~/casi/2026-001/mvt/ ~/casi/2026-001/<UUID>/
Raccolte pubbliche principali:
- Amnesty International — https://github.com/AmnestyTech/investigations (Pegasus, Predator/Cytrox, campagne Android, NoviSpy…)
- MVT project — https://github.com/mvt-project/mvt-indicators
- Stalkerware — https://github.com/Te-k/stalkerware-indicators (include un file STIX compatibile con MVT)
Il download non è automatico a ogni esecuzione: rilanciare mvt download-iocs prima di ogni analisi e verbalizzare la data degli indicatori usati.
3. Android
3.1 Che cosa è cambiato
L’analisi diretta via ADB (mvt-android check-adb) è stata rimossa da MVT. Secondo la documentazione, la raccolta via ADB era incoerente tra produttori e versioni, incompleta e duplicava i moduli di analisi. Il flusso supportato è ora in due fasi separate:
- Acquisizione con androidqf (binario Go autonomo, con un agente di raccolta che non dipende dalla shell del telefono e non richiede Python sul PC del titolare).
- Analisi con
mvt-android check-androidqf, anche in un secondo momento e su una macchina diversa.
Comandi mvt-android d’interesse oggi:
| Comando | Uso |
| check-androidqf | Analizza un’acquisizione androidqf (cartella o archivio) – flusso principale |
| check-bugreport | Analizza un bug report Android generato a parte (.zip) |
| check-backup | Analizza un backup Android (adb backup, oggi utile quasi solo per gli SMS) |
| check-intrusion-logs | Analizza gli Intrusion Logs di Android Advanced Protection raccolti separatamente |
| check-iocs | Riconfronta risultati JSON già prodotti con nuovi IOC |
| download-iocs | Scarica gli indicatori STIX2 pubblici |
| version | Versione installata |
L’elenco esatto per la propria versione si ottiene con mvt-android --help.
3.2 Preparazione del dispositivo
- Attivare le Opzioni sviluppatore (toccare 7 volte Numero build), poi Debug USB; utile anche Rimani attivo (lo schermo non si blocca durante la raccolta).
- Collegare via USB, sbloccare il telefono e autorizzare l’impronta RSA del PC alla richiesta.
- Verificare:
adb devicesdeve mostrare il dispositivo come device (nonunauthorized).
3.3 Acquisizione con androidqf
Repository: https://github.com/mvt-project/androidqf (fork mantenuto dal progetto MVT del progetto originario botherder/androidqf). Le release contengono eseguibili per Linux, Windows e macOS.
# scaricare l'ultima release per linux_amd64 da .../androidqf/releases/latest
chmod +x androidqf_vX.Y.Z_linux_amd64
./androidqf_vX.Y.Z_linux_amd64 # modalità interattiva
In modalità interattiva androidqf chiede: tipo di backup (nessuno / solo SMS / completo), quali APK scaricare (nessuno / solo non di sistema / tutti), se rimuovere le copie di APK di sistema già attendibili, se raccogliere gli Intrusion Logs. Ogni scelta ha un flag equivalente, utile per procedure standardizzate:
./androidqf -serial <seriale> -backup none -download all -non-interactive -output /casi/2026-001/
Flag principali: -backup/-b, -download/-d, -remove-trusted/-r, -intrusion-logs/-i, -hash-files/-H, -browser-history e -magisk-modules (questi due richiedono root). Il backup completo richiede comunque la conferma sullo schermo del telefono.
Output. Un archivio di acquisizione nella cartella corrente (o in -output) contenente, tra l’altro: proprietà di sistema (getprop), impostazioni, processi, servizi, dumpsys, log, elenco pacchetti con hash (packages.json) ed eventuali APK, bug report, files.json, acquisition.json, hashes.csv, command.log.
Cifratura dell’acquisizione (consigliata). Se nella cartella di lavoro è presente un file key.txt con una o più chiavi pubbliche age (una per riga), androidqf produce direttamente <UUID>.zip.age. Decifratura sulla postazione di analisi:
age --decrypt -i ~/chiavi/privata.txt -o <UUID>.zip <UUID>.zip.age
3.4 Analisi con MVT
mvt download-iocs
mvt-android check-androidqf --output ~/casi/2026-001/mvt/ ~/casi/2026-001/<UUID>/
- VirusTotal (opzionale, opt-in). Interroga gli hash SHA-256 dei soli APK non di sistema. La chiave si passa con la variabile
MVT_VT_API_KEY(o il valore di configurazioneVT_API_KEY). Per non esaurire la quota gratuita MVT attende 16 secondi tra le richieste; regolabile con--delay:
MVT_VT_API_KEY=<chiave> mvt-android check-androidqf --virustotal --delay 30 ~/casi/2026-001/<UUID>/
- Bug report generato a parte (quando non si può usare androidqf):
mvt-android check-bugreport ~/percorso/bugreport.zip. Il valore diagnostico è limitato: il formato cambia tra versioni e produttori. - Backup Android:
mvt-android check-backup ~/percorso/backup.ab. I backup locali sono in via di dismissione e contengono pochi dati (le app salvano sul cloud). - Riconfronto con nuovi IOC su risultati già prodotti:
mvt-android check-iocs --iocs nuovo.stix2 ~/casi/2026-001/mvt/. - Intrusion Logs (Android 16, Advanced Protection). Se sul dispositivo è attiva la modalità Advanced Protection con Intrusion Logging, androidqf può scaricarli e decifrarli (la chiave è protetta dal PIN del dispositivo);
check-androidqfli analizza automaticamente (query DNS, connessioni in uscita, avvio di processi, attività ADB). - Dalle versioni recenti MVT segnala anche chiavi ADB attendibili inattese sul dispositivo: un indizio utile se qualcuno ha avuto accesso fisico al telefono con il debug attivo.
Leggere i risultati. Nella cartella di output MVT scrive un JSON per modulo, i file *_detected.json con le sole corrispondenze, timeline.csv / timeline_detected.csv e il proprio log. Le righe di avviso (WARNING) indicano corrispondenze con IOC o euristiche: vanno verificate, non sono conclusioni. Ogni positivo va confermato su altri artefatti; un negativo non dimostra che il dispositivo sia pulito (gli IOC coprono solo campagne note e gli strumenti, essendo open source, possono essere studiati dagli attaccanti).
3.5 Connessione via Wi-Fi (ADB senza cavo)
Con la rimozione di check-adb questa parte non riguarda più direttamente MVT, ma resta utile per adb/androidqf quando la porta USB non è utilizzabile. Per un’acquisizione forense preferire sempre l’USB: il Wi-Fi introduce una rete e un canale aggiuntivi da documentare.
Android 11 e successivi – Debug wireless con abbinamento:
- PC e telefono sulla stessa rete Wi-Fi.
- Opzioni sviluppatore → Debug wireless → Associa dispositivo con codice di accoppiamento: annotare IP, porta e codice.
- Sul PC:
adb pair <IP>:<porta>e inserire il codice. - Verificare con
adb devices(eventualmenteadb connect <IP>:<porta>usando la porta mostrata nella schermata principale di Debug wireless, diversa da quella di abbinamento).
Android 10 e precedenti — metodo legacy:
adb devices # dispositivo collegato via USB, debug USB autorizzato
adb tcpip 5555 # mette adbd in ascolto TCP sulla porta 5555
# scollegare il cavo
adb connect <indirizzo_IP>:5555
adb devices # deve comparire <indirizzo_IP>:5555 device
Il dispositivo di rete si indica ad adb (e agli strumenti che lo usano, come androidqf con -serial) con la forma IP:porta. Al termine: adb disconnect e disattivare il debug wireless.
3.6 Burp Suite con un dispositivo Android
Riferimento: https://portswigger.net/burp/documentation/desktop/mobile/config-android-device (valida per Burp Professional e Community).
- Listener: Settings → Tools → Proxy → Proxy listeners → Add; porta libera (es. 8082), All interfaces.
- Proxy sul dispositivo: impostazioni della rete Wi-Fi → Proxy Manuale → IP del PC con Burp e porta del listener. Sugli emulatori il proxy si imposta dalle impostazioni dell’emulatore.
- Certificato CA: esportare la CA di Burp in formato DER con estensione esplicita .der (o .cer) e installarla sul dispositivo.
- Test: Proxy → Intercept on, aprire un sito HTTPS dal browser del dispositivo e verificare il traffico in HTTP history.
Perché “da Android 7 serve il root”. Da Android 7.0 (API 24) le app che dichiarano targetSdkVersion ≥ 24 si fidano per impostazione predefinita solo delle CA di sistema, non di quelle installate dall’utente (la Network Security Configuration dell’app può cambiare questo comportamento). Installare la CA come utente basta quindi per il browser, non per la maggior parte delle app. Per intercettare le app occorre una delle strade seguenti:
- CA nello store di sistema (richiede root o un emulatore con immagine Google APIs, non Google Play). Da Android 14 le CA di sistema sono nel modulo APEX Conscrypt (/apex/com.android.conscrypt/cacerts), immutabile: il classico remount di /system non basta più e servono tecniche apposite (bind-mount nei namespace dei processi, moduli Magisk dedicati), valide fino al riavvio.
- Modifica dell’app in laboratorio per farle accettare le CA utente: ad es. apk-mitm (ripacchettizza l’APK modificando la Network Security Configuration e disattivando i controlli di certificate pinning più comuni).
- Instrumentazione dinamica con Frida / objection per aggirare il certificate pinning a runtime.
- In alternativa a Burp: mitmproxy o HTTP Toolkit (open source, con automazioni specifiche per Android) o PCAPdroid (vedi § 5).
Il root, come ricorda PortSwigger, compromette il modello di sicurezza del dispositivo: farlo solo su dispositivi di test.
4.iOS
4.1 libimobiledevice
ideviceinfo # verifica se la suite è presente e il dispositivo visibile
sudo apt install libimobiledevice-utils # altrimenti installarla
Se ideviceinfo non vede il dispositivo collegato:
sudo usbmuxd -f -v # avvia il demone in primo piano con output dettagliato
idevicepair pair # poi confermare "Autorizza" e inserire il codice sul telefono
4.2 Backup con idevicebackup2
Abilitare la cifratura del backup: un backup cifrato contiene più dati (ad es. portachiavi, cronologia Safari, dati salute, alcune impostazioni di rete), utili all’analisi.
idevicebackup2 -i encryption on # imposta una password di backup
idevicebackup2 -i changepw # se ne esiste già una nota e si vuole cambiarla
idevicebackup2 -i encryption off # disattiva (richiede la password attuale)
idevicebackup2 backup --full /casi/2026-002/backup/
Se la password di backup preesistente è sconosciuta e non è modificabile, l’alternativa è un backup non cifrato (meno dati) oppure, previo consenso del titolare, il reset della password di backup da Impostazioni → Generali → Trasferisci o inizializza iPhone → Inizializza → Inizializza tutte le impostazioni (non cancella i dati, ma reimposta le impostazioni: va verbalizzato).
4.3 Decifrare e controllare il backup con mvt-ios
Un backup cifrato va decifrato prima del controllo.
# la password via variabile d'ambiente evita di lasciarla nella riga di comando
read -s MVT_IOS_BACKUP_PASSWORD && export MVT_IOS_BACKUP_PASSWORD
mvt-ios decrypt-backup -d /casi/2026-002/decrypted/ /casi/2026-002/backup/<UDID>/
unset MVT_IOS_BACKUP_PASSWORDmvt download-iocs
mvt-ios check-backup --output /casi/2026-002/mvt/ /casi/2026-002/decrypted/
In alternativa: mvt-ios extract-key -k /percorso/chiave /percorso/backup salva la chiave di decifratura grezza, da usare poi con decrypt-backup (opzione --key-file). La chiave è un dato sensibile: custodirla come il reperto. Per acquisizioni full file system (dispositivi jailbroken o strumenti commerciali) esiste mvt-ios check-fs.
4.4 Sysdiagnose e shutdown.log
Il sysdiagnose è un archivio di log di sistema generato dal dispositivo (combinazione di tasti volume + laterale, poi recupero da Impostazioni → Privacy e sicurezza → Analisi e miglioramenti → Dati analisi). Contiene shutdown.log (in system_logs.logarchive/Extra), che registra a ogni riavvio i processi ancora attivi: Kaspersky (gennaio 2024) ha mostrato che infezioni Pegasus, Reign e Predator lasciano tracce ricorrenti, come processi “appiccicosi” che ritardano lo spegnimento e percorsi di esecuzione anomali (/private/var/db/, /private/var/tmp/).
mvt-ios check-sysdiagnose --output ./risultati ./sysdiagnose_AAAA.MM.GG_hh-mm-ss+0200.tar.gz
mvt-ios check-sysdiagnose --list-modules ./sysdiagnose_....tar.gz # mostra i moduli disponibili
Nota: il comando esiste dalle release 2026; i controlli forensi sono forniti da moduli/plugin installati, senza i quali MVT registra solo le informazioni del dispositivo. Strumento complementare: gli script open source iShutdown di Kaspersky (https://github.com/KasperskyLab/iShutdown). Il metodo dipende dai riavvii: chiedere al titolare di non riavviare dopo il sospetto potrebbe far perdere informazioni, mentre il riavvio periodico è comunque una buona misura difensiva – valutare caso per caso.
4.5 Burp Suite con un dispositivo iOS
Riferimento: https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device (la pagina cita Burp Professional, ma i passaggi funzionano anche con la Community Edition).
Impostazioni del proxy in Burp:
- Settings → Tools → Proxy.
- In Proxy listeners fare clic su Add.
- Scheda Binding: Bind to port 8082 (o altra porta libera); selezionare All interfaces, OK, confermare con Yes.

Listener di Burp su tutte le interfacce
Impostazioni del proxy su iOS:
- Impostazioni → Wi-Fi, connettersi alla stessa rete del PC.
- Toccare l’icona (i) accanto alla rete.

Dettaglio della rete Wi-Fi
- Configura proxy → Manuale.
- Server: IP del PC con Burp; Porta: 8082; Salva.

Proxy manuale su iOS
Installazione della CA di Burp (necessaria per HTTPS):
- Con Burp in esecuzione, aprire in Safari
http://burpsuitee quindi tap su CA Certificate. - In Impostazioni tap su Profilo scaricato → Installa → Installa → Fine (i profili installati sono poi in Impostazioni → Generali → VPN e gestione dispositivi).

Installazione del profilo
- Impostazioni → Generali → Info → Impostazioni attendibilità certificati: attivare l’interruttore per PortSwigger CA.

Attendibilità del certificato
Test: in Burp Proxy → Intercept → Intercept is off per attivarlo; aprire una pagina HTTPS dal dispositivo: la pagina deve caricarsi senza avvisi e le richieste devono comparire in Burp.
Limiti. Le app con certificate pinning rifiuteranno comunque la connessione; su iOS aggirarlo richiede jailbreak e Frida/objection. Al termine rimuovere il profilo e disattivare il proxy: una CA di intercettazione lasciata attendibile è essa stessa un rischio.
5. Strumenti open source integrativi
| Strumento | Piattaforma | A che cosa serve | Note |
| androidqf | Android | Acquisizione rapida per MVT | https://github.com/mvt-project/androidqf |
| iShutdown | iOS | Analisi di shutdown.log da sysdiagnose | https://github.com/KasperskyLab/iShutdown |
| ALEAPP / iLEAPP | Android / iOS | Parsing di artefatti e report HTML (app, posizioni, uso) | Complementari a MVT per la ricostruzione degli eventi |
| MobSF | Android / iOS | Analisi statica (e dinamica su Android) di APK/IPA, report | https://github.com/MobSF/Mobile-Security-Framework-MobSF; mantenerlo aggiornato (vulnerabilità note nel 2026) |
| jadx / apktool | Android | Decompilazione DEX → Java; disassemblaggio smali e risorse | Base dell’analisi statica manuale |
| APKiD | Android | Identifica packer, offuscatori, compilatori | Indica se il campione è stato “protetto” |
| Quark-Engine | Android | Valutazione comportamentale (regole) di APK | Utile per lo smistamento di molti campioni |
| Ghidra | Multi | Reverse engineering di librerie native (.so) e binari iOS | Alternativa open source a IDA Pro |
| Frida / objection | Android / iOS | Instrumentazione dinamica, bypass di pinning e anti-root | Solo su dispositivi di test |
| apk-mitm | Android | Prepara un APK per l’intercettazione HTTPS | Ripacchettizza: l’APK non è più quello originale |
| mitmproxy | Multi | Proxy di intercettazione scriptabile (Python) | Alternativa a Burp per automatizzare |
| HTTP Toolkit | Multi | Intercettazione con configurazione guidata di Android | Versione base open source |
| PCAPdroid | Android | Cattura del traffico senza root (VPN locale), export PCAP, decifratura TLS via addon mitmproxy | https://github.com/emanuele-f/PCAPdroid; ottimo anche per il triage sul campo |
| Wireshark / tcpdump | Multi | Analisi dei PCAP | Con SSLKEYLOGFILE per il TLS decifrato |
| SpyGuard (erede di TinyCheck) | Rete | Hotspot Wi-Fi che segnala comunicazioni verso infrastrutture di stalkerware/spyware | Analisi di rete senza toccare il telefono |
| age | Multi | Cifratura delle acquisizioni androidqf | https://github.com/FiloSottile/age |
6. Use case: sospetto stalkerware su uno smartphone Android
Scenario illustrativo, costruito per la formazione.
Contesto. Una donna denuncia atti persecutori (art. 612-bis c.p.) da parte dell’ex compagno, che sembra conoscere i suoi spostamenti e il contenuto di alcune conversazioni. Riferisce che, mesi prima, l’uomo ha avuto per qualche ora il suo telefono (Android 14). Chiede di verificare il dispositivo e presta consenso informato scritto.
Obiettivo. Stabilire se sul telefono sono presenti applicazioni di sorveglianza note o tracce compatibili, documentando l’attività in modo utilizzabile nel procedimento.
6.1 Prima di toccare il telefono
- Sicurezza della persona. Rimuovere uno stalkerware può avvisare chi lo controlla e aggravare il rischio. La decisione su se e quando rimuoverlo va presa insieme alla persona e, se coinvolto, al centro antiviolenza (cfr. le indicazioni della Coalition Against Stalkerware, https://stopstalkerware.org).
- Titolo e verbale. Consenso (o provvedimento), qualificazione dell’atto (ripetibile o no), operatori, orari, stato del dispositivo all’arrivo (acceso, batteria, rete, foto dello schermo).
- Isolamento. Modalità aereo con Wi-Fi spento, salvo diversa scelta motivata: se interessa osservare il traffico in uscita, si valuta un’analisi di rete separata (vedi 6.5).
6.2 Acquisizione
mkdir -p /casi/2026-001 && cd /casi/2026-001
cp ~/chiavi/age_pubblica_ufficio.txt ./key.txt # acquisizione cifrata
./androidqf_vX.Y.Z_linux_amd64 -backup sms -download all -output /casi/2026-001/
sha256sum *.zip.age | tee hash_acquisizione.txt
- Backup degli SMS: utile perché alcuni stalkerware usano SMS di comando; richiede la conferma sul telefono.
-download allconserva tutti gli APK per l’analisi statica successiva.- Al termine: revocare le autorizzazioni di debug, disattivare il Debug USB (o lasciarlo come trovato, secondo il verbale) e annotarlo.
6.3 Triage con MVT
age --decrypt -i ~/chiavi/age_privata.txt -o acq.zip <UUID>.zip.age
mvt download-iocs
mvt-android check-androidqf --output ./mvt/ ./acq.zip
grep -i warning ./mvt/command.log
Che cosa cercare, oltre alle corrispondenze con gli IOC stalkerware:
- app con nomi o icone “di sistema” (es. System Service, Wi-Fi Update) installate da sideload e non dal Play Store (installer in packages.json / dumpsys);
- servizi di accessibilità e amministratori del dispositivo attivi non riconosciuti dalla titolare;
- permessi per notifiche, SMS, posizione in background, microfono, Usage Access;
- Google Play Protect disattivato;
- chiavi ADB attendibili inattese (indizio di accesso fisico con debug attivo);
- dalla timeline: data di installazione dell’app sospetta, da confrontare con il periodo in cui l’ex compagno ha avuto il telefono.
6.4 Analisi del campione (in laboratorio)
Sull’APK sospetto estratto dall’acquisizione, su una copia e mai sul reperto:
sha256sum sospetto.apk
apkid sospetto.apk # packer / offuscatori
jadx -d src/ sospetto.apk # decompilazione
# MobSF: caricare l'APK dall'interfaccia web → manifest, permessi, URL e domini, certificato di firma
Elementi da estrarre: package name, certificato di firma, endpoint e domini del pannello, permessi, componenti (receiver di avvio, servizi di accessibilità). Gli hash si possono confrontare su VirusTotal senza caricare il file.
6.5 Analisi dinamica (facoltativa, in laboratorio)
Su un dispositivo di test o emulatore: installare il campione, intercettare con PCAPdroid (cattura senza root) o mitmproxy/Burp (con CA di sistema o APK preparato con apk-mitm), Frida per il pinning. Obiettivo: identificare l’infrastruttura di raccolta (server, account), i dati trasmessi e la frequenza. Questi elementi orientano le richieste ai fornitori e la ricostruzione del fatto (possibili ulteriori ipotesi di reato, come gli artt. 615-ter, 617-bis e 617-quater c.p., da valutare caso per caso).
6.6 Cosa annotare
Struttura minima: quesito; descrizione del reperto e stato all’arrivo; strumenti e versioni (MVT vX, androidqf vY, data degli IOC); hash; operazioni svolte con orari; risultati (corrispondenze, artefatti a supporto, cronologia); limiti (un negativo non esclude compromissioni sconosciute); eventuali raccomandazioni (rimozione concordata, ripristino, cambio credenziali, verifica dell’account Google e dei dispositivi collegati).
6.7 Variante iOS (sospetto spyware mercenario)
Per un giornalista o un avvocato con iPhone: backup cifrato con idevicebackup2 → mvt-ios decrypt-backup → mvt-ios check-backup con gli IOC Amnesty; sysdiagnose → mvt-ios check-sysdiagnose e iShutdown. Un positivo va confermato da un laboratorio specializzato (ad es. Amnesty Security Lab, Citizen Lab, Access Now Digital Security Helpline). Misura raccomandata: attivare la Modalità di isolamento (Lockdown Mode).
7. Quadro teorico
L’impianto (tipologie di malware, vettori d’infezione, tecniche di analisi, IoC, prevenzione) è stato aggiornato.
Tipologie ed esempi.
- Spyware mercenario: Pegasus (NSO; la variante Android fu chiamata Chrysaor), Predator (Intellexa/Cytrox). Spyware “artigianale” / locale: NoviSpy (Serbia, documentato da Amnesty nel dicembre 2024). Stalkerware: app commerciali di “monitoraggio” installate da chi ha accesso fisico.
- Ransomware: WannaLocker (2017) era un ransomware Android che imitava l’interfaccia di WannaCry, non una sua “versione mobile”.
- Adware: HummingBad (2016) -aveva anche funzioni di rooting.
- Trojan: FakeSpy (si spacciava per app di servizi postali); oggi vanno citati soprattutto i trojan bancari che abusano dei servizi di accessibilità.
- Rootkit / backdoor: Carrier IQ non è un buon esempio: era un software diagnostico preinstallato dagli operatori, molto contestato nel 2011 per la privacy, non un rootkit malevolo. Esempio più pertinente: Triada, backdoor modulare finita anche nel firmware di dispositivi economici.
Tecniche e strumenti.
- Analisi statica: sui dispositivi mobili si analizza il bytecode DEX/smali e le librerie native, raramente il sorgente. Strumenti: jadx, apktool, Ghidra (open source); IDA Pro è commerciale.
- Analisi dinamica: Cuckoo Sandbox (e la sua estensione CuckooDroid) non è più mantenuto da anni; preferire MobSF (dynamic analyzer), Frida, emulatori Android Studio.
- Memoria: LiME richiede root e un modulo compilato per il kernel esatto; sui dispositivi moderni (kernel GKI, moduli firmati) è raramente praticabile. Oggi la memoria si esamina soprattutto a livello di processo, con Frida.
- Rete: Wireshark, tcpdump, mitmproxy, Burp, PCAPdroid. Fiddler non è uno strumento “per iOS”: è un proxy da PC che può intercettare anche un iPhone configurato come sopra. tPacketCapture non è aggiornato da anni: usare PCAPdroid.
- Piattaforme: Santoku Linux non è più manutenuta; usare MobSF e una distribuzione aggiornata (Kali, Ubuntu) con gli strumenti del § 5.
- Acquisizione: “UFED” è il prodotto di Cellebrite. Accanto agli strumenti commerciali in dotazione: androidqf, libimobiledevice, ALEAPP/iLEAPP.
- Antivirus mobili: sono utili per la prevenzione, non per l’analisi forense. Per la PA italiana: nel marzo 2022 l’ACN ha raccomandato di rivalutare e diversificare le soluzioni di sicurezza di aziende legate alla Federazione Russa (Kaspersky citato negli appunti).
Aggiunte necessarie. Indicatori e strumenti basati su IOC (MVT), protezioni di piattaforma (Lockdown Mode su iOS, Advanced Protection e Intrusion Logging su Android 16), riferimenti metodologici (OWASP MASTG, NIST SP 800-101 Rev. 1, ISO/IEC 27037).
8. Registro delle modifiche
| # | Versione 2024 | Correzione / aggiornamento |
| 1 | Installazione da Git come alternativa standard | Installazione raccomandata pipx install mvt (PyPI); Git solo per sviluppo. Richiesto Python ≥ 3.10 |
| 2 | mvt-android chek-adb (refuso) e analisi via ADB | check-adb rimosso da MVT. Usare androidqf + check-androidqf |
| 3 | download-apks –output … e poi check-backup sul risultato | download-apks produceva APK e un JSON, non un backup: check-backup è per i backup Android .ab. Oggi gli APK si acquisiscono con androidqf (-download) |
| 4 | check-iocs sul JSON come passo obbligatorio | Gli IOC si applicano già durante i check-*; check-iocs serve a riconfrontare risultati esistenti con nuovi indicatori |
| 5 | VirusTotal con download-apks –virustotal / –from-file | check-androidqf –virustotal (opt-in, –delay, solo APK non di sistema) |
| 6 | androidqf da botherder/androidqf, v1.6 | Repository mvt-project/androidqf, ultima release; cifratura con age |
| 7 | Bugreport “ottenuto da androidqf” passato a check-bugreport | La cartella androidqf si analizza con check-androidqf; check-bugreport per bug report generati a parte |
| 8 | Wi-Fi: adb tcpip 5555 + check-adb –serial | Aggiunto il debug wireless con abbinamento (Android 11+); check-adb non più disponibile; preferire USB in ambito forense |
| 9 | Burp Android: “da Android 7 serve il root” senza spiegazione | Spiegata la fiducia nelle sole CA di sistema (API 24+), Android 14/APEX, alternative (emulatore, apk-mitm, Frida) |
| 10 | iOS: check-backup direttamente su backup cifrato | Aggiunto decrypt-backup (password via variabile d’ambiente) ed extract-key |
| 11 | — | Aggiunti sysdiagnose, check-sysdiagnose, shutdown.log/iShutdown |
| 12 | Burp iOS “solo Professional” | Procedura valida anche per Community; percorsi menu iOS aggiornati; rimozione della CA a fine test |
| 13 | — | Aggiunti premessa forense, IOC e repository, strumenti open source, use case |
| 14 | Sezioni teoriche generate con IA | Corretti esempi ed elenchi di strumenti (vedi § 7) |
9. Fonti
Documentazione ufficiale e repository
- MVT — documentazione: https://docs.mvt.re/en/latest/; installazione: https://docs.mvt.re/en/latest/install/
- MVT — rimozione dell’analisi ADB: https://docs.mvt.re/en/latest/android/adb/
- MVT — metodologia Android: https://docs.mvt.re/en/latest/android/methodology/
- MVT — IOC: https://docs.mvt.re/en/latest/iocs/
- MVT — controllo backup iOS: https://docs.mvt.re/en/latest/ios/backup/check/
- MVT — sysdiagnose: https://docs.mvt.re/en/latest/ios/sysdiagnose/
- MVT — release v2.7.0 (deprecazione check-adb): https://github.com/mvt-project/mvt/releases/tag/v2.7.0; v2026.7.29 e v2026.9.1: https://newreleases.io/project/github/mvt-project/mvt/release/v2026.9.1
- androidqf: https://github.com/mvt-project/androidqf
- PortSwigger, Android: https://portswigger.net/burp/documentation/desktop/mobile/config-android-device
- PortSwigger, iOS: https://portswigger.net/burp/documentation/desktop/mobile/config-ios-device
- Android Developers, adb e debug wireless: https://developer.android.com/tools/adb
- OWASP MASTG, Android Network Security Configuration: https://mas.owasp.org/MASTG/knowledge/android/MASVS-NETWORK/MASTG-KNOW-0014/
- PCAPdroid: https://github.com/emanuele-f/PCAPdroid
- MobSF: https://github.com/MobSF/Mobile-Security-Framework-MobSF
Ricerca e threat intelligence
- Amnesty International Security Lab, Tech Guide: Detecting NoviSpy spyware with AndroidQF and MVT (dic. 2024): https://securitylab.amnesty.org/latest/2024/12/tech-guide-detecting-novispy-spyware-with-androidqf-and-the-mobile-verification-toolkit-mvt/
- Amnesty Tech, indicatori: https://github.com/AmnestyTech/investigations
- Kaspersky / Securelist, Shutdown.log: lightweight iOS malware detection method (gen. 2024): https://securelist.com/shutdown-log-lightweight-ios-malware-detection-method/111734/
- HTTP Toolkit, Android 14 blocks modification of system certificates, even as root: https://httptoolkit.com/blog/android-14-install-system-ca-certificate/
- Cybersecurity360, raccomandazioni ACN sui prodotti legati alla Russia (mar. 2022): https://www.cybersecurity360.it/cybersecurity-nazionale/attenti-a-tecnologia-russa-come-kaspersky-ecco-i-consigli-dellagenzia-cyber-nazioanle/
- Coalition Against Stalkerware: https://stopstalkerware.org
Standard
- ISO/IEC 27037:2012 — Guidelines for identification, collection, acquisition and preservation of digital evidence.
- NIST SP 800-101 Rev. 1 (2014) — Guidelines on Mobile Device Forensics.
- OWASP Mobile Application Security Testing Guide (MASTG): https://mas.owasp.org/MASTG/