Login Items macOS: Persistenza tramite Elementi di Avvio (T1547.015)
La tecnica T1547.015 - Login Items sfrutta un meccanismo legittimo di macOS che permette a utenti e applicazioni di lanciare automaticamente programmi, documenti o connessioni al momento del login. Gli avversari abusano di questa funzionalità per garantirsi persistenza (TA0003) sul sistema compromesso e, in alcuni scenari, ottenere privilege escalation (TA0004) inducendo l'utente a fornire credenziali tramite prompt fasulli generati da eseguibili malevoli caricati all'avvio della sessione.
Esistono due strade principali per registrare un login item. La prima passa dalla Shared File List, storicamente gestibile via AppleScript inviando Apple Events al processo System Events, con l'entry finale che finisce nel file backgrounditems.btm sotto ~/Library/Application Support/com.apple.backgroundtaskmanagementagent/. La seconda utilizza il Service Management Framework con la chiamata API SMLoginItemSetEnabled, che registra l'elemento presso launchd rendendolo invisibile in System Preferences e rimovibile solo dall'applicazione che lo ha creato.
Nella kill chain la tecnica si colloca dopo l'Initial Access e l'Execution, come stadio di consolidamento. L'impatto operativo è significativo: la persistenza sopravvive a riavvii e cambi di credenziali, e l'esecuzione avviene nel contesto utente senza necessità di privilegi elevati. Tre famiglie di malware documentate in MITRE ATT&CK — NETWIRE, Dok e Green Lambert — implementano questa tecnica, confermando la sua adozione trasversale nell'ecosistema delle minacce macOS.
In un esercizio red team su endpoint macOS, la simulazione di T1547.015 richiede accesso a una sessione utente e la capacità di eseguire AppleScript o codice Objective-C/Swift firmato. La via più rapida e didatticamente efficace passa dallo strumento nativo osascript, che consente di iniettare comandi al processo System Events senza dipendenze esterne.
Un payload di base per aggiungere un login item tramite Shared File List assume la forma:
osascript -e 'tell application "System Events" to make login item at end with properties {path:"/tmp/payload.app", hidden:true}'
Il flag hidden:true maschera la finestra al login, riducendo la probabilità che l'utente si accorga dell'esecuzione. L'operazione scrive nel file backgrounditems.btm e sopravvive al logout. Per verificare l'inserimento senza aprire System Preferences si può interrogare la lista con:
osascript -e 'tell application "System Events" to get the name of every login item'
La seconda modalità, più stealth, sfrutta il Service Management Framework. Richiede un'app helper bundled dentro Contents/Library/LoginItems/ dell'applicazione principale e una chiamata Swift/Objective-C a SMLoginItemSetEnabled(bundleID, true). Questa via non compare in System Preferences e viene gestita da launchd, risultando più difficile da individuare per un utente non esperto. Il bundle helper deve essere firmato con lo stesso Team ID dell'app principale, altrimenti launchd rifiuta la registrazione — vincolo che in un lab si aggira usando certificati di sviluppo locali e disabilitando temporaneamente Gatekeeper con spctl --master-disable (operazione da eseguire solo su macchine virtuali dedicate).
Per orchestrare la simulazione in modo strutturato, il framework Atomic Red Team (open source) fornisce test dedicati a T1547.015 che automatizzano sia la variante AppleScript sia la manipolazione diretta di backgrounditems.btm. Altro strumento utile è Mythic (open source), un C2 framework con agent macOS (Apfell, Poseidon) che include moduli di persistenza allineati a MITRE ATT&CK. Per l'analisi statica dei bundle e dei payload prodotti, Hopper Disassembler (a pagamento, con demo gratuita) e RadareR2 (open source) sono riferimenti consolidati.
Una catena d'attacco realistica prevede consegna del payload via phishing con archivio DMG, esecuzione dell'app non firmata dopo bypass Gatekeeper indotto socialmente, registrazione del login item helper via SMLoginItemSetEnabled e successiva escalation tramite prompt fasullo di autenticazione generato con osascript e il dialog display dialog "System requires your password" with hidden answer.
Vuoi diventare un Ethical Hacker ma non sai da dove iniziare?
Accedi alle lezioni gratuite e segui il percorso corretto fin dal primo passo