Dove è memorizzato lo ShimCache, e quando viene scritto?

4 min di lettura

TL;DR. Lo ShimCache vive in HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache. Windows lo ricostruisce in memoria ad ogni sessione e lo svuota nell'hive SYSTEM solo a uno shutdown pulito. I reboot duri possono eliminare del tutto le voci recenti. Rigioca SYSTEM.LOG1 e SYSTEM.LOG2 prima di fidarti di ciò che leggi.

La maggior parte dei disastri con lo ShimCache risale alla stessa causa: l'analista pensava che la cache fosse aggiornata come un file di log. Non lo è. La cache vive in memoria mentre il sistema gira, e la copia su disco riflette sempre solo lo stato del precedente shutdown pulito. Sbaglia questo e scrivi un report che dice che l'host è pulito quando non lo è.

ShimCache: scritture in memoria vs timing del flush su disco

Il percorso del registro

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache

Quel AppCompatCache finale è un valore, non una sottochiave. I dati sono un singolo blob binario il cui schema varia per release di Windows. XP, 7, 8, 8.1 e la famiglia 10/11 usano layout diversi. La guida al formato binario copre nel dettaglio lo schema moderno di Windows 10/11.

Offline tiri l'hive SYSTEM (uno dei file sotto C:\Windows\System32\config\) e gli punti un parser. Porta con te SYSTEM.LOG1 e SYSTEM.LOG2. Lo Shimcache Parser legge l'hive SYSTEM nel browser, senza upload, ma accetta solo quel file e non rigioca i log. Se l'hive è dirty, rigioca prima .LOG1 e .LOG2 con rla.exe di Eric Zimmerman (oppure caricalo in Registry Explorer e salva l'hive pulito), poi parsa il risultato.

Il tranello del ControlSet

Windows in realtà mantiene più ControlSets, di solito ControlSet001 e ControlSet002. In ogni istante esattamente uno è attivo, indicato da HKLM\SYSTEM\Select\Current. CurrentControlSet è un alias di runtime per quello attivo. Su un sistema vivo si risolve sempre correttamente; offline, il lavoro lo devi fare tu.

Un parser difendibile:

  1. Legge HKLM\SYSTEM\Select\Current (un DWORD, di solito 1 o 2).
  2. Cammina il corrispondente valore ControlSetXXX\Control\Session Manager\AppCompatCache\AppCompatCache.
  3. Ripiega sullo scansionare sia ControlSet001 sia ControlSet002 se Select\Current è illeggibile.

Questo strumento, l'AppCompatCacheParser di Eric Zimmerman e il Mandiant Shim Cache Parser gestiscono tutti quella risoluzione automaticamente. Implementati il tuo a tuo rischio.

Quando Windows scrive davvero

Ecco la parte che frega le persone. Mentre Windows gira, lo ShimCache vive in memoria. La copia su disco viene scritta solo a uno shutdown pulito. Quindi:

  • Un reboot duro, un'interruzione di corrente, un BSOD o un kill di VM a livello hypervisor distrugge ogni voce non ancora persistita.
  • Una triage in vivo con reg.exe o RegRipper legge il valore precedentemente persistito, non la cache attualmente in costruzione in memoria.
  • Il plugin windows.shimcachemem di Volatility 3 contro un dump RAM recupera la cache corrente in memoria. È l'unico modo per ottenere le voci della sessione attiva da un host che non è stato spento in modo pulito.

Se arrivi su una macchina compromessa che ha subito un reboot duro, l'hive su disco contiene la cache da prima dell'incidente. Tutto ciò che l'attaccante ha eseguito nella sessione attiva è perso, a meno che tu non abbia catturato anche la memoria. La storia di conferma di solito deve arrivare da AmCache, che scrive in continuo e sopravvive allo stesso reboot.

I log di transazione

SYSTEM.LOG1 e SYSTEM.LOG2 contengono scritture di registro non ancora fuse nell'hive principale. Qualsiasi parser robusto rigioca quei log prima di leggere lo ShimCache. Se hai copiato solo SYSTEM e saltato i log, stai leggendo una vista obsoleta. È in assoluto l'errore di acquisizione più comune. La guida all'acquisizione percorre i modi sicuri per prenderli tutti e tre.

Checklist rapida

  • Valore ShimCache: HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\AppCompatCache\AppCompatCache.
  • ControlSet attivo selezionato da HKLM\SYSTEM\Select\Current.
  • Memorizzato in memoria, svuotato solo a shutdown pulito. Conferma l'attività recente con AmCache.
  • Rigioca sempre SYSTEM.LOG1 e SYSTEM.LOG2 prima di parsare.

Letture aggiuntive

Articoli correlati