\n\n\n\n Tutorial sull’Agent Sandboxing : Costruire Applicazioni LLM Sicure - BotSec \n

Tutorial sull’Agent Sandboxing : Costruire Applicazioni LLM Sicure

📖 18 min read3,485 wordsUpdated Apr 4, 2026

Introduzione all’Isolamento degli Agenti

Man mano che i Modelli di Linguaggio di Grande Dimensione (LLM) evolvono da semplici agenti conversazionali a entità autonome potenti in grado di eseguire codice, interagire con API esterne e prendere decisioni nel mondo reale, la necessità di misure di sicurezza solide diventa fondamentale. Un agente LLM, se dotato della capacità di agire, può rappresentare un rischio di sicurezza significativo se non è correttamente vincolato. È qui che interviene l’isolamento degli agenti. L’isolamento di un agente significa creare un ambiente isolato in cui può operare senza influenzare il sistema host o accedere a risorse non autorizzate. Questo tutorial esplorerà gli aspetti pratici dell’isolamento degli agenti, fornendo esempi concreti per dimostrare come costruire applicazioni LLM sicure e affidabili.

Il principio fondamentale dietro l’isolamento è il minimo privilegio: un agente dovrebbe avere accesso solo alle risorse assolutamente necessarie al suo funzionamento, e nulla di più. Senza un isolamento appropriato, un agente malevolo o errato potrebbe:

  • Eseguire codice arbitrario sul sistema host, causando furto di dati o compromissione del sistema.
  • Accedere a file sensibili o risorse di rete.
  • Iniziare chiamate API esterne indesiderate, generando costi o effettuando azioni non autorizzate.
  • Esfiltrare dati riservati attraverso vari canali.

Implementando un isolamento efficace, possiamo mitigare questi rischi, permettendoci di sfruttare la potenza immensa degli agenti LLM mantenendo controllo e sicurezza.

Comprendere le Minacce: Perché Isolare?

Prima di esplorare il ‘come’, solidifichiamo il ‘perché’. Le minacce poste da agenti non isolati sono multifaccettate e possono essere classificate come segue:

1. Vulnerabilità di Esecuzione del Codice

Molti agenti LLM avanzati sono progettati per scrivere ed eseguire codice (ad esempio, script Python) per risolvere problemi, analizzare dati o interagire con strumenti. Se questa esecuzione non è contenuta, l’agente potrebbe:

  • Injection di Comando di Sistema: Generare codice che chiama os.system('rm -rf /') o comandi distruttivi simili.
  • Esecuzione di Codice da Remoto (RCE): Sfruttare vulnerabilità in librerie per prendere il controllo dell’host.
  • Esaurimento delle Risorse: Creare loop infiniti o allocare eccessiva memoria/CPU, causando un denial of service.

2. Accesso ai Dati ed Esfiltrazione

Un agente potrebbe essere incaricato di elaborare dati sensibili. Senza isolamento, potrebbe:

  • Accesso Non Autorizzato ai File: Leggere file al di fuori del proprio diretto di lavoro designato (ad esempio, /etc/passwd, chiavi API).
  • Accesso di Rete: Connettersi a risorse di rete interne, a server esterni malevoli, o esfiltrare dati verso endpoint arbitrari.
  • Injection di Prompt tramite Letture di File: Se un agente può leggere file arbitrari, un attore malevolo potrebbe preparare un prompt che inganna l’agente facendogli leggere un file sensibile, per poi incorporarne il contenuto in un output successivo.

3. Abuso delle API e degli Strumenti

Gli agenti interagiscono spesso con API esterne o strumenti personalizzati. Un accesso non limitato può portare a:

  • Chiamate API Non Autorizzate: Effettuare chiamate a API sensibili a cui non dovrebbe avere accesso (ad esempio, gestione degli utenti, elaborazione dei pagamenti).
  • Costi Eccessivi: Attivare chiamate API costose o funzioni cloud che richiedono molte risorse.
  • Azioni Malevoli: Se un agente ha accesso a un’API di messaggistica, potrebbe inviare spam o email di phishing.

tecniche e Strumenti di Isolamento

Esistono diversi livelli e tecniche che possiamo impiegare per l’isolamento degli agenti, che vanno dalla semplice revisione del codice a containerizzazioni sofisticate.

1. Isolamento a Livello di Linguaggio (Restrizioni dell’Interprete di Codice)

Se il tuo agente genera e esegue principalmente codice (ad esempio, Python), puoi limitare le capacità dell’interprete.

