Launch Daemon macOS: Persistenza tramite Launchd (T1543.004)
La tecnica T1543.004 – Launch Daemon descrive l'abuso del framework launchd di macOS per ottenere persistenza ed esecuzione privilegiata. I Launch Daemon sono file plist collocati in /Library/LaunchDaemons/ e /System/Library/LaunchDaemons/ che vengono caricati da launchd durante l'avvio del sistema, prima ancora che qualsiasi utente effettui il login. A differenza dei Launch Agent, i daemon richiedono privilegi elevati per essere installati ed ereditano il contesto di root, rendendoli un vettore particolarmente ambito.
MITRE ATT&CK mappa questa tecnica sulle tattiche TA0003 (Persistence) e TA0004 (Privilege Escalation): l'attaccante ottiene sia sopravvivenza al reboot sia esecuzione con privilegi amministrativi. I parametri chiave del plist sono Label (identificatore univoco), Program o ProgramArguments (percorso del binario) e RunAtLoad impostato a true per l'avvio automatico. Spesso viene aggiunto anche KeepAlive per resurrezione automatica in caso di kill.
L'impatto è documentato in 10 famiglie malware tracciate da MITRE, tra cui OSX_OceanLotus.D, AppleJeus, ThiefQuest, Dacls, XCSSET e il recente COATHANGER. La tecnica è emersa con forza nella campagna C0057 (3CX Supply Chain Attack) del 2022-2023, dove AppleJeus ha usato un Launch Daemon per lanciare il backdoor macOS POOLRAT. La combinazione di masquerading (nomi plist simili a servizi legittimi Apple) e privilegi root rende la detection non banale e impone controlli sia preventivi sia investigativi.
In un red team engagement su ambiente macOS, la creazione di un Launch Daemon richiede prima l'ottenimento di privilegi elevati, tipicamente via TCC bypass, prompt di autenticazione fasullo o exploit locale. Una volta ottenuto root, la procedura è lineare e sfrutta strumenti nativi del sistema.
Il payload plist minimo prevede tre chiavi obbligatorie. Un esempio didattico per laboratorio:
sudo tee /Library/LaunchDaemons/com.apple.systemupdate.plist > /dev/null <<EOF
Per rispettare i permessi attesi da launchd il file deve appartenere a root e avere modo 644, altrimenti viene rifiutato: sudo chown root:wheel /Library/LaunchDaemons/com.apple.systemupdate.plist && sudo chmod 644 /path. Il caricamento immediato senza reboot si ottiene con sudo launchctl load /Library/LaunchDaemons/com.apple.systemupdate.plist nelle versioni legacy, oppure con sudo launchctl bootstrap system /path/to.plist su macOS moderni (Catalina e successivi).
Per la fase di masquerading, la scelta del Label è cruciale: nomi come com.apple.xpc.helper o com.microsoft.autoupdate.daemon si mimetizzano tra i servizi legittimi elencati da launchctl list. Utile confrontare l'output con una baseline pulita.
Sul fronte tooling offensivo per training autorizzato, Mythic C2 (open source) include payload macOS come Apfell e Poseidon con moduli di persistenza Launch Daemon integrati. Empire (open source, fork BC Security) offre il modulo persistence/launch_daemon. Per l'analisi statica dei plist esistenti utile plutil (nativo macOS): plutil -p /Library/LaunchDaemons/com.example.plist converte i binary plist in formato leggibile.
Un vettore alternativo, citato nella descrizione MITRE, è l'abuso di directory globalmente scrivibili come /usr/local/bin generate da package manager di terze parti (Homebrew tipicamente). Se un plist legittimo referenzia un binario in tale path, sostituire l'eseguibile fornisce persistenza root senza dover creare nuovi file plist — approccio più stealth. La verifica dei permessi si fa con find /usr/local/bin -perm -o+w -type f per identificare candidati.
Infine, per simulare COATHANGER o Dacls, si configura il daemon con un intervallo di check-in tramite la chiave StartInterval in secondi, generando traffico C2 periodico realistico per esercitare il SOC.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo