Persistenza tramite Launch Agent: Launch Agent (T1543.001)

La tecnica T1543.001 - Launch Agent rappresenta uno dei meccanismi di persistenza più consolidati sull'ecosistema macOS, sfruttato tanto da malware commodity quanto da operatori APT sofisticati. Il framework MITRE ATT&CK la colloca sotto le tattiche TA0003 (Persistence) e TA0004 (Privilege Escalation), riflettendo la sua doppia natura: mantenere l'accesso attraverso i riavvii e, in alcuni scenari, ottenere esecuzione in contesti utente privilegiati.

Il funzionamento si basa sul processo launchd, che al login carica automaticamente i file property list (.plist) presenti in tre directory chiave: /System/Library/LaunchAgents, /Library/LaunchAgents e ~/Library/LaunchAgents. Ogni file dichiara un Label, un ProgramArguments che indica il binario da eseguire e chiavi come RunAtLoad o KeepAlive che ne determinano il ciclo di vita. Un attaccante che scrive un plist in una di queste posizioni ottiene esecuzione ad ogni sessione utente senza necessità di privilegi elevati per la user-scope, dato che ~/Library/LaunchAgents è writable dall'utente stesso.

I numeri parlano chiaro: 20 famiglie malware documentate abusano di questa tecnica, tra cui Komplex, NETWIRE, Proton, Dok, MacMa e Cuckoo Stealer. Il gruppo Contagious Interview (G1052) utilizza attivamente Launch Agent per persistere via InvisibleFerret. La tecnica è particolarmente insidiosa perché i nomi dei plist vengono spesso camuffati con label che imitano componenti Apple legittimi come com.apple.softwareupdate.plist o com.apple.updates.plist.

Simulare T1543.001 in laboratorio richiede una macchina macOS aggiornata (Ventura o Sonoma) e privilegi utente standard. Il payload minimo è un file plist ben formato che invoca uno script o binario controllato dall'operatore.

La struttura tipica di un Launch Agent malevolo replica quanto osservato in MacMa e Green Lambert. Un esempio di plist che simula il comportamento persistente:

Labelcom.apple.softwareupdate ProgramArguments/Users/Shared/.beacon RunAtLoad KeepAlive

Il file va salvato in ~/Library/LaunchAgents/com.apple.softwareupdate.plist e caricato con launchctl load -w ~/Library/LaunchAgents/com.apple.softwareupdate.plist, esattamente la sequenza usata da Komplex (S0162). Su macOS moderno il comando corretto per sessioni utente è launchctl bootstrap gui/$(id -u) , mentre launchctl load rimane funzionante ma deprecato.

Per un red team assessment realistico conviene abbinare la creazione del plist ad alcune tecniche di offuscamento label-based osservate in campo. Dok (S0281) genera nomi randomici nel formato com.random.name.plist, mentre CoinTicker (S0369) utilizza label doppie come .espl.plist e com.apple.[random].plist per creare ridondanza di persistenza. Replicare questo comportamento aiuta a testare la detection su pattern di naming anomali.

Strumenti utili in fase di simulazione:

  • Atomic Red Team (open source) — contiene test specifici per T1543.001 con plist di esempio già pronti
  • Mythic C2 (open source) — il payload Poseidon implementa nativamente Launch Agent persistence
  • PersistentJXA (open source) — collezione di script JXA per persistenza macOS documentata da Cody Thomas
  • swiftbelt (open source) — enumera Launch Agent esistenti utile per fase post-exploit

Per verificare la persistenza dopo il logout, il comando launchctl list | grep mostra se il job è registrato e il suo PID. In fase di cleanup usare launchctl bootout gui/$(id -u)/ seguito dalla rimozione del plist. Attenzione a SIP (System Integrity Protection) e TCC: la scrittura in /Library/LaunchAgents richiede privilegi root, mentre ~/Library/LaunchAgents è accessibile all'utente ma su macOS recenti l'esecuzione di binari non firmati genera prompt Gatekeeper che vanno gestiti nel design del payload.

Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?

Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo

TEST GRATUITO
2 minuti · 7 domande Che professionista cyber sei? Scopri il profilo più vicino al tuo modo di pensare e inizia dal percorso giusto.