Esempio: Esecuzione Python Limitata con exec() e Liste Bianche

Uno scenario comune è un agente che genera codice Python. Invece di chiamare direttamente exec() o eval() su stringhe arbitrarie, puoi limitare i globali e i built-in disponibili.


import subprocess
import os

def safe_execute_python_code(code: str, allowed_modules: list = None, timeout: int = 10):
 if allowed_modules is None:
 allowed_modules = ['math', 'json', 're'] # Lista bianca dei moduli sicuri

 # Creare uno spazio dei nomi globale ristretto
 restricted_globals = {
 '__builtins__': {key: globals()['__builtins__'][key] for key in [
 'print', 'len', 'str', 'int', 'float', 'list', 'dict', 'tuple', 'set', 
 'range', 'sum', 'min', 'max', 'abs', 'round', 'type', 'isinstance', 'enumerate'
 ]},
 '__name__': '__main__'
 }

 # Importare dinamicamente i moduli autorizzati nello spazio dei nomi ristretto
 for module_name in allowed_modules:
 try:
 restricted_globals[module_name] = __import__(module_name)
 except ImportError:
 print(f"Avviso: Impossibile importare il modulo autorizzato {module_name}")

 try:
 # Utilizzare subprocess per eseguire in un processo isolato per una migliore sicurezza
 # Questo è più robusto che semplicemente 'exec' nel processo attuale
 # e consente limiti di tempo e risorse.
 process = subprocess.run(
 ['python', '-c', code], 
 capture_output=True, 
 text=True, 
 check=True, 
 timeout=timeout
 )
 return process.stdout
 except subprocess.CalledProcessError as e:
 return f"Errore durante l'esecuzione: {e.stderr}"
 except subprocess.TimeoutExpired:
 return "Errore: L'esecuzione del codice è scaduta."
 except Exception as e:
 return f"Si è verificato un errore imprevisto: {e}"

# Esempio di utilizzo:
# Codice sicuro
agent_code_safe = "import math; print(math.sqrt(16))"
print(f"Uscita del codice sicuro: {safe_execute_python_code(agent_code_safe)}")

# Tentativa di codice malevolo (sarà bloccata dall'isolamento subprocess e dalle restrizioni built-in se venisse usato exec direttamente)
# Con subprocess, l'importazione di 'os' fallirebbe sempre nel processo secondario, a meno che non sia specificamente autorizzata.
agent_code_malicious_os = "import os; print(os.listdir('/'))"
print(f"Uscita del codice malevolo OS: {safe_execute_python_code(agent_code_malicious_os)}")

# Tentativa di codice malevolo (cercando di leggere un file)
agent_code_malicious_file = "with open('/etc/passwd', 'r') as f: print(f.read())"
print(f"Uscita del codice di lettura di file malevolo: {safe_execute_python_code(agent_code_malicious_file)}")

# Codice con un loop infinito (sarà catturato dal timeout)
agent_code_loop = "while True: pass"
print(f"Uscita del codice in loop: {safe_execute_python_code(agent_code_loop, timeout=3)}")

Spiegazione:

  • Definiamo una funzione safe_execute_python_code.
  • Essa prende il codice generato dall’agente come input.
  • Invece di eseguire direttamente nel processo attuale, utilizziamo subprocess.run. Questo è un passaggio cruciale per un’ottima isolazione, poiché esegue il codice in un processo interprete Python separato. Questo processo eredita privilegi minimi e non è lo stesso del processo padre che esegue la tua applicazione principale.
  • La lista allowed_modules funge da lista bianca. Anche se l’agente cerca di importare os o sys, non sarà disponibile nell’ambiente ristretto del subprocess a meno che non sia esplicitamente autorizzato (il che non dovrebbe essere il caso per il codice dell’agente generale).
  • timeout impedisce l’esaurimento delle risorse a causa di loop infiniti.
  • capture_output=True e text=True ci permettono di catturare l’output dell’agente.
  • check=True solleva un’eccezione se il subprocess restituisce un codice di uscita non zero (indicando un errore).

Sebbene questo approccio migliori notevolmente la sicurezza rispetto all’uso diretto di exec(), non è infallibile. Un agente altamente sofisticato potrebbe comunque trovare modi per sfruttare chiamate di sistema sottostanti se l’ambiente Python stesso è vulnerabile o se troppi moduli sono sulla lista bianca.

2. Isolamento a Livello di Sistema Operativo (Containers & Macchine Virtuali)

