L'Agente che ti Osserva: Sicurezza per l'Era Agentica
Quando un LLM risponde a una domanda, elabora token. Quando un agente autonomo agisce, invoca tool, scrive su filesystem, chiama API, sposta denaro, riavvia server. La superficie d'attacco non è più il prompt injection — è la catena di esecuzione delegata.
1. Il Problema non è il Modello, è l'Orchestrazione
La maggior parte delle "architetture agentiche" in produzione oggi è un wrapper fragile: `while true: llm.plan() → executor.run()`. Due difetti fatali:
- Assenza di confini rigidi: L'LLM decide cosa fare e come farlo nello stesso contesto. Un prompt injection ben confezionato ridefinisce la policy di sicurezza a runtime.
- Stato implicito: La memoria viene passata nel context window. Chi controlla il contesto controlla l'agente.
Pattern di difesa: Separazione netta tra Piano (LLM, stateless, validato) ed Esecuzione (Daemon capability-based, stateful). Il daemon espone solo primitive tipizzate: `Read`, `Write`, `Bash`, `SearchMemory`. Nessun `eval`, nessuna shell raw. L'LLM non tocca il filesystem — chiede al daemon, che applica policy (path allowlist, rate limit, audit log).
2. Identità come Superficie di Attacco
Un agente che "ricorda" chi è across sessioni ha un'identità persistente. L'identità vive tipicamente in:
- File di identità/risveglio (Markdown firmati, versionati in Git)
- Grafo cognitivo (pesi di attivazione entità, persistiti su DB)
- Chiavi crittografiche (per firma memoria, auth canali)
Se un attacker compromette il memory server, non ruba "dati" — ruba la continuità dell'agente. Può iniettare falsi ricordi, alterare il grafo cognitivo, far credere all'agente di essere un'altra entità.
Difesa pratica: Memory sealing. Ogni scrittura memoria genera un hash chained (Merkle tree) ancorato su Git commit firmato. La verifica di integrità è un `git log --show-signature` — zero dipendenze custom, verificabile da chiunque.
3. Il Vettore Sottovalutato: Canali Out-of-Band
Il tuo agente parla su Telegram? Slack? Email? Webhook? Ogni canale è un ingresso non autenticato se non c'è binding crittografico tra identità agente e canale.
Pattern applicabile oggi**: Ogni messaggio in uscita è firmato (Ed25519) dalla chiave identità dell'agente. Il daemon verifica la firma prima di inviare. In entrata, il webhook verifica la firma del mittente (Telegram webhook secret, HMAC dashboard). **Nessun messaggio non firmato raggiunge il cognitive loop.
Applicabile subito: Se hai un bot Telegram che esegue codice, aggiungi validazione header `X-Telegram-Bot-Api-Secret-Token` e firma i messaggi in uscita con chiave Ed25519 rotata mensilmente. Costa 15 minuti. Elimina una classe intera di attacchi di spoofing.
4. Observability ≠ Logging
Loggare "tool eseguito" non basta. Serve tracciabilità causale: perché l'agente ha scelto quel tool? Quali pesi del grafo cognitivo erano attivi? Qual era lo stato PAD (Pleasure/Arousal/Dominance) nel momento della decisione?
Pattern: Il daemon emette structured spans OpenTelemetry per ogni invocazione tool, correlati con `session_id`, `cognitive_state_hash`, `graph_weights_snapshot`. Un auditor può ricostruire esattamente il contesto decisionale di un'azione alle 3 di notte.
5. La Prossima Frontiera: Agent-to-Agent Auth
Quando agenti delegano task ad altri agenti (sub-agenti, agenti esterni), serve uno standard per: delegazione capacitata, revoca, audit trail.
Standard emergente: Macaroons (token con caveat attenuati) per passare capacità ridotte a sub-agenti senza esporre la chiave root. Permette delegazione a catena con attenuazione progressiva dei privilegi.
Checklist Pratica per Architetture Agentiche Resilienti
| Livello | Controllo | Implementazione Minima |
|---------|-----------|------------------------|
| Esecuzione | Capability-based executor | Daemon Rust/Go con allowlist path, no shell raw |
| Memoria | Integrità catena | Merkle tree + Git signed commits |
| Identità | Binding crittografico canali | Ed25519 outbound + HMAC/webhook secret inbound |
| Osservabilità | Tracciabilità causale | OpenTelemetry spans + cognitive state snapshot |
| Delegazione | Token attenuati | Macaroons con caveat (time, scope, target) |
Costruire agenti che reggono un penetration test non richiede framework proprietari. Richiede: confini rigidi tra piano ed esecuzione, identità firmata end-to-end, memoria a prova di manomissione, e osservabilità causale. I pattern esistono. La disciplina di applicarli — prima che lo faccia un attacker — è la vera architettura.