
Scanner dei meccanismi di persistenza di macOS con verifica della firma del codice e tracciamento della timeline.
Vedi TUTTO ciò che gira sul tuo Mac. Comprendi PERCHÉ gira. Decidi COSA tenere.


MacPersistenceChecker ti mostra tutto ciò che viene eseguito automaticamente sul tuo Mac, spiega perché è importante e ti aiuta a decidere cosa tenere o rimuovere.
→ Trova malware → Rileva persistenza nascosta → Comprendi il tuo sistema in pochi minuti
Scarica MacPersistenceChecker v2.0.0 (DMG)
→ Scansiona il tuo Mac in meno di 30 secondi → Nessuna procedura guidata di installazione, basta aprirlo ed eseguirlo → macOS nativo, universale (Apple Silicon & Intel), macOS 13+
Se macOS dice che l'app è danneggiata:
xattr -cr /Applications/MacPersistenceChecker.app
L'app impara il tuo sistema e classifica automaticamente migliaia di elementi.
Avvio rapido:
Costo realistico: <$1/mese per un uso attivo, $0 a regime.
L'app crea un knowledge graph di ogni elemento di persistenza sul tuo Mac e usa Claude (Anthropic) per ragionarci sopra. Classifica rapidamente migliaia di elementi, evidenzia solo ciò che conta davvero e impara il tuo sistema così da rispondere alla maggior parte delle domande senza ulteriori chiamate IA.
┌──────────────────────────┐
│ Persistence scan │
│ (e.g. 6800 items) │
└─────────────┬────────────┘
▼
┌────────────────────────────────────────┐
│ Concept Extraction (deterministic) │
│ 6 extractors → vendor / software / │
│ pathCategory / pattern / mechanism / │
│ filename. No AI calls here. │
└─────────────┬──────────────────────────┘
▼
┌────────────────────────────────────────┐
│ Knowledge Graph (SQLite) │
│ • concepts (~280 typically) │
│ • concept_links (subsumes / instance) │
│ • item_concepts (m:n) │
│ • concept_verdicts │
└─────────────┬──────────────────────────┘
▼
┌────────────────────────────────────────┐
│ Concept Resolver │
│ for every item, picks the strongest │
│ verdict via a deterministic ladder: │
│ severity → confidence → specificity │
│ → source → recency. │
└─────────────┬──────────────────────────┘
│
┌───────────┴────────────┐
▼ ▼
┌──────────────────┐ ┌──────────────────────┐ │ Item is already │ │ Item is unresolved │ │ classified. │ │ → goes to a cluster. │ │ Filter hides it │ └──────────┬───────────┘ │ from "Suspicious"│ ▼ └──────────────────┘ ┌──────────────────────┐ │ Cluster Builder │ │ groups items by │ │ identical concept │ │ signature (sorted │ │ ids). 6800 items → │ │ ~280 clusters. │ └──────────┬───────────┘ ▼ ┌──────────────────────────────────────────┐ │ User decides per cluster (one click = │ │ N items decided), OR sends batch to AI: │ │ │ │ • Trust / Watch / Block (manual) │ │ • Send unresolved clusters to AI │ │ → Haiku batch (15 cluster per call) │ │ → AI returns verdicts attached to │ │ concepts (not items) — propagate │ │ to ALL items linked to those │ │ concepts, including future ones. │ └──────────────────────────────────────────┘
### Strumenti IA
| Strumento | Dove | Modello | Costo / chiamata |
|---|---|---|---|
| Analizza con IA (singolo elemento) | Dettaglio elemento → Knowledge Graph | Haiku | ~$0.003 |
| Batch Smart Triage | Barra strumenti → Triage | Haiku batch | ~$0.005 (15 cluster) |
| Report di sistema | Barra strumenti → Report | Sonnet | ~$0.05-0.10 |
| Threat Hunt | Barra strumenti → Hunt | Haiku | ~$0.003 |
| Diff snapshot | Cronologia → Confronta → Analizza con IA | Haiku | ~$0.003 |
Limite giornaliero di chiamate (predefinito 30) configurabile in Impostazioni → IA. Tetto invalicabile, oltre il quale l'IA si disabilita automaticamente.
### Controlli di fiducia
Le regole definite dall'utente **hanno sempre la precedenza** su quelle estratte dall'IA:
- **Considera affidabile questo elemento** — regola singleItem, il tuo giudizio sovrascrive la watchlist dell'IA
- **Considera affidabile questo pattern** — regola pattern con ancoraggio TeamID/firma (solo binari firmati)
- **Rimuovi fiducia** — elimina una regola definita dall'utente che hai aggiunto per errore
- **Watch / Blocca** — applica il verdetto watchlist/malicious a un intero cluster in Smart Triage
</details>
---
## Scansione della persistenza
### Scanner principali
- **Launch Daemons** - servizi a livello di sistema (`/Library/LaunchDaemons`, `/System/Library/LaunchDaemons`)
- **Launch Agents** - agent a livello utente (`~/Library/LaunchAgents`, `/Library/LaunchAgents`)
- **Login Items** - app che si avviano all'accesso
- **Kernel Extensions** - kext legacy
- **System Extensions** - estensioni di sistema moderne (DriverKit, NetworkExtension, EndpointSecurity)
- **Privileged Helper Tools** - servizi XPC con privilegi elevati
- **Cron Jobs** - attività pianificate
- **Configuration Profiles** - profili MDM e profili di configurazione
- **Application Support** - app e helper in background
### Scanner estesi (opzionali)
- **Periodic Scripts** - script giornalieri, settimanali e mensili in `/etc/periodic/`
- **Shell Startup Files** - file di avvio della shell `.zshrc`, `.bashrc`, `/etc/profile` con rilevamento di pattern sospetti
- **Login/Logout Hooks** - hook di login legacy tramite `com.apple.loginwindow`
- **Authorization Plugins** - plugin Security Agent in `/Library/Security/SecurityAgentPlugins`
- **Spotlight Importers** - importatori di metadati personalizzati
- **Quick Look Plugins** - generatori di anteprime che potrebbero essere abusati
- **Directory Services Plugins** - plugin di autenticazione
- **Finder Sync Extensions** - estensioni Finder tramite pluginkit
- **BTM Database** - voci Background Task Management (macOS 13+)
- **Dylib Hijacking** - rilevamento di `DYLD_INSERT_LIBRARIES` e di iniezione di dylib sospette
- **TCC/Accessibility** - app con permessi Accessibilità nel database TCC
---
## Valutazione del rischio
Ogni elemento di persistenza riceve un **Risk Score (0-100)** basato su molteplici fattori:
- Firme del codice non valide o mancanti
- Protezione hardened runtime mancante
- Binari firmati ad-hoc
- Posizioni dei file sospette
- Configurazioni di avvio automatico persistenti (RunAtLoad, KeepAlive)
- Pattern di malware noti
**Livelli di gravità:** Low, Medium, High, Critical - elementi ordinati per rischio per una rapida identificazione delle minacce.
### Rilevamento anomalie nella frequenza di avvio
- **Micro-Restart** - StartInterval < 60 secondi (possibile abuso del watchdog)
- **Aggressive Watchdog** - combinazione di KeepAlive + StartInterval basso
- **No Throttle Limit** - KeepAlive senza ThrottleInterval (rischio di loop crash-restart)
### Rilevamento firmato-ma-pericoloso
- **Dangerous Entitlements** - rilevamento di entitlement rischiosi (`com.apple.security.cs.disable-library-validation`, ecc.)
- **Apple Impersonation** - software non Apple che tenta di apparire come Apple
- **Hidden Locations** - app firmate in directory sospette
- **Notarization Gaps** - app recenti prive di notarizzazione
- **Developer Certificate Analysis** - validazione del Team ID rispetto a vendor noti
### Rilevamento LOLBins (Living-off-the-Land Binaries)
Rileva l'uso sospetto di binari macOS legittimi in contesti di persistenza. **Ciò che conta è la combinazione:**
- **osascript + persistenza** = AppleScript con avvio automatico (abuso di automazione GUI)
- **curl/wget + RunAtLoad** = pattern di download ed esecuzione
- **python + helper privilegiato** = esecuzione di script con privilegi elevati
- **security + KeepAlive** = rischio di raccolta di credenziali
- **launchctl + avvio automatico** = installatore di meta-persistenza
- **netcat + persistenza** = reverse shell / canale C2
Oltre 40 LOLBins monitorati con mapping MITRE ATT&CK e scoring di gravità sensibile al contesto.
### Reputazione dei binari e analisi comportamentale
Euristiche avanzate per rilevare pattern comportamentali sospetti:
- **Hidden Persistence Guard** - agent KeepAlive senza uno scopo watchdog evidente
- **Aggressive Persistence** - RunAtLoad + KeepAlive su elementi non di servizio
- **Stealthy Auto-Start** - processo in background di un vendor sconosciuto
- **Orphaned Persistence** - il plist punta a un eseguibile inesistente
- **Suspicious Location** - eseguibile in `/tmp/`, `/Users/Shared/` o in directory nascoste
- **Privilege Escalation Risk** - agent utente che tenta operazioni privilegiate
- **Network-Enabled Persistence** - persistenza con capacità di rete
- **Script-Based Persistence** - script inline tramite interpreti
- **System Process Impersonation** - elemento non Apple che usa nomi simili a quelli Apple
- **Frequent Restart Pattern** - StartInterval < 60 secondi
### Mancata corrispondenza di intento tra plist e binario
Rileva quando ciò che dichiara il plist non corrisponde a ciò che il binario fa realmente - **esattamente ciò che fanno i dropper moderni:**
- **Innocent Plist, Heavy Binary** - configurazione semplice ma il binario ha entitlement pericolosi
- **Passive Helper with Network** - helper in background con accesso di rete client/server
- **Passive Helper with Dylib Loading** - helper che può caricare codice non firmato
- **Minimal Config, Maximum Capabilities** - plist minimale ma entitlement estesi
- **Simple Task with Keychain Access** - attività dall'aspetto semplice con accesso alle credenziali
### Età del binario vs età della persistenza
Rileva pattern di timestamp sospetti che indicano aggiornamenti dannosi post-installazione:
- **Old Plist, New Binary** - classico pattern di "aggiornamento dannoso post-installazione"
- **Silent Binary Swap** - binario modificato senza modifica del plist
- **Timestamp Manipulation** - data di modifica precedente alla data di creazione (impossibile)
- **Suspicious Modification Time** - binario modificato tra le 2 e le 5 di notte
- **Binary Modified After Install** - binario non-updater modificato dopo l'installazione iniziale
### Livelli di fiducia
- 🟢 **Apple** - Firmato da Apple
- 🔵 **Known Vendor** - Software di terze parti verificato
- 🟡 **Signed** - Firma valida ma non notarizzato
- ⚪ **Unknown** - Nessun eseguibile da verificare
- 🟠 **Suspicious** - Certificato scaduto o percorso sospetto
- 🔴 **Unsigned** - Nessuna firma valida
---
## Timeline e analisi forense
Timeline forense completa per ogni elemento di persistenza:
**Rilevamento**
- Prima comparsa - quando l'elemento è stato rilevato per la prima volta
**File di configurazione (plist)**
- Creato - timestamp di creazione del file
- Modificato - timestamp dell'ultima modifica
**Eseguibile (binario)**
- Creato - timestamp di creazione del binario
- Modificato - timestamp dell'ultima modifica
- Ultima esecuzione - ultimo accesso/tempo di esecuzione
### Rilevamento anomalie nei timestamp
- **Timestomping** - data di creazione successiva alla data di modifica (tecnica anti-forense)
- **File Replacement** - file creato dopo il rilevamento iniziale
- **Binary Swap** - binario modificato di recente con plist vecchio (possibile trojan)
- **Recent Execution** - binario a cui si è acceduto di recente ma attualmente non caricato
---
## Integrazione con MITRE ATT&CK
Ogni meccanismo di persistenza è mappato sul framework MITRE ATT&CK:
- **Tattiche**: Persistence, Privilege Escalation, Defense Evasion, Execution
- **Tecniche**: T1543.001, T1543.004, T1547.001, T1547.015 e altre
- Collegamenti diretti alla documentazione MITRE ATT&CK
---
## Report sull'invasività delle app
Analisi completa delle app installate per valutarne il livello di "invasività":
### Sistema di punteggio duale
**Persistence Score (0-100)** - Valuta i meccanismi di persistenza:
- Tipi di trigger (RunAtLoad, KeepAlive)
- Livelli di privilegio (LaunchDaemons, Kernel Extensions, Privileged Helpers)
- Resilienza (riavvio automatico, updater)
- Ridondanza (più elementi dello stesso vendor)
- Livello di fiducia (penalità per elementi non firmati/sospetti)
**Installation Score (0-100)** - Valuta l'impronta "spazzatura":
- File distribuiti tra le cartelle Library
- Utilizzo totale del disco
- File orfani (persistenza senza app corrispondente)
- Cache gonfia
- Installazioni a livello di sistema
### Sistema di valutazione
App valutate da **A a F** in base al punteggio combinato, con ripartizione dettagliata di tutti i fattori di punteggio.
---
## Visualizzazione
### Dashboard delle statistiche
- **Risk Distribution Histogram** - elementi per fasce di rischio (Low, Medium, High, Critical)
- **Trust Level Donut Chart** - distribuzione tra i livelli di fiducia
- **Category Breakdown Chart** - elementi per categoria di persistenza
- **Timeline Visualization** - eventi del ciclo di vita degli elementi (Creato, Modificato, Eseguito, Rilevato)
### Grafico interattivo
- **Full System Graph** - panoramica di tutti gli elementi di persistenza e delle relative relazioni
- **Focused Item Graph** - grafico radiale per l'analisi del singolo elemento
- **Modalità di analisi**: Base (fiducia/categorie) o Completa (include dipendenze dylib, connessioni di rete)
- **Interactive Canvas** - zoom, pan, esplorazione delle relazioni
- **Codificato a colori per livello di fiducia** - valutazione visiva rapida delle minacce
### Radar del profilo di sicurezza
Grafico radar completo che mostra a colpo d'occhio le dimensioni Fiducia, Firma, Sicurezza, Stabilità, Trasparenza ed Età.
---
## Monitoraggio in tempo reale
Monitoraggio continuo delle modifiche alla persistenza con due modalità di analisi.
### Modalità di monitoraggio
**Modalità standard**
- Monitoraggio in tempo reale del file system basato su FSEvents
- Soppressione intelligente del rumore con debounce configurabile
- Scoring di rilevanza per filtrare le modifiche insignificanti
- Notifiche immediate per le modifiche ad alta rilevanza
**Modalità IA** (richiede la chiave API di Claude)
- L'IA Claude analizza ogni modifica rilevata
- Contesto completo inviato all'IA: informazioni sulla firma, LOLBins, anomalie comportamentali, risk score
- L'IA decide se la modifica merita una notifica in base al livello di minaccia effettivo
- Intervallo di controllo configurabile (da 30 secondi a 1 ora)
- Filtro per soglia di gravità (Info, Low, Medium, High, Critical)
### Integrazione con la barra dei menu
- Indicatore di stato del monitoraggio in tempo reale
- Badge della modalità che mostra "AI" o "Std"
- Controlli rapidi (avvio/arresto del monitoraggio, attivazione scansione)
- Accesso alle impostazioni
- Conteggio sul badge per le modifiche non riconosciute
- Anteprima dell'ultima modifica rilevata
### Deduplicazione delle notifiche
- Lo stesso elemento non attiverà notifiche ripetute entro il periodo di cooldown
- Cooldown configurabile (1-24 ore, predefinito 2 ore)
- Previene l'affaticamento da notifiche causato da elementi che cambiano di frequente
### Notifica di avvio
All'avvio del monitoraggio ricevi una notifica che conferma:
- Modalità attiva (Modalità IA o Modalità standard)
- Intervallo di controllo (IA) o "Real-time" (Standard)
- Impostazioni della soglia di notifica
### Rilevamento delle modifiche
- **Aggiunti** - nuovi elementi di persistenza
- **Rimossi** - elementi eliminati
- **Modificati** - modifiche alla configurazione (abilitato/disabilitato, variazioni di percorso, ecc.)
- **Abilitati/Disabilitati** - cambi di stato
### Dettagli dell'analisi IA
Quando la modalità IA è attiva, ogni modifica invia a Claude i dati completi dell'elemento:
- Informazioni di base (nome, categoria, percorsi, contenuto del plist)
- Dettagli della firma (firmato, Apple, notarizzato, team ID, stato del certificato)
- Valutazione del rischio (punteggio, ripartizione dettagliata)
- Rilevamenti LOLBins con mapping MITRE
- Anomalie comportamentali
- Mancate corrispondenze di intento (plist vs binario)
- Anomalie di età (analisi dei timestamp)
- Flag firmato-ma-pericoloso
Claude risponde con:
- `shouldNotify` - se avvisare l'utente
- `severity` - valutazione del livello di minaccia
- `title` - titolo della notifica
- `explanation` - perché è o non è sospetto
- `recommendation` - azione suggerita
- `mitreTechniques` - tecniche ATT&CK rilevanti
### Personalizzazione dell'IA
Controlla come l'IA analizza le modifiche tramite **Impostazioni → IA**:
**Opzioni strutturate**
| Opzione | Predefinito | Effetto |
|--------|---------|--------|
| Ignora elementi firmati Apple | ON | Riduce la priorità degli elementi firmati da Apple (com.apple.*) |
| Ignora percorsi di sistema | ON | Riduce la priorità dei percorsi /System e /Library |
| Prioritizza i non firmati | ON | Attenzione extra agli eseguibili non firmati |
| Focus su LOLBins | ON | Dà priorità al rilevamento di Living-off-the-Land Binaries |
| Punteggio di rischio minimo | 0 | Analizza solo gli elementi con rischio >= soglia |
| Percorsi ignorati | - | Percorsi personalizzati da saltare (separati da virgola) |
**Soglia di notifica**
- `Info` - Notifica tutto
- `Low` - Notifica dalla gravità bassa in su
- `Medium` - Notifica dalla gravità media in su (predefinito)
- `High` - Solo alta e critica
- `Critical` - Solo minacce critiche
**Prompt personalizzato**
Aggiungi le tue istruzioni, che verranno aggiunte in coda al prompt dell'IA. Esempi:```
Always notify me if an item uses python or osascript.
Ignore anything from Microsoft.
Be more aggressive with unsigned items from ~/Downloads.
L'IA usa queste preferenze per prendere decisioni più intelligenti. Per esempio:
/tmp/ → Notifica criticaosascript con RunAtLoad → Notifica altaMacPersistenceChecker include un server MCP (Model Context Protocol) che consente a Claude Code, Claude Desktop e ad altri client compatibili con MCP di interrogare i dati di persistenza.
swift build --target MPCServer
Il binario viene creato in `.build/debug/mpc-server`.
### Strumenti MCP disponibili
| Strumento | Descrizione |
|------|-------------|
| `get_current_state` | Ottieni tutti gli elementi di persistenza correnti con filtri opzionali |
| `get_diff` | Ottieni le modifiche rispetto alla baseline o a uno snapshot specifico |
| `get_summary` | Panoramica compatta con conteggi e minacce principali |
| `get_item_details` | Dettagli completi per un elemento specifico tramite identificatore |
| `get_risk_analysis` | Analisi del rischio aggregata con raccomandazioni |
| `get_snapshots` | Elenca gli snapshot disponibili con metadati |
| `compare_snapshots` | Confronta due snapshot per rilevare modifiche |
### Configurazione di Claude Code
Aggiungi alle impostazioni MCP di Claude Code (`~/.claude/claude_desktop_config.json` o simili):```json
{
"mcpServers": {
"macpersistence": {
"command": "/path/to/mpc-server",
"args": []
}
}
}
Una volta configurato, puoi chiedere a Claude Code:
Esportazione leggibile dalle macchine per pipeline di sicurezza:
Il pulsante è abilitato solo dopo il completamento della scansione.
Neutralizza in sicurezza gli elementi di persistenza sospetti senza eliminarli definitivamente:








git clone https://github.com/Pinperepette/MacPersistenceChecker.git cd MacPersistenceChecker ./build.sh
Copia `MacPersistenceChecker.app` in `/Applications/`.
### Requisiti
- macOS 13.0+
- Xcode 15+ oppure Swift 5.9+
### Dipendenze
- [GRDB.swift](https://github.com/groue/GRDB.swift) - database SQLite
---
## Autorizzazioni
Richiede **Accesso completo al disco** per eseguire la scansione di:
- `/Library/LaunchDaemons`
- File di configurazione di sistema
- Database TCC
- File di avvio della shell
Senza Accesso completo al disco, alcuni elementi potrebbero non essere visibili.
---
## Licenza
Licenza MIT - Vedi [LICENSE](https://github.com/pinperepette/macpersistencechecker/blob/HEAD/LICENSE) per i dettagli.
## Autore
**pinperepette** - 2025
## Cronologia stelle
<a href="https://www.star-history.com/?repos=Pinperepette%2FMacPersistenceChecker&type=date&legend=top-left">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/chart?repos=Pinperepette/MacPersistenceChecker&type=date&theme=dark&legend=top-left" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/chart?repos=Pinperepette/MacPersistenceChecker&type=date&legend=top-left" />
Star History Chart
</picture>
</a>
---
*Ispirato da [Autoruns](https://docs.microsoft.com/en-us/sysinternals/downloads/autoruns) per Windows di Mark Russinovich*