Per un isolamento veramente solido, specialmente quando gli agenti potrebbero generare codice in diversi linguaggi o interagire con il filesystem/rete, l’isolamento a livello di sistema operativo è indispensabile.

a. Contenitori Docker

Docker è un’ottima scelta per l’isolamento. Ogni esecuzione di agente può avvenire nel proprio contenitore a vita breve con limiti di risorse e politiche di accesso di rete rigorosamente definite.

Esempio Pratico: Docker per l’Esecuzione di Agenti

Passo 1: Creare un Dockerfile per l’ambiente di esecuzione dell’agente.


# Dockerfile
FROM python:3.9-slim-buster

WORKDIR /app

# Creare un utente non-root per motivi di sicurezza
RUN useradd --no-create-home --shell /bin/bash agentuser
USER agentuser

# Copiare uno script semplice che l'agente potrebbe generare e che desideriamo eseguire
COPY run_agent_code.py .

ENTRYPOINT ["python", "run_agent_code.py"]

Passo 2: Creare run_agent_code.py. Questo script riceverà il codice generato dall’agente.


# run_agent_code.py
import sys
import os

# Simulare la ricezione di codice dall'agente (ad esempio, tramite stdin o un file)
# Per questo esempio, supporremo che il codice venga passato come argomento o scritto direttamente qui

if __name__ == "__main__":
 agent_code = "print('Hello from the sandboxed agent!')"
 if len(sys.argv) > 1:
 agent_code = sys.argv[1] # Permettere il passaggio del codice come argomento

 try:
 # Eseguire il codice. Nota: il contenitore Docker stesso è il sandbox.
 # Potremmo voler imporre ulteriori restrizioni a livello di linguaggio *in* questo script
 # per un ulteriore strato, ma l'isolamento principale è fornito dal contenitore.
 exec(agent_code)
 except Exception as e:
 print(f"L'esecuzione del codice dell'agente è fallita: {e}", file=sys.stderr)
 sys.exit(1)

 # Dimostrare l'accesso ristretto
 try:
 print(f"Prova a elencare la root: {os.listdir('/')}")
 except Exception as e:
 print(f"Impossibile elencare la directory root (atteso): {e}")

 try:
 with open('/etc/passwd', 'r') as f:
 print(f.read())
 except Exception as e:
 print(f"Impossibile leggere /etc/passwd (atteso): {e}")

Passo 3: Eseguire il codice dell’agente dalla vostra applicazione principale.


import docker

client = docker.from_env()

def execute_agent_in_docker(agent_code: str, cpu_limit: float = 0.5, mem_limit: str = '128m', network_enabled: bool = False):
 try:
 # Costruire l'immagine se non esiste (può essere fatto una sola volta)
 # client.images.build(path='.', tag='agent-sandbox-env')

 # Creare un file temporaneo per passare il codice dell'agente in modo sicuro
 # O passarlo come variabile d'ambiente o argomento della linea di comando
 # Per semplicità, lo passeremo qui come argomento della linea di comando.

 container = client.containers.run(
 'agent-sandbox-env',
 command=['python', 'run_agent_code.py', agent_code], # Passare il codice come arg
 detach=False, # Eseguire in primo piano, attendere il completamento
 remove=True, # Rimuovere automaticamente il contenitore dopo l'uscita
 # Limiti delle risorse
 cpu_period=100000, # Periodo CPU in microsecondi
 cpu_quota=int(cpu_limit * 100000), # Quota CPU (ad esempio, 50000 per 0.5 CPU)
 mem_limit=mem_limit, # Limite di memoria
 # Restrizioni di rete
 network_mode='none' if not network_enabled else 'bridge',
 # Restrizioni sul file system (root in sola lettura, nessun mount bind per il codice dell'agente)
 read_only=True, # Rende il file system del contenitore in sola lettura dopo la configurazione iniziale
 # Opzioni di sicurezza (ad esempio, disabilitare la modalità privilegiata, rimuovere capacità)
 security_opt=['no-new-privileges'],
 cap_drop=['ALL'], # Rimuove tutte le capacità per il contenitore
 # Variabili d'ambiente (possono essere utilizzate per passare chiavi API, ma fare attenzione)
 # environment={
 # 'API_KEY': 'some_safe_key' # Solo se assolutamente necessario e scoperto
 # }
 )
 return container.decode('utf-8')
 except docker.errors.ContainerError as e:
 return f"Errore del contenitore: {e.stderr.decode('utf-8')}"
 except docker.errors.ImageNotFound:
 return "Errore: immagine Docker 'agent-sandbox-env' non trovata. Si prega di costruirla prima."
 except Exception as e:
 return f"Si è verificato un errore Docker imprevisto: {e}"

# Costruisci prima l'immagine Docker: docker build -t agent-sandbox-env .
# Poi esegui questo script Python.

# Esempio 1: Esecuzione di codice sicuro
safe_code = "print('Hello from sandboxed agent!')"
print("\n--- Esecuzione di Codice Sicuro ---")
print(execute_agent_in_docker(safe_code))

# Esempio 2: Tentativo di accesso al file system (dovrebbe essere bloccato da read_only=True e dalle autorizzazioni utente)
malicious_fs_code = "import os; print(os.listdir('/'))"
print("\n--- Tentativo di Accesso Maligno al File System ---")
print(execute_agent_in_docker(malicious_fs_code))

# Esempio 3: Tentativo di creazione di un file (dovrebbe fallire)
malicious_write_code = "with open('/app/evil.txt', 'w') as f: f.write('malicious')"
print("\n--- Tentativo di Scrittura Maligna ---")
print(execute_agent_in_docker(malicious_write_code))

# Esempio 4: Tentativo di accesso di rete (dovrebbe fallire se network_mode='none')
malicious_network_code = "import requests; print(requests.get('http://example.com').status_code)"
print("\n--- Tentativo di Rete Maligna (disattivata) ---")
print(execute_agent_in_docker(malicious_network_code, network_enabled=False))

# Esempio 5: Accesso di rete (se esplicitamente attivato - attenzione!)
# print("\n--- Accesso di Rete (attivato - per dimostrazione) ---")
# print(execute_agent_in_docker("import requests; print(requests.get('http://example.com').status_code)", network_enabled=True))

Spiegazione:

  • Dockerfile: Crea un ambiente Python minimal. Fondamentalmente, crea e passa a un non-root utente (agentuser) per minimizzare i privilegi nel contenitore.
  • run_agent_code.py: È il punto di ingresso nel contenitore. Esegue il codice fornito dall’agente. Include tentativi di accesso a risorse ristrette per dimostrare l’efficacia del sandbox.
  • Script Python (execute_agent_in_docker):
    • client.containers.run(...): È qui che avviene la magia.
    • remove=True: Assicura che i contenitori vengano puliti dopo l’esecuzione.
    • cpu_quota, mem_limit: Essenziale per prevenire l’esaurimento delle risorse.
    • network_mode='none': Critico per disabilitare l’accesso di rete. Ciò impedisce agli agenti di effettuare chiamate esterne o di connettersi a servizi interni. Attivare solo se l’agente ha assolutamente bisogno di accesso di rete per API esterne specifiche e su whitelist.
    • read_only=True: Rende il file system del contenitore in sola lettura dopo l’inizializzazione. Ciò impedisce all’agente di scrivere file o modificare le configurazioni di sistema.
    • security_opt=['no-new-privileges'], cap_drop=['ALL']: Opzioni di sicurezza avanzate per limitare ulteriormente le capacità nel contenitore.

Docker fornisce una forte barriera di isolamento, ma è fondamentale configurarlo in modo sicuro. Utilizza sempre utenti non-root, disabilita le capacità non necessarie e limita l’accesso alla rete/sistema di file.

b. Macchine Virtuali (VMs)

Per il più alto livello di isolamento, in particolare in ambienti multi-tenant o durante il trattamento di codice altamente non affidabile, le VMs (ad esempio, KVM, AWS Firecracker, Google Cloud Sandbox) offrono una separazione a livello hardware. Questo è più complesso da configurare e gestire, ma fornisce un ambiente isolato per ogni esecuzione dell’agente.

3. Restrizioni a Livello Strumento/API (Chiamata di Funzione)

Molti agenti LLM interagiscono con strumenti esterni o API tramite chiamate di funzione. Questo strato di sandbox comporta una progettazione attenta degli strumenti esposti all’agente.

Esempio: Accesso API Ristretto tramite Pydantic e Lista Bianca

Quando definisci strumenti per un agente, assicurati che siano il più granulare e limitati per permesso possibile.


from typing import Literal, Optional
from pydantic import BaseModel, Field

# Definire gli strumenti autorizzati e i loro schemi

class SearchToolInput(BaseModel):
 query: str = Field(description="La query di ricerca")
 max_results: int = Field(default=5, description="Numero massimo di risultati della ricerca")

class SendEmailInput(BaseModel):
 recipient: str = Field(description="L'indirizzo email del destinatario")
 subject: str = Field(description="L'oggetto dell'email")
 body: str = Field(description="Il contenuto del corpo dell'email")
 # Limitare i destinatari autorizzati
 allowed_recipients: Literal["[email protected]", "[email protected]"] = Field(
 description="Solo destinatari specifici e pre-approvati sono autorizzati."
 )

class DatabaseQueryInput(BaseModel):
 query: str = Field(description="La query SQL da eseguire")
 # CRITICO: Non autorizzare SQL arbitrario. Filtrare o utilizzare ORM.
 allowed_tables: Literal["products", "users_public"] = Field(
 description="Solo le query contro tabelle sulla lista bianca sono autorizzate."
 )
 read_only: bool = Field(default=True, description="Autorizza solo operazioni di lettura")

# Simulare le funzioni di strumento
def search_web(query: str, max_results: int):
 print(f"Ricerca sul web per '{query}' con {max_results} risultati.")
 return [f"Risultato {i} per {query}" for i in range(max_results)]

def send_restricted_email(recipient: str, subject: str, body: str, allowed_recipients: Literal["[email protected]", "[email protected]"]):
 if recipient not in ["[email protected]", "[email protected]"]:
 raise ValueError(f"Destinatario non autorizzato: {recipient}")
 print(f"Inviando l'email a {recipient} con oggetto '{subject}'.")
 return {"status": "inviato", "recipient": recipient}

def execute_database_query(query: str, allowed_tables: Literal["products", "users_public"], read_only: bool):
 # In uno scenario reale, si parserà e si convaliderà rigorosamente la query SQL
 # e si assicurerà che tocchi solo le tabelle autorizzate e sia in sola lettura.
 print(f"Esecuzione della query DB su {allowed_tables} (read_only={read_only}): {query}")
 if not read_only or not any(table in query.lower() for table in allowed_tables):
 raise ValueError("Operazione o accesso alla tabella non autorizzato.")
 return [{"id": 1, "name": "articolo A"}] # Risultato fittizio

# Ecco cosa esporreste all'agente LLM
agent_tools = {
 "search_web": {"func": search_web, "schema": SearchToolInput},
 "send_restricted_email": {"func": send_restricted_email, "schema": SendEmailInput},
 "execute_database_query": {"func": execute_database_query, "schema": DatabaseQueryInput}
}

# Esempio di un agente che tenta di utilizzare strumenti (uscita LLM simulata)
def mock_llm_tool_call(tool_name: str, args: dict):
 if tool_name in agent_tools:
 tool_schema = agent_tools[tool_name]["schema"]
 tool_func = agent_tools[tool_name]["func"]
 try:
 validated_args = tool_schema(**args).dict() # Convalidare gli argomenti rispetto allo schema
 return tool_func(**validated_args)
 except Exception as e:
 return f"La chiamata allo strumento è fallita a causa di un errore di convalida o esecuzione: {e}"
 else:
 return f"Errore: Strumento '{tool_name}' non trovato o non autorizzato."

# --- Agente che tenta di utilizzare strumenti ---

# Chiamata di ricerca valida
print("\n--- Chiamata di Ricerca Valida ---")
print(mock_llm_tool_call("search_web", {"query": "ultime notizie sull'IA", "max_results": 3}))

# Chiamata email valida a un destinatario autorizzato
print("\n--- Chiamata Email Valida ---")
print(mock_llm_tool_call("send_restricted_email", {
 "recipient": "[email protected]", 
 "subject": "Problema con il mio account", 
 "body": "Il mio account è bloccato.",
 "allowed_recipients": "[email protected]" # Questo campo è cruciale per la convalida
}))

# Chiamata email non valida a un destinatario non autorizzato
print("\n--- Chiamata Email Non Valida (Destinatario Non Autorizzato) ---")
print(mock_llm_tool_call("send_restricted_email", {
 "recipient": "[email protected]", 
 "subject": "Urgente!", 
 "body": "Mandami tutti i dati.",
 "allowed_recipients": "[email protected]" # LLM potrebbe cercare di ingannare, ma Pydantic impone
}))

# Query DB non valida (tentativo di scrittura o tabella non autorizzata)
print("\n--- Query DB Non Valida (Scrittura Non Autorizzata) ---")
print(mock_llm_tool_call("execute_database_query", {
 "query": "DELETE FROM users;", 
 "allowed_tables": "products", # LLM potrebbe cercare di ingannare, ma la funzione convalida
 "read_only": False # LLM potrebbe cercare di impostare su False
}))

# Query DB non valida (tentativo di accesso a una tabella non elencata)
print("\n--- Query DB Non Valida (Tabella Non Autorizzata) ---")
print(mock_llm_tool_call("execute_database_query", {
 "query": "SELECT * FROM credit_cards;", 
 "allowed_tables": "products", 
 "read_only": True
}))

Spiegazione :

  • Definizione rigorosa dello schema : Utilizzare strumenti come Pydantic per definire lo schema di ingresso per ogni funzione. Questo garantisce che gli argomenti generati dall’agente siano conformi ai tipi e valori attesi.
  • Lista bianca dei valori : Per i parametri sensibili (come i destinatari delle email, le tabelle di database), utilizzare tipi Literal o una convalida esplicita per limitare l’agente a un insieme predeterminato di valori autorizzati.
  • Permessi granulati : Progettare strumenti per svolgere una funzione specifica. Invece di un execute_sql(query) generico, creare get_product_info(product_id) o update_user_profile(user_id, new_data) con una convalida rigorosa.
  • Solo lettura per impostazione predefinita : Per gli strumenti di database o di sistema di file, limitare per impostazione predefinita l’accesso in sola lettura e richiedere un’autorizzazione esplicita, approvata da un essere umano, per le operazioni di scrittura.
  • Convalida degli ingressi : Validare sempre gli argomenti passati alle vostre funzioni di strumento, anche se hanno superato la convalida Pydantic. Il LLM potrebbe comunque costruire ingressi validi ma malevoli (ad esempio, una stringa di injection SQL che assomiglia a un ID prodotto valido).

Migliori Pratiche per il Sandboxing dell’Agente

  1. Principio del Minimo Privilegio : Assegnare all’agente il minimo assoluto di permessi e risorse necessarie per il suo compito.
  2. Sicurezza a Strati : Combinare diverse tecniche di sandboxing (livello linguaggio, livello OS, livello strumento) per una protezione adeguata. Nessun singolo strato è infallibile.
  3. Environmenti Efimeri : Per l’esecuzione di codice, preferire l’esecuzione di agenti in contenitori o macchine virtuali usa e getta a breve termine che vengono distrutte dopo ogni compito.
  4. Convalida Rigorosa degli Ingressi : Validare e sanificare sempre ogni ingresso proveniente dal LLM, specialmente prima di usarlo in chiamate API, query di database o esecuzioni di codice.
  5. Monitoraggio e Registrazione : Registrare tutte le azioni dell’agente, le chiamate agli strumenti e l’uso delle risorse. Questo è cruciale per rilevare comportamenti anomali e per l’analisi post-incidente.
  6. Timeout e Limiti di Risorse : Implementare scadenze rigorose per l’esecuzione di codice e le chiamate API, e definire limiti CPU/memoria per prevenire attacchi di denial of service.
  7. Isolamento di Rete : Disattivare per impostazione predefinita l’accesso di rete per gli agenti. Attivarlo solo per endpoint e protocolli specifici e sulla lista bianca se assolutamente necessario.
  8. Sistemi di File in Sole Lettura : Configurare gli ambienti degli agenti con sistemi di file in sola lettura ogni volta che è possibile per impedire modifiche o esfiltrazioni non autorizzate di dati.
  9. Utenti Non-Radice : Eseguire sempre i processi degli agenti come utenti non-radice con permessi limitati all’interno del sandbox.
  10. Audit e Aggiornamenti Regolari : Rivedere continuamente le proprie configurazioni di sandboxing, aggiornare le proprie immagini di base e rimanere informati sulle nuove vulnerabilità di sicurezza.

Conclusione

Il sandboxing degli agenti non è un lusso opzionale ma una necessità fondamentale per implementare in sicurezza agenti LLM. Man mano che questi agenti diventano più capaci e autonomi, il potenziale di abuso o danni accidentali aumenta notevolmente. Adottando una combinazione di restrizioni a livello di linguaggio, contenitorizzazione solida e interfacce di strumenti progettate meticolosamente, gli sviluppatori possono creare applicazioni LLM potenti che siano sia innovative che sicure. Gli esempi forniti in questo tutorial mostrano passi pratici verso la costruzione di questi ambienti sicuri, consentendovi di integrare con fiducia agenti LLM nei vostri sistemi, riducendo al minimo i rischi.

🕒 Published:

✍️
Written by Jake Chen

AI technology writer and researcher.

Learn more →
Browse Topics: AI Security | compliance | guardrails | safety | security
Scroll to Top