Gateway

Sicurezza

Ambito: modello di sicurezza dell'assistente personale

  • Supportato: un utente/confine di fiducia per Gateway (preferibilmente un utente del sistema operativo/host/VPS per confine).
  • Non supportato: un Gateway/agente condiviso utilizzato da utenti reciprocamente non fidati o avversari.
  • L'isolamento degli utenti avversari richiede Gateway separati (e, idealmente, utenti del sistema operativo/host separati).
  • Se più utenti non fidati possono inviare messaggi a un agente dotato di strumenti, condividono l'autorità delegata sugli strumenti di tale agente.
  • Se qualcuno può modificare lo stato/la configurazione dell'host del Gateway (~/.openclaw, incluso openclaw.json), deve essere considerato un operatore fidato.
  • All'interno di un Gateway, l'accesso autenticato dell'operatore è un ruolo fidato del piano di controllo, non un ruolo tenant per utente.
  • sessionKey (ID di sessione, etichette) è un selettore di instradamento, non un token di autorizzazione.

Occorre ospitare più utenti o organizzazioni? Eseguire una cella Gateway isolata per ogni tenant anziché condividere un Gateway. Consultare Hosting multi-tenant.

Prima di modificare l'accesso remoto, i criteri dei messaggi diretti, il proxy inverso o l'esposizione pubblica, seguire il runbook per l'esposizione del Gateway come elenco di controllo preliminare e di rollback.

openclaw security audit

Eseguire quanto segue dopo qualsiasi modifica alla configurazione o prima di esporre superfici di rete:

bash
openclaw security auditopenclaw security audit --deep    # tenta un probe del Gateway in tempo realeopenclaw security audit --fix     # applica correzioni sicureopenclaw security audit --json

--fix ha intenzionalmente un ambito limitato: converte i criteri dei gruppi aperti in elenchi consentiti, ripristina logging.redactSensitive: "tools", restringe le autorizzazioni per stato/configurazione/file inclusi (file 600, directory 700) e su Windows utilizza il ripristino degli ACL anziché chmod POSIX.

Controlli eseguiti dall'audit (panoramica)

  • Accesso in entrata - criteri ed elenchi consentiti per messaggi diretti/gruppi: gli estranei possono attivare il bot?
  • Raggio d'azione degli strumenti - strumenti con privilegi elevati + stanze aperte: un'iniezione di prompt potrebbe trasformarsi in azioni su shell/file/rete?
  • Deriva del file system di esecuzione - strumenti che modificano il file system negati mentre exec/process rimangono disponibili senza vincoli di sandbox.
  • Deriva delle approvazioni di esecuzione - security="full", autoAllowSkills, elenchi consentiti degli interpreti senza strictInlineEval. security="full" da solo è un avviso generale sul livello di sicurezza, non la prova di un bug: è l'impostazione predefinita scelta per le configurazioni fidate di assistente personale; restringerla solo quando il modello di minaccia richiede approvazioni o protezioni basate su elenchi consentiti.
  • Esposizione di rete - associazione/autenticazione del Gateway, Tailscale Serve/Funnel, token di autenticazione deboli o brevi.
  • Esposizione del controllo del browser - nodi remoti, porte di inoltro, endpoint CDP remoti.
  • Igiene del disco locale - autorizzazioni, collegamenti simbolici, inclusioni di configurazione, percorsi di cartelle sincronizzate.
  • Plugin - caricamento senza un elenco consentito esplicito.
  • Deriva dei criteri - impostazioni Docker della sandbox configurate ma modalità sandbox disattivata; voci gateway.nodes.denyCommands che sembrano efficaci ma corrispondono solo a ID di comando esatti (ad esempio system.run), non al testo della shell all'interno del payload; voci gateway.nodes.allowCommands pericolose; tools.profile="minimal" globale sovrascritto per singolo agente; strumenti di proprietà dei Plugin raggiungibili con criteri permissivi.
  • Deriva delle aspettative di runtime - presupporre che l'esecuzione implicita significhi ancora sandbox quando tools.exec.host ora usa per impostazione predefinita auto, oppure impostare tools.exec.host="sandbox" mentre la modalità sandbox è disattivata.
  • Igiene dei modelli - segnala i modelli legacy configurati (avviso non vincolante, non blocco rigido).

Ogni risultato ha un checkId strutturato (ad esempio gateway.bind_no_auth, tools.exec.security_full_configured). Prefissi: fs.* (autorizzazioni), gateway.* (associazione/autenticazione/Tailscale/Control UI/proxy fidato), hooks.*/browser.*/sandbox.*/tools.exec.* (rafforzamento per superficie), plugins.*/skills.* (catena di fornitura), security.exposure.* (criteri di accesso x raggio d'azione degli strumenti). Catalogo completo con gravità e supporto per la correzione automatica: Controlli dell'audit di sicurezza. Consultare anche Verifica formale.

Ordine di priorità per la valutazione dei risultati

  1. Qualsiasi elemento "aperto" con strumenti abilitati: bloccare prima i messaggi diretti/gruppi (associazione/elenchi consentiti), quindi restringere i criteri degli strumenti e la sandbox.
  2. Esposizione alla rete pubblica (associazione LAN, Funnel, autenticazione mancante): correggere immediatamente.
  3. Esposizione remota del controllo del browser: trattarla come accesso dell'operatore (solo tailnet, associare deliberatamente i nodi, nessuna esposizione pubblica).
  4. Autorizzazioni: stato/configurazione/credenziali/autenticazione non devono essere leggibili dal gruppo o da chiunque.
  5. Plugin: caricare solo quelli esplicitamente considerati fidati.
  6. Scelta del modello: preferire modelli moderni e resistenti alle istruzioni ostili per qualsiasi bot dotato di strumenti.

Configurazione di base rafforzata in 60 secondi

json5
{  gateway: {    mode: "local",    bind: "loopback",    auth: { mode: "token", token: "replace-with-long-random-token" },  },  session: {    dmScope: "per-channel-peer",  },  tools: {    profile: "messaging",    deny: ["group:automation", "group:runtime", "group:fs", "sessions_spawn", "sessions_send"],    fs: { workspaceOnly: true },    exec: { security: "deny", ask: "always" },    elevated: { enabled: false },  },  channels: {    whatsapp: { dmPolicy: "pairing", groups: { "*": { requireMention: true } } },  },}

Mantiene il Gateway accessibile solo localmente, isola i messaggi diretti e disabilita per impostazione predefinita gli strumenti del piano di controllo e di runtime. Da questa configurazione, riabilitare selettivamente gli strumenti per ogni agente fidato.

Configurazione di base integrata per i turni degli agenti avviati tramite chat: i mittenti diversi dal proprietario non possono utilizzare gli strumenti cron o gateway, indipendentemente dalla configurazione.

Matrice dei confini di fiducia

Modello rapido per valutare le segnalazioni dei rischi:

Confine o controllo Significato Interpretazione errata comune
gateway.auth (token/password/trusted-proxy/device auth) Autentica i chiamanti delle API del Gateway "Per essere sicuro richiede firme per messaggio su ogni frame"
sessionKey Chiave di instradamento per selezionare contesto/sessione "La chiave di sessione è un confine di autenticazione dell'utente"
Protezioni per prompt/contenuti Riducono il rischio di abuso del modello "L'iniezione di prompt da sola dimostra un aggiramento dell'autenticazione"
canvas.eval / valutazione nel browser Funzionalità intenzionale dell'operatore quando abilitata "Qualsiasi primitiva di valutazione JS è automaticamente una vulnerabilità in questo modello di fiducia"
Shell ! della TUI locale Esecuzione locale avviata esplicitamente dall'operatore "Il comando pratico della shell locale è un'iniezione remota"
Associazione dei nodi e comandi dei nodi Esecuzione remota a livello di operatore sui dispositivi associati "Il controllo remoto dei dispositivi deve essere trattato per impostazione predefinita come accesso di utenti non fidati"
gateway.nodes.pairing.autoApproveCidrs Criterio opzionale di registrazione dei nodi su una rete fidata "Un elenco consentito disabilitato per impostazione predefinita costituisce automaticamente una vulnerabilità di associazione"
gateway.nodes.pairing.sshVerify Registrazione del nodo con verifica della chiave tramite SSH dell'operatore "L'approvazione automatica attiva per impostazione predefinita costituisce automaticamente una vulnerabilità di associazione"

Comportamenti che per progettazione non costituiscono vulnerabilità

Risultati comuni chiusi senza interventi
  • Catene basate sulla sola iniezione di prompt senza aggiramento dei criteri, dell'autenticazione o della sandbox.
  • Affermazioni che presuppongono un funzionamento multi-tenant ostile su un singolo host o una configurazione condivisa.
  • Normale accesso dell'operatore ai percorsi di lettura (ad esempio sessions.list / sessions.preview / chat.history) classificato come IDOR in una configurazione con Gateway condiviso.
  • Risultati relativi a distribuzioni esclusivamente localhost (ad esempio HSTS mancante su un Gateway accessibile solo tramite loopback).
  • Risultati relativi alla firma dei Webhook in entrata di Discord per percorsi in entrata che non esistono in questo repository.
  • Metadati di associazione dei nodi trattati come un secondo livello nascosto di approvazione per comando per system.run; il vero confine di esecuzione è costituito dai criteri globali del Gateway per i comandi dei nodi e dalle approvazioni di esecuzione proprie del nodo.
  • gateway.nodes.pairing.sshVerify trattato come una vulnerabilità perché è abilitato per impostazione predefinita. Non concede mai l'approvazione basandosi esclusivamente sulla prossimità di rete o sulla raggiungibilità SSH: il Gateway rilegge l'identità del dispositivo tramite SSH (BatchMode, chiavi host rigorose) e approva solo in caso di corrispondenza esatta tra la chiave del dispositivo e la richiesta in sospeso, il che richiede che la coppia di chiavi in connessione sia già presente nell'account dell'operatore su un host controllato dall'operatore. I probe sono limitati agli indirizzi sorgente privati/CGNAT, condividono il requisito minimo di idoneità dei CIDR fidati (solo role: node recente e senza ambito) e sshVerify: false disattiva la funzionalità.
  • gateway.nodes.pairing.autoApproveCidrs trattato di per sé come una vulnerabilità. È disabilitato per impostazione predefinita, richiede voci CIDR/IP esplicite, si applica solo alla prima associazione role: node senza ambiti richiesti e non approva mai automaticamente operatore/browser/Control UI, WebChat, aggiornamenti di ruolo/ambito, modifiche dei metadati o della chiave pubblica né percorsi di intestazione del proxy fidato tramite loopback sullo stesso host (anche quando l'autenticazione tramite proxy fidato su loopback è abilitata).
  • Risultati di "autorizzazione per utente mancante" che trattano sessionKey come un token di autenticazione.

Fiducia nel Gateway e nei nodi

Considerare il Gateway e il nodo come un unico dominio di fiducia dell'operatore con ruoli diversi:

  • Gateway: piano di controllo e superficie dei criteri (gateway.auth, criteri degli strumenti, instradamento).
  • Nodo: superficie di esecuzione remota associata a tale Gateway (comandi, azioni sui dispositivi, funzionalità locali dell'host).
  • Un chiamante autenticato presso il Gateway è considerato fidato nell'ambito del Gateway; dopo l'associazione, le azioni del nodo sono azioni fidate dell'operatore su tale nodo. Consultare Ambiti dell'operatore.
  • I client backend diretti su loopback autenticati con il token/password condiviso del Gateway possono effettuare RPC interni del piano di controllo senza presentare un'identità del dispositivo dell'utente. Questo non costituisce un aggiramento remoto o tramite browser dell'associazione: i client di rete, i client dei nodi, i client con token del dispositivo e le identità esplicite dei dispositivi continuano a essere sottoposti all'associazione e all'applicazione degli aggiornamenti dell'ambito.
  • Le approvazioni di esecuzione (elenco consentito + richiesta) sono protezioni per l'intento dell'operatore, non un isolamento multi-tenant ostile. Vincolano il contesto esatto della richiesta e, con il massimo impegno possibile, gli operandi diretti dei file locali; non modellano semanticamente ogni percorso di caricamento del runtime/interprete. Utilizzare la sandbox e l'isolamento dell'host per ottenere confini robusti.
  • Impostazione predefinita per un singolo operatore fidato: l'esecuzione sull'host in gateway/node è consentita senza richieste di approvazione (security="full", ask="off"). Si tratta di un'esperienza utente intenzionale, non di per sé di una vulnerabilità.

Per isolare utenti ostili, separare i confini di fiducia per utente del sistema operativo/host ed eseguire Gateway distinti.

Modello di minaccia

Il tuo assistente IA può eseguire comandi shell arbitrari, leggere/scrivere file, accedere a servizi di rete e inviare messaggi a chiunque (se dispone dell'accesso al canale). Chi gli invia messaggi può tentare di indurlo con l'inganno a compiere azioni dannose, ottenere l'accesso ai tuoi dati tramite ingegneria sociale o sondare i dettagli dell'infrastruttura.

La maggior parte degli incidenti in questo ambito non deriva da exploit sofisticati, ma dal fatto che «qualcuno ha inviato un messaggio al bot e il bot ha fatto ciò che gli è stato chiesto». L'approccio di OpenClaw, in ordine, è il seguente:

  1. Prima l'identità: stabilire chi può comunicare con il bot (associazione dei messaggi diretti / elenchi di elementi consentiti / modalità esplicitamente «aperta»).
  2. Poi l'ambito: stabilire dove può operare il bot (elenchi dei gruppi consentiti + attivazione tramite menzione, strumenti, sandboxing, autorizzazioni del dispositivo).
  3. Infine il modello: presupporre che il modello possa essere manipolato; progettare il sistema in modo che la manipolazione abbia un raggio d'impatto limitato.

Accesso tramite messaggi diretti: associazione, elenco degli elementi consentiti, aperto, disabilitato

Ogni canale che supporta i messaggi diretti dispone di dmPolicy (o *.dm.policy), che filtra i messaggi diretti in ingresso prima che vengano elaborati:

Criterio Comportamento
pairing Impostazione predefinita. I mittenti sconosciuti ricevono un codice di associazione; il bot li ignora finché non vengono approvati. I codici scadono dopo 1 ora; ulteriori messaggi diretti non comportano il reinvio del codice finché non viene creata una nuova richiesta. Il limite delle richieste in sospeso è 3 per canale.
allowlist I mittenti sconosciuti vengono bloccati, senza procedura di associazione.
open Chiunque può inviare messaggi diretti (accesso pubblico). Richiede che l'elenco degli elementi consentiti del canale includa "*" (consenso esplicito).
disabled I messaggi diretti in ingresso vengono ignorati completamente.
bash
openclaw pairing list <channel>openclaw pairing approve <channel> <code>

Dettagli e file sul disco: Associazione

Considerare dmPolicy="open" e groupPolicy="open" come impostazioni di ultima istanza; preferire l'associazione e gli elenchi degli elementi consentiti, a meno che non ci si fidi pienamente di ogni membro della stanza.

Elenchi degli elementi consentiti (due livelli)

  • Elenco dei messaggi diretti consentiti (allowFrom / channels.discord.allowFrom / channels.slack.allowFrom; precedente: channels.discord.dm.allowFrom, channels.slack.dm.allowFrom): chi può inviare messaggi diretti al bot. Quando dmPolicy="pairing", le approvazioni vengono scritte in ~/.openclaw/credentials/<channel>-allowFrom.json (account predefinito) o <channel>-<accountId>-allowFrom.json (account non predefiniti) e unite agli elenchi degli elementi consentiti della configurazione.
  • Elenco dei gruppi consentiti (specifico del canale): quali gruppi/canali/gilde vengono accettati dal bot.
    • channels.whatsapp.groups, channels.telegram.groups, channels.imessage.groups: impostazioni predefinite per gruppo, come requireMention; quando sono configurate, fungono anche da elenco dei gruppi consentiti (includere "*" per mantenere il comportamento che consente tutti i gruppi). Personalizzare i trigger di menzione con agents.list[].groupChat.mentionPatterns (ad esempio ["@openclaw", "@mybot"]), affinché requireMention applichi il filtro usando i nomi personalizzati del bot.
    • groupPolicy="allowlist" + groupAllowFrom: limitano chi può attivare il bot all'interno di una sessione di gruppo (WhatsApp/Telegram/Signal/iMessage/Microsoft Teams).
    • channels.discord.guilds / channels.slack.channels: elenchi degli elementi consentiti e impostazioni predefinite per le menzioni, specifici per superficie.
    • Ordine dei controlli: prima groupPolicy/elenchi dei gruppi consentiti, poi attivazione tramite menzione/risposta. Rispondere a un messaggio del bot (menzione implicita) non aggira groupAllowFrom.

Dettagli: Configurazione e Gruppi

Isolamento delle sessioni dei messaggi diretti (modalità multiutente)

Per impostazione predefinita, OpenClaw indirizza tutti i messaggi diretti alla sessione principale per garantire la continuità tra dispositivi. Se più persone possono inviare messaggi diretti al bot (messaggi diretti aperti o elenco multiutente degli elementi consentiti), isolare le sessioni dei messaggi diretti:

json5
{ session: { dmScope: "per-channel-peer" } }

Valori di session.dmScope:

Valore Ambito
main (impostazione predefinita della configurazione) Tutti i messaggi diretti condividono un'unica sessione.
per-channel-peer Ogni coppia canale+mittente dispone di un contesto isolato per i messaggi diretti (modalità sicura per i messaggi diretti).
per-account-channel-peer Come sopra, con un'ulteriore separazione per account (canali con più account).
per-peer Ogni mittente dispone di un'unica sessione su tutti i canali dello stesso tipo.

L'onboarding tramite CLI locale scrive session.dmScope: "per-channel-peer" quando non è impostato e conserva qualsiasi valore esistente definito esplicitamente.

Questo è un confine del contesto di messaggistica, non un confine di amministrazione dell'host. Se gli utenti sono reciprocamente ostili e condividono lo stesso host/la stessa configurazione del Gateway, eseguire gateway distinti per ciascun confine di fiducia.

Se la stessa persona stabilisce un contatto su più canali, utilizzare session.identityLinks per unificare tali sessioni di messaggi diretti in un'unica identità canonica. Consultare Gestione delle sessioni e Configurazione.

Visibilità del contesto e autorizzazione all'attivazione

Due concetti distinti:

  • Autorizzazione all'attivazione: chi può attivare l'agente (dmPolicy, groupPolicy, elenchi degli elementi consentiti, filtri delle menzioni).
  • Visibilità del contesto: quale contesto supplementare raggiunge il modello (corpo della risposta, testo citato, cronologia della conversazione, metadati inoltrati).

contextVisibility controlla il secondo aspetto:

  • "all" (impostazione predefinita): il contesto supplementare viene mantenuto così come ricevuto.
  • "allowlist": il contesto supplementare viene filtrato limitandolo ai mittenti ammessi dai controlli attivi degli elenchi degli elementi consentiti.
  • "allowlist_quote": come allowlist, ma mantiene comunque una risposta citata esplicitamente.

Impostare per canale o per stanza/conversazione; consultare Gruppi. Le segnalazioni che mostrano soltanto che «il modello può vedere testo citato o storico proveniente da mittenti non inclusi nell'elenco degli elementi consentiti» sono constatazioni relative all'irrobustimento, risolvibili con contextVisibility, e non costituiscono di per sé aggiramenti dell'autenticazione o della sandbox; una segnalazione con impatto sulla sicurezza deve comunque dimostrare l'aggiramento di un confine di fiducia.

Prompt injection

Un autore di attacchi crea un messaggio che manipola il modello inducendolo a eseguire un'azione non sicura («ignora le istruzioni», «mostra il contenuto del file system», «segui questo link ed esegui i comandi»). La prompt injection non si risolve soltanto con le misure di sicurezza del prompt di sistema: queste forniscono indicazioni non vincolanti; l'applicazione rigorosa deriva dai criteri degli strumenti, dalle approvazioni per l'esecuzione, dal sandboxing e dagli elenchi dei canali consentiti (che gli operatori possono comunque disabilitare intenzionalmente).

La prompt injection non richiede messaggi diretti pubblici: anche se soltanto una persona può inviare messaggi al bot, qualsiasi contenuto non attendibile letto dal bot (risultati di ricerche/recuperi Web, pagine del browser, email, documenti, allegati, log/codice incollati) può contenere istruzioni ostili. Il contenuto stesso costituisce una superficie di minaccia, non soltanto il mittente.

Segnali di allarme da considerare non attendibili:

  • «Leggi questo file/URL e fai esattamente ciò che dice».
  • «Ignora il prompt di sistema o le regole di sicurezza».
  • «Rivela le istruzioni nascoste o gli output degli strumenti».
  • «Incolla l'intero contenuto di ~/.openclaw o dei log».

Misure utili nella pratica:

  • Mantenere rigorosamente limitati i messaggi diretti in ingresso (associazione/elenchi degli elementi consentiti); preferire l'attivazione tramite menzione nei gruppi; evitare bot sempre attivi nelle stanze pubbliche.
  • Considerare collegamenti, allegati e istruzioni incollate come ostili per impostazione predefinita.
  • Eseguire gli strumenti sensibili in una sandbox; tenere i segreti fuori dal file system accessibile all'agente. Il sandboxing è facoltativo: se la modalità sandbox è disattivata, host=auto implicito viene risolto nell'host del Gateway, mentre host=sandbox esplicito continua a non consentire l'operazione in caso di errore (nessun runtime sandbox disponibile). Impostare host=gateway per rendere esplicito questo comportamento nella configurazione.
  • Limitare gli strumenti ad alto rischio (exec, browser, web_fetch, web_search) agli agenti attendibili o a elenchi espliciti degli elementi consentiti.
  • Se si includono interpreti nell'elenco degli elementi consentiti (python, node, ruby, perl, php, lua, osascript), abilitare tools.exec.strictInlineEval affinché le forme di valutazione inline (-c, -e e simili) richiedano comunque un'approvazione esplicita. In modalità elenco degli elementi consentiti, qualsiasi segmento heredoc (<<) richiede sempre la revisione o l'approvazione esplicita, indipendentemente dall'uso delle virgolette: un comando consentito non può usare il corpo di un heredoc per aggirare la revisione dell'elenco degli elementi consentiti.
  • Ridurre il raggio d'impatto utilizzando un agente di lettura di sola lettura o privo di strumenti per riepilogare i contenuti non attendibili, quindi passare il riepilogo all'agente principale.
  • Per gli hook di Gmail, la sessione integrata per singolo messaggio isola il contesto della conversazione, ma non rimuove le autorizzazioni per gli strumenti o lo spazio di lavoro dell'agente di destinazione. Indirizzare la posta non attendibile a un agente di lettura dedicato, applicare restrizioni di sandbox e degli strumenti per agente e limitare qualsiasi passaggio all'agente principale mediante tools.agentToAgent. Consultare Integrazione con Gmail.
  • Mantenere web_search / web_fetch / browser disattivati per gli agenti dotati di strumenti, salvo necessità.
  • Per gli input URL di OpenResponses (input_file / input_image), impostare valori restrittivi per gateway.http.endpoints.responses.files.urlAllowlist / images.urlAllowlist e mantenere basso maxUrlParts (gli elenchi vuoti degli elementi consentiti sono considerati non impostati). Utilizzare files.allowUrl: false / images.allowUrl: false per disabilitare completamente il recupero degli URL.
  • Tenere i segreti fuori dai prompt; passarli invece tramite ambiente/configurazione sull'host del Gateway.

La scelta del modello è importante. La resistenza alla prompt injection non è uniforme tra le diverse fasce di modelli: i modelli più piccoli/economici sono maggiormente suscettibili all'uso improprio degli strumenti e al dirottamento delle istruzioni in presenza di prompt ostili.

  • Utilizzare il modello di ultima generazione e della fascia migliore per qualsiasi bot in grado di eseguire strumenti o accedere a file/reti.
  • Non utilizzare fasce meno recenti/meno potenti/più piccole per agenti dotati di strumenti o caselle di posta non attendibili.
  • Se è necessario utilizzare un modello più piccolo, ridurre il raggio d'impatto: strumenti di sola lettura, sandboxing rigoroso, accesso minimo al file system ed elenchi rigorosi degli elementi consentiti. Abilitare il sandboxing per tutte le sessioni e disabilitare web_search/web_fetch/browser, a meno che gli input non siano controllati rigorosamente.
  • Per gli assistenti personali destinati esclusivamente alla chat, con input attendibili e senza strumenti, i modelli più piccoli sono generalmente adeguati.

Contenuti esterni e incapsulamento degli input non attendibili

Il testo input_file di OpenResponses viene comunque inserito come contenuto esterno non attendibile, anche se il Gateway lo decodifica localmente: il blocco contiene marcatori di confine <<&lt;EXTERNAL_UNTRUSTED_CONTENT ...&gt;>> e metadati Source: External (questo percorso omette il banner SECURITY NOTICE: più lungo utilizzato altrove). Lo stesso incapsulamento basato su marcatori si applica quando la comprensione dei contenuti multimediali estrae testo dai documenti allegati prima di aggiungerlo al prompt multimediale.

OpenClaw rimuove inoltre i comuni token speciali letterali dei template di chat degli LLM self-hosted (token di ruolo/turno Qwen/ChatML, Llama, Gemma, Mistral, Phi, GPT-OSS) dai contenuti esterni incapsulati e dai metadati prima che raggiungano il modello. I backend self-hosted compatibili con OpenAI (vLLM, SGLang, TGI, LM Studio, stack di tokenizer Hugging Face personalizzati) talvolta tokenizzano stringhe letterali come <|im_start|> o <|start_header_id|> come token strutturali del template di chat all'interno dei contenuti dell'utente; senza questa sanitizzazione, il testo non attendibile in una pagina recuperata, nel corpo di un'email o nell'output di uno strumento per il contenuto dei file potrebbe falsificare un confine di ruolo sintetico assistant/system. La sanitizzazione avviene nel livello di incapsulamento dei contenuti esterni, quindi si applica uniformemente agli strumenti di recupero/lettura e ai contenuti in entrata dai canali. I provider ospitati (OpenAI, Anthropic) applicano già la propria sanitizzazione sul lato della richiesta; mantenere abilitato l'incapsulamento dei contenuti esterni e preferire, quando disponibili, impostazioni del backend che separino o eseguano l'escape dei token speciali.

Le risposte in uscita del modello dispongono di un sanitizzatore separato che rimuove <tool_call>, <function_calls>, <system-reminder>, <previous_response> e simili strutture interne eventualmente trapelate dalle risposte visibili all'utente, in corrispondenza del confine finale di consegna al canale.

Questo non sostituisce dmPolicy, gli elenchi di elementi consentiti, le approvazioni per l'esecuzione, il sandboxing o contextVisibility: chiude una specifica possibilità di aggiramento a livello del tokenizer.

Flag di aggiramento (mantenere disattivati in produzione)

  • hooks.mappings[].allowUnsafeExternalContent
  • hooks.gmail.allowUnsafeExternalContent
  • Campo del payload Cron allowUnsafeExternalContent

Abilitare solo temporaneamente per attività di debug con ambito strettamente delimitato; se vengono abilitati, isolare l'agente (sandbox + strumenti minimi + spazio dei nomi di sessione dedicato).

I payload degli hook sono contenuti non attendibili anche quando la consegna proviene da sistemi sotto il proprio controllo (i contenuti di posta/documenti/web possono veicolare prompt injection). I livelli di modello meno affidabili aumentano questo rischio: per l'automazione basata su hook, preferire livelli di modelli moderni e robusti e mantenere restrittiva la politica degli strumenti (tools.profile: "messaging" o più restrittiva), oltre al sandboxing ove possibile.

Ragionamento e output dettagliato nei gruppi

/reasoning, /verbose e /trace possono esporre ragionamenti interni, output degli strumenti o diagnostica dei plugin non destinati a un canale pubblico; possono includere argomenti degli strumenti, URL, diagnostica dei plugin e dati visualizzati dal modello. Mantenerli disabilitati nelle stanze pubbliche; abilitarli solo nei messaggi diretti attendibili o nelle stanze sottoposte a stretto controllo.

Autorizzazione dei comandi

I comandi slash e le direttive vengono rispettati solo per i mittenti autorizzati, determinati dagli elenchi di elementi consentiti/associazione del canale e da commands.useAccessGroups (vedere Configurazione e Comandi slash). Se l'elenco di elementi consentiti di un canale è vuoto o include "*", i comandi sono di fatto aperti per quel canale.

/exec è una funzionalità pratica, limitata alla sessione, per gli operatori autorizzati: non scrive la configurazione né modifica altre sessioni.

Strumenti del piano di controllo

Due strumenti integrati rimangono sensibili per il piano di controllo:

  • gateway legge la configurazione con config.schema.lookup / config.get. Non può scrivere la configurazione, aggiornare OpenClaw o riavviare il Gateway.
  • cron crea processi pianificati che continuano a essere eseguiti dopo la conclusione della chat o dell'attività originale.

Lo strumento gateway rimane riservato al proprietario perché la lettura della configurazione può esporre segreti e la topologia dell'host. Gli agenti richiedono modifiche persistenti alla configurazione o al ciclo di vita tramite lo strumento di delega openclaw; OpenClaw le converte in operazioni tipizzate e richiede l'approvazione umana prima di applicarle. Vedere Agente di configurazione di OpenClaw.

Per qualsiasi agente/superficie che gestisca contenuti non attendibili, negare questi strumenti per impostazione predefinita:

json5
{  tools: {    deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],  },}

commands.restart=false disabilita /restart e le richieste di riavvio esterne SIGUSR1. Lo strumento dell'agente gateway non dispone di alcuna azione di riavvio.

Esecuzione sui Node (system.run)

Se è associato un Node macOS, il Gateway può invocare system.run su di esso: ciò costituisce l'esecuzione remota di codice su quel Mac.

  • Richiede l'associazione del Node (approvazione + token). L'associazione stabilisce l'identità/l'attendibilità del Node e l'emissione del token; non costituisce una superficie di approvazione per singolo comando.
  • Il Gateway applica una politica globale generale sui comandi dei Node tramite gateway.nodes.allowCommands / denyCommands. denyCommands verifica esclusivamente i nomi esatti dei comandi del Node (ad esempio system.run), non il testo della shell all'interno del payload di un comando: un Node che si riconnette dichiarando un elenco di comandi diverso non costituisce di per sé una vulnerabilità, se la politica globale del Gateway e le approvazioni di esecuzione proprie del Node continuano ad applicare il confine.
  • La politica system.run per singolo Node è il file delle approvazioni di esecuzione del Node (exec.approvals.node.*), controllato sul Mac tramite Settings -> Exec approvals (sicurezza + richiesta + elenco di elementi consentiti); può essere più o meno restrittiva della politica globale del Gateway sugli ID dei comandi.
  • Un Node che esegue security="full" e ask="off" segue il modello predefinito dell'operatore attendibile: è un comportamento previsto, non un bug, a meno che la distribuzione non richieda una posizione più restrittiva.
  • La modalità di approvazione vincola il contesto esatto della richiesta e, quando possibile, un singolo operando concreto relativo a uno script/file locale. Se OpenClaw non può identificare esattamente un unico file locale diretto per il comando di un interprete/runtime, l'esecuzione basata sull'approvazione viene negata anziché promettere una copertura semantica completa.
  • Per host=node, le esecuzioni basate sull'approvazione memorizzano anche un systemRunPlan preparato e canonico; i successivi inoltri approvati riutilizzano tale piano memorizzato e la convalida del Gateway rifiuta le modifiche del chiamante al contesto di comando/directory di lavoro/sessione dopo la creazione della richiesta di approvazione.
  • Per disabilitare completamente l'esecuzione remota: impostare la sicurezza su deny e rimuovere l'associazione del Node per quel Mac.

Skills dinamiche (watcher / Node remoti)

OpenClaw può aggiornare l'elenco delle Skills durante una sessione: il watcher delle Skills aggiorna lo snapshot al turno successivo dell'agente quando SKILL.md cambia, mentre la connessione di un Node macOS può rendere idonee le Skills disponibili solo su macOS (in base al rilevamento dei binari). Considerare le cartelle delle Skills come codice attendibile e limitare chi può modificarle.

Plugin

I Plugin vengono eseguiti nello stesso processo del Gateway: considerarli codice attendibile.

  • Installare solo da fonti attendibili; preferire elenchi espliciti di elementi consentiti plugins.allow; esaminare la configurazione del Plugin prima dell'abilitazione; riavviare il Gateway dopo le modifiche ai Plugin.
  • L'installazione/l'aggiornamento dei Plugin esegue codice:
    • Il percorso di installazione è la directory del singolo Plugin nella radice attiva di installazione dei Plugin.
    • I pacchetti ClawHub e il catalogo integrato/ufficiale di OpenClaw sono fonti attendibili. Una nuova fonte arbitraria npm, npm-pack:, git, percorso/archivio locale o marketplace genera un avviso prima dell'installazione; le installazioni non interattive richiedono --force dopo aver verificato e considerato attendibile tale fonte. --force conferma la provenienza e consente la sovrascrittura; non aggira security.installPolicy né i restanti controlli di sicurezza dell'installazione. Gli aggiornamenti riutilizzano la fonte già selezionata.
    • OpenClaw non esegue un blocco locale integrato del codice pericoloso durante l'installazione/l'aggiornamento. Utilizzare security.installPolicy per le decisioni locali dell'operatore relative a elementi consentiti/bloccati e openclaw security audit --deep per la scansione diagnostica.
    • Le installazioni di Plugin tramite npm e git eseguono la convergenza delle dipendenze del gestore dei pacchetti solo durante il flusso esplicito di installazione/aggiornamento. I percorsi e gli archivi locali vengono trattati come pacchetti autonomi; OpenClaw li copia o vi fa riferimento senza eseguire npm install.
    • Preferire versioni esatte bloccate (@scope/pkg@1.2.3) ed esaminare il codice estratto prima dell'abilitazione.
    • --dangerously-force-unsafe-install è deprecato e non modifica più il comportamento di installazione/aggiornamento.
    • security.installPolicy consente agli operatori di eseguire un comando locale attendibile per prendere decisioni di autorizzazione/blocco specifiche dell'host per le installazioni di Skills e Plugin. Viene eseguito dopo la preparazione del materiale sorgente ma prima che l'installazione prosegua, si applica anche alle Skills di ClawHub e non viene aggirato dai flag non sicuri deprecati.

Dettagli: Plugin

Sandboxing

Documentazione dedicata: Sandboxing

Due approcci complementari:

  • Gateway completo in Docker (confine del container): Docker
  • Sandbox degli strumenti (agents.defaults.sandbox; Gateway sull'host + strumenti isolati nella sandbox; Docker è il backend predefinito): Sandboxing

Accesso allo spazio di lavoro dell'agente all'interno della sandbox (agents.defaults.sandbox.workspaceAccess):

  • "none" (impostazione predefinita): gli strumenti vedono uno spazio di lavoro della sandbox in ~/.openclaw/sandboxes; lo spazio di lavoro dell'agente non è accessibile.
  • "ro": monta lo spazio di lavoro dell'agente in sola lettura in /agent (disabilita write/edit/apply_patch).
  • "rw": monta lo spazio di lavoro dell'agente in lettura/scrittura in /workspace.

Gli elementi sandbox.docker.binds aggiuntivi vengono convalidati rispetto a percorsi di origine normalizzati e canonici. Un elenco di percorsi bloccati copre /etc, /private/etc, /proc, /sys, /dev, /root, /boot e le directory che comunemente contengono il socket Docker o ne costituiscono un alias (/run, /var/run e docker.sock al loro interno), oltre ai sottopercorsi delle credenziali nella directory HOME (.aws, .cargo, .config, .docker, .gnupg, .netrc, .npm, .ssh). I tentativi basati su collegamenti simbolici delle directory padre e gli alias canonici della directory home vengono risolti attraverso gli antenati esistenti e verificati nuovamente, quindi continuano a essere bloccati in modo sicuro se si risolvono in una radice vietata.

Protezione per la delega ai sottoagenti

Se si consentono gli strumenti di sessione, trattare le esecuzioni delegate ai sottoagenti come un'ulteriore decisione relativa ai confini:

  • Negare sessions_spawn a meno che l'agente non necessiti realmente della delega.
  • Mantenere agents.defaults.subagents.allowAgents e qualsiasi sostituzione agents.list[].subagents.allowAgents per singolo agente limitati agli agenti di destinazione noti come sicuri.
  • Per i flussi di lavoro che devono rimanere nella sandbox, chiamare sessions_spawn con sandbox: "require" (l'impostazione predefinita è "inherit"); "require" genera immediatamente un errore quando il runtime secondario di destinazione non è nella sandbox.

Modalità di sola lettura

Creare un profilo di sola lettura combinando agents.defaults.sandbox.workspaceAccess: "ro" (o "none" per impedire qualsiasi accesso allo spazio di lavoro) con elenchi di strumenti consentiti/negati che blocchino write, edit, apply_patch, exec, process e così via.

  • tools.exec.applyPatch.workspaceOnly: true (impostazione predefinita): impedisce a apply_patch di scrivere/eliminare elementi all'esterno della directory dello spazio di lavoro anche quando il sandboxing è disattivato. Impostare false solo se si desidera intenzionalmente consentire a apply_patch di accedere ai file esterni allo spazio di lavoro.
  • tools.fs.workspaceOnly: true (facoltativo): limita i percorsi di read/write/edit/apply_patch e i percorsi di caricamento automatico delle immagini nei prompt nativi alla directory dello spazio di lavoro.
  • Mantenere ristrette le radici del file system: evitare radici ampie, come la propria directory home, per gli spazi di lavoro dell'agente/della sandbox, poiché possono esporre agli strumenti del file system file locali sensibili (ad esempio stato/configurazione in ~/.openclaw).

Profili di accesso per singolo agente (multi-agente)

Ogni agente può avere una propria sandbox e una propria policy degli strumenti: accesso completo, sola lettura o nessun accesso. Consultare Sandbox e strumenti multi-agente per le regole di precedenza.

Modelli comuni: agente personale (accesso completo, nessuna sandbox), agente familiare/lavorativo (in sandbox + strumenti di sola lettura), agente pubblico (in sandbox + nessuno strumento per filesystem/shell).

Accesso completo (nessuna sandbox)

json5
{  agents: {    list: [      { id: "personal", workspace: "~/.openclaw/workspace-personal", sandbox: { mode: "off" } },    ],  },}

Strumenti di sola lettura + area di lavoro di sola lettura

json5
{  agents: {    list: [      {        id: "family",        workspace: "~/.openclaw/workspace-family",        sandbox: { mode: "all", scope: "agent", workspaceAccess: "ro" },        tools: {          allow: ["read"],          deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],        },      },    ],  },}

Nessun accesso al filesystem/alla shell (messaggistica del provider consentita)

json5
{  agents: {    list: [      {        id: "public",        workspace: "~/.openclaw/workspace-public",        sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" },        tools: {          // Gli strumenti di sessione possono rivelare dati della trascrizione. L'ambito predefinito è la sessione corrente +          // le sessioni dei sottoagenti avviati; limitarlo ulteriormente con tools.sessions.visibility se necessario.          sessions: { visibility: "tree" }, // self | tree | agent | all          allow: [            "sessions_list",            "sessions_history",            "sessions_send",            "sessions_spawn",            "session_status",            "discord",            "slack",            "telegram",            "whatsapp",          ],          deny: [            "apply_patch",            "browser",            "canvas",            "cron",            "edit",            "exec",            "gateway",            "image",            "nodes",            "process",            "read",            "write",          ],        },      },    ],  },}

Rischi del controllo del browser

L'abilitazione del controllo del browser fornisce al modello un browser reale. Se quel profilo contiene già sessioni con autenticazione effettuata, il modello può accedere a tali account e dati: trattare i profili del browser come stato sensibile.

  • Preferire un profilo dedicato per l'agente (il profilo predefinito openclaw); evitare il profilo personale usato quotidianamente.
  • Mantenere disabilitato il controllo del browser host per gli agenti in sandbox, a meno che non siano considerati attendibili.
  • L'API autonoma di controllo del browser su loopback rispetta solo l'autenticazione tramite segreto condiviso (autenticazione bearer con token del Gateway o password del Gateway): non utilizza le intestazioni d'identità di un proxy attendibile o di Tailscale Serve.
  • Trattare i download del browser come input non attendibile; preferire una directory dei download isolata.
  • Se possibile, disabilitare la sincronizzazione del browser e i gestori di password nel profilo dell'agente.
  • Per i Gateway remoti, il «controllo del browser» equivale all'«accesso dell'operatore» a tutto ciò che il profilo può raggiungere.
  • Mantenere gli host del Gateway e dei Node accessibili solo dalla tailnet; evitare di esporre le porte di controllo del browser alla LAN o a Internet pubblico.
  • Disabilitare l'instradamento tramite proxy del browser quando non è necessario (gateway.nodes.browser.mode="off").
  • La modalità di sessione esistente di Chrome MCP non è «più sicura»: può agire per conto dell'utente su tutto ciò che il profilo Chrome dell'host può raggiungere.
  • Eseguire un host Node sulla macchina del browser e consentire al Gateway di inoltrare tramite proxy le azioni del browser quando il Gateway è remoto rispetto al browser (consultare Strumento browser); trattare l'associazione del Node come accesso amministrativo, mantenere il Gateway e l'host Node sulla stessa tailnet ed evitare di esporre le porte di inoltro/controllo tramite LAN, Internet pubblico o Tailscale Funnel.

Policy SSRF del browser (rigorosa per impostazione predefinita)

Le destinazioni private/interne rimangono bloccate a meno che non vengano abilitate esplicitamente.

  • Impostazione predefinita: browser.ssrfPolicy.dangerouslyAllowPrivateNetwork non impostato, quindi le destinazioni private/interne/per usi speciali rimangono bloccate. L'alias legacy allowPrivateNetwork è ancora accettato.
  • Abilitazione esplicita: impostare dangerouslyAllowPrivateNetwork: true per consentire tali destinazioni.
  • In modalità rigorosa, usare hostnameAllowlist (modelli come *.example.com) e allowedHostnames (eccezioni esatte per gli host, inclusi nomi altrimenti bloccati come localhost) per definire eccezioni esplicite.
  • Le richieste di navigazione diretta vengono sottoposte a un controllo preliminare. Durante l'azione e il periodo di tolleranza limitato successivo all'azione, le interazioni Playwright protette (clic, clic su coordinate, passaggio del puntatore, trascinamento, scorrimento, selezione, pressione, digitazione, compilazione di moduli e valutazione) intercettano i caricamenti di documenti di primo livello e nei sottoframe negati dalla policy prima dell'invio dei byte della richiesta HTTP, quindi ricontrollano per quanto possibile l'URL http(s) finale.
  • Prima di ogni nuovo avvio gestito di Chrome, OpenClaw disabilita per quanto possibile la previsione di rete, sopprimendo la preconnessione speculativa osservata di Chromium per tali caricamenti negati. Si tratta di una difesa in profondità, non di un confine della policy: un browser riutilizzato dopo il riavvio di un servizio di controllo e altri backend del browser potrebbero non condividere questa protezione. L'instradamento delle pagine rimane un'intercettazione a livello di richiesta, non un firewall di rete: i passaggi di reindirizzamento, la prima richiesta di un popup, il traffico dei Service Worker, il codice della pagina eseguito dopo la finestra di protezione limitata e alcuni percorsi in background/di risorse secondarie possono aggirarlo. I controlli dell'URL finale rimangono una difesa di rilevamento/quarantena; la prevenzione completa richiede l'isolamento dell'uscita da parte del proprietario o un proxy che applichi la policy.
json5
{  browser: {    ssrfPolicy: {      dangerouslyAllowPrivateNetwork: false,      hostnameAllowlist: ["*.example.com", "example.com"],      allowedHostnames: ["localhost"],    },  },}

Esposizione di rete

Binding, porta, firewall

Il Gateway esegue il multiplexing di WebSocket + HTTP su una sola porta (predefinita 18789; configurazione/flag/variabile d'ambiente: gateway.port, --port, OPENCLAW_GATEWAY_PORT). Tale superficie HTTP include l'interfaccia di controllo (asset SPA, percorso di base predefinito /) e l'host canvas (/__openclaw__/canvas e /__openclaw__/a2ui — HTML/JS arbitrario; trattarlo come contenuto non attendibile quando viene caricato in un browser normale; non esporlo a reti/utenti non attendibili né condividere un'origine con superfici web privilegiate).

gateway.bind controlla dove il Gateway resta in ascolto:

  • "loopback" (impostazione predefinita): possono connettersi solo i client locali.
  • "lan", "tailnet", "custom": ampliano la superficie di attacco. Utilizzarli solo con l'autenticazione del Gateway (token/password condivisi o un proxy attendibile configurato correttamente) e un vero firewall.

Regole pratiche: preferire Tailscale Serve ai binding LAN (Serve mantiene il Gateway sul loopback e Tailscale gestisce l'accesso); se è necessario eseguire il binding alla LAN, limitare tramite firewall la porta a una rigorosa lista di indirizzi IP di origine consentiti, anziché eseguire un port forwarding esteso; non esporre mai il Gateway senza autenticazione su 0.0.0.0.

Pubblicazione delle porte Docker con UFW

Le porte dei container pubblicate (-p HOST:CONTAINER o ports: di Compose) vengono instradate attraverso le catene di inoltro di Docker, non solo attraverso le regole INPUT dell'host. Applicare le regole in DOCKER-USER (valutate prima delle regole di accettazione di Docker); la maggior parte delle distribuzioni moderne usa il frontend iptables-nft, che applica comunque queste regole al backend nftables.

bash
# /etc/ufw/after.rules (aggiungere come sezione *filter autonoma)*filter:DOCKER-USER - [0:0]-A DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN-A DOCKER-USER -s 127.0.0.0/8 -j RETURN-A DOCKER-USER -s 10.0.0.0/8 -j RETURN-A DOCKER-USER -s 172.16.0.0/12 -j RETURN-A DOCKER-USER -s 192.168.0.0/16 -j RETURN-A DOCKER-USER -s 100.64.0.0/10 -j RETURN-A DOCKER-USER -p tcp --dport 80 -j RETURN-A DOCKER-USER -p tcp --dport 443 -j RETURN-A DOCKER-USER -m conntrack --ctstate NEW -j DROP-A DOCKER-USER -j RETURNCOMMIT

IPv6 dispone di tabelle separate: aggiungere una policy corrispondente in /etc/ufw/after6.rules se IPv6 di Docker è abilitato. Evitare di codificare direttamente i nomi delle interfacce (eth0), poiché variano tra le immagini VPS (ens3, enp*, ecc.) e una mancata corrispondenza può ignorare silenziosamente la regola di negazione.

bash
ufw reloadiptables -S DOCKER-USERip6tables -S DOCKER-USERnmap -sT -p 1-65535 <public-ip> --open

Le porte esterne previste devono essere solo quelle esposte intenzionalmente (per la maggior parte delle configurazioni: SSH + porte del proxy inverso).

Rilevamento mDNS/Bonjour

Quando il plugin bonjour incluso è abilitato, il Gateway trasmette la propria presenza tramite mDNS (_openclaw-gw._tcp, porta 5353) per il rilevamento dei dispositivi locali. La modalità completa include record TXT che espongono dettagli operativi: cliPath (percorso del filesystem che rivela il nome utente e la posizione dell'installazione), sshPort (pubblicizza la disponibilità di SSH), displayName/lanHost (informazioni sul nome host). La trasmissione dei dettagli dell'infrastruttura facilita la ricognizione della LAN.

  • Mantenere Bonjour disabilitato, a meno che non sia necessario il rilevamento LAN: si avvia automaticamente sugli host macOS ed è opzionale altrove; URL diretti del Gateway, Tailnet, SSH o DNS-SD geografico evitano il multicast locale.

  • La modalità minima (predefinita quando Bonjour è abilitato, consigliata per i Gateway esposti) omette i campi sensibili:

    json5
    { discovery: { mdns: { mode: "minimal" } } }
  • La modalità disattivata impedisce il rilevamento locale mantenendo abilitato il plugin:

    json5
    { discovery: { mdns: { mode: "off" } } }
  • La modalità completa (abilitazione esplicita) include cliPath + sshPort:

    json5
    { discovery: { mdns: { mode: "full" } } }
  • In alternativa, impostare OPENCLAW_DISABLE_BONJOUR=1 per disabilitare mDNS senza modificare la configurazione.

In modalità minima, il Gateway trasmette role, gatewayPort, transport, ma omette cliPath/sshPort; le applicazioni che necessitano del percorso della CLI possono invece recuperarlo tramite la connessione WebSocket autenticata.

Autenticazione WebSocket del Gateway

L'autenticazione del Gateway è obbligatoria per impostazione predefinita: se non è configurato alcun percorso di autenticazione valido, il Gateway rifiuta le connessioni WebSocket (chiusura in caso di errore). L'onboarding genera un token per impostazione predefinita (anche per il loopback), pertanto i client locali devono autenticarsi.

json5
{ gateway: { auth: { mode: "token", token: "your-token" } } }

openclaw doctor --generate-gateway-token può generarne uno.

Bloccare TLS remoto con gateway.remote.tlsFingerprint quando si usa wss://. ws:// in testo normale è accettato per loopback, valori letterali di IP privati, .local e URL del Gateway *.ts.net della Tailnet; per altri nomi DNS privati attendibili, impostare OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 nel processo client come misura di emergenza (solo nell'ambiente del processo, non come chiave openclaw.json). L'associazione mobile e i percorsi del Gateway manuali/scansionati di Android sono più rigorosi: testo non cifrato solo per loopback, mentre LAN privata, link-local, .local e nomi host senza punti devono usare TLS, a meno che non venga abilitato esplicitamente il percorso attendibile in testo non cifrato della rete privata.

L'associazione dei dispositivi viene approvata automaticamente per le connessioni dirette al loopback locale (oltre a uno specifico percorso ristretto di autoconnesione locale del backend/container per flussi helper attendibili con segreto condiviso); le connessioni Tailnet e LAN, incluse quelle dallo stesso host a un indirizzo della tailnet, sono considerate remote e richiedono comunque l'approvazione. Un indirizzo tailnet risolto o un indirizzo custom diverso da 127.0.0.1 o 0.0.0.0 aggiunge un listener 127.0.0.1 separato; solo le connessioni a tale listener locale ricevono la semantica loopback. La presenza di intestazioni inoltrate in una richiesta loopback esclude la località loopback; l'approvazione automatica degli aggiornamenti dei metadati ha un ambito ristretto. Consultare Associazione del Gateway.

Modalità di autenticazione:

  • "token": token bearer condiviso (consigliato per la maggior parte delle configurazioni).
  • "password": è preferibile impostarlo tramite OPENCLAW_GATEWAY_PASSWORD.
  • "trusted-proxy": considera attendibile un reverse proxy consapevole dell'identità per autenticare gli utenti e trasmettere l'identità tramite intestazioni. Consultare Autenticazione tramite proxy attendibile.

Lista di controllo per la rotazione (token/password): generare/impostare un nuovo segreto (gateway.auth.token o OPENCLAW_GATEWAY_PASSWORD); riavviare il Gateway (o l'app macOS, se supervisiona il Gateway); aggiornare i client remoti (gateway.remote.token/.password); verificare che le vecchie credenziali non funzionino più.

Intestazioni di identità di Tailscale Serve

Quando gateway.auth.allowTailscale è true (impostazione predefinita per Serve), OpenClaw accetta l'intestazione di identità di Tailscale Serve tailscale-user-login per l'autenticazione della Control UI/WebSocket. Verifica l'identità risolvendo l'indirizzo x-forwarded-for tramite il daemon Tailscale locale (tailscale whois) e confrontandolo con l'intestazione; questa procedura si attiva solo per le richieste di loopback che contengono x-forwarded-for, x-forwarded-proto e x-forwarded-host inseriti da Tailscale. Per questo controllo asincrono, i tentativi non riusciti per lo stesso {scope, ip} vengono serializzati prima che il limitatore registri l'errore, pertanto i nuovi tentativi simultanei non validi provenienti da un singolo client Serve possono bloccare immediatamente il secondo tentativo.

Gli endpoint dell'API HTTP (/v1/*, /tools/invoke, /api/channels/*) non utilizzano l'autenticazione tramite intestazione di identità Tailscale, ma seguono la modalità di autenticazione HTTP configurata per il gateway.

L'autenticazione bearer HTTP del Gateway equivale di fatto a un accesso operatore tutto o niente. Le credenziali che possono chiamare /v1/chat/completions, /v1/responses, route di Plugin come /api/v1/admin/rpc o /api/channels/* sono segreti operatore con accesso completo per quel gateway: l'autenticazione bearer con segreto condiviso ripristina tutti gli ambiti operatore predefiniti (operator.admin, operator.approvals, operator.pairing, operator.read, operator.talk.secrets, operator.write) e la semantica del proprietario per i turni dell'agente, mentre valori x-openclaw-scopes più restrittivi non limitano tale percorso con segreto condiviso. La semantica degli ambiti per richiesta si applica solo quando la richiesta proviene da una modalità che trasmette l'identità (autenticazione tramite proxy attendibile) o da un ingresso privato esplicitamente privo di autenticazione; in tali modalità, l'omissione di x-openclaw-scopes comporta il ripiego sul normale insieme di ambiti operatore predefiniti, mentre le intestazioni a livello di proprietario come x-openclaw-model richiedono operator.admin quando gli ambiti sono limitati. /tools/invoke e gli endpoint HTTP della cronologia delle sessioni seguono la stessa regola del segreto condiviso. Non condividere queste credenziali con chiamanti non attendibili; è preferibile utilizzare gateway separati per ciascun confine di attendibilità.

L'autenticazione Serve senza token presuppone che l'host del gateway sia attendibile: non protegge da processi ostili sullo stesso host. Se sull'host del gateway può essere eseguito codice locale non attendibile, disabilitare allowTailscale e richiedere l'autenticazione esplicita con segreto condiviso (token o password).

Non inoltrare queste intestazioni dal proprio reverse proxy. Se TLS viene terminato o il traffico viene inoltrato tramite proxy davanti al gateway, disabilitare allowTailscale e utilizzare invece l'autenticazione con segreto condiviso o l'Autenticazione tramite proxy attendibile.

Consultare Tailscale e Panoramica del Web.

Configurazione del reverse proxy

Impostare gateway.trustedProxies per gestire correttamente gli IP dei client inoltrati dietro nginx/Caddy/Traefik/ecc. Quando il Gateway rileva intestazioni proxy provenienti da un indirizzo non incluso in trustedProxies, non considera locale la connessione; se l'autenticazione del gateway è disabilitata, la connessione viene rifiutata. Ciò impedisce alle connessioni inoltrate tramite proxy di apparire come provenienti da localhost e di ottenere attendibilità automatica.

trustedProxies alimenta anche gateway.auth.mode: "trusted-proxy", che è più restrittivo: per impostazione predefinita, rifiuta le richieste provenienti da proxy con origine loopback. I reverse proxy di loopback sullo stesso host possono utilizzare trustedProxies per il rilevamento dei client locali e la gestione degli IP inoltrati, ma possono soddisfare la modalità di autenticazione trusted-proxy solo quando gateway.auth.trustedProxy.allowLoopback = true; in caso contrario, utilizzare l'autenticazione tramite token/password.

yaml
gateway:  trustedProxies:    - "10.0.0.1" # IP del reverse proxy  allowRealIpFallback: false # valore predefinito false; abilitarlo solo se il proxy non può fornire X-Forwarded-For  auth:    mode: password    password: ${OPENCLAW_GATEWAY_PASSWORD}

Quando trustedProxies è impostato, il Gateway utilizza X-Forwarded-For per determinare l'IP del client; X-Real-IP viene ignorato, salvo quando gateway.allowRealIpFallback: true è impostato esplicitamente. Assicurarsi che il proxy sovrascriva X-Forwarded-For/X-Real-IP anziché aggiungere valori:

nginx
# correttoproxy_set_header X-Forwarded-For $remote_addr;proxy_set_header X-Real-IP $remote_addr; # errato: conserva/aggiunge valori non attendibili forniti dal clientproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Le intestazioni dei proxy attendibili non rendono automaticamente attendibile l'associazione dei dispositivi Node: gateway.nodes.pairing.autoApproveCidrs è una policy operatore separata, disabilitata per impostazione predefinita, e i percorsi delle intestazioni di proxy attendibili con origine loopback restano esclusi dall'approvazione automatica dei Node anche quando è abilitata l'autenticazione tramite proxy attendibile su loopback (perché i chiamanti locali possono falsificare tali intestazioni).

Note su HSTS e origine

  • Il gateway di OpenClaw è progettato principalmente per l'uso locale/loopback. Se TLS viene terminato presso un reverse proxy, impostare HSTS in tale sede.
  • Se è il gateway stesso a terminare HTTPS, gateway.http.securityHeaders.strictTransportSecurity emette l'intestazione HSTS nelle risposte di OpenClaw.
  • Per impostazione predefinita, le distribuzioni della Control UI non in loopback richiedono gateway.controlUi.allowedOrigins; allowedOrigins: ["*"] è una policy esplicita che consente tutto, non un'impostazione predefinita con protezione avanzata: evitarla al di fuori di test locali strettamente controllati.
  • Gli errori di autenticazione dell'origine del browser su loopback restano soggetti a limitazione della frequenza anche quando è abilitata l'esenzione generale per il loopback, ma la chiave di blocco è definita separatamente per ciascun valore normalizzato di Origin, anziché utilizzare un unico bucket localhost condiviso.
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true abilita la modalità di ripiego dell'origine basata sull'intestazione Host; considerarla una policy pericolosa selezionata dall'operatore.
  • Considerare il DNS rebinding e il comportamento dell'intestazione host del proxy come aspetti di protezione avanzata della distribuzione; mantenere trustedProxies restrittivo ed evitare di esporre direttamente il gateway alla rete Internet pubblica.
  • Indicazioni dettagliate per la distribuzione: Autenticazione tramite proxy attendibile.

Control UI tramite HTTP

La Control UI richiede un contesto sicuro (HTTPS o localhost) per generare l'identità del dispositivo.

  • gateway.controlUi.allowInsecureAuth: opzione di compatibilità locale. Su localhost, consente l'autenticazione della Control UI senza identità del dispositivo quando la pagina viene caricata tramite HTTP non sicuro. Non ignora i controlli di associazione e non riduce i requisiti di identità del dispositivo remoto (non localhost). È preferibile utilizzare HTTPS (Tailscale Serve) oppure aprire l'interfaccia utente su 127.0.0.1.
  • gateway.controlUi.dangerouslyDisableDeviceAuth: solo per emergenze; disabilita completamente i controlli dell'identità del dispositivo. Grave riduzione della sicurezza; mantenerlo disattivato, salvo durante il debug attivo e quando sia possibile annullare rapidamente la modifica.
  • Indipendentemente da tali flag, un gateway.auth.mode: "trusted-proxy" riuscito può ammettere sessioni operatore della Control UI senza identità del dispositivo: si tratta di un comportamento intenzionale della modalità di autenticazione, non di una scorciatoia allowInsecureAuth, e non si estende alle sessioni della Control UI con ruolo Node.

openclaw security audit avvisa quando allowInsecureAuth è abilitato.

Flag non sicuri/pericolosi

openclaw security audit genera config.insecure_or_dangerous_flags per ogni opzione di debug nota non sicura/pericolosa abilitata (un risultato per flag). Mantenerle non impostate in produzione. Se sono configurate soppressioni dell'audit, security.audit.suppressions.active rimane nell'output attivo anche quando i risultati corrispondenti vengono spostati in suppressedFindings.

Flag attualmente monitorati dall'audit
  • gateway.controlUi.allowInsecureAuth=true
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true
  • gateway.controlUi.dangerouslyDisableDeviceAuth=true
  • security.audit.suppressions configured (<count>)
  • hooks.gmail.allowUnsafeExternalContent=true
  • hooks.mappings[<index>].allowUnsafeExternalContent=true
  • tools.exec.applyPatch.workspaceOnly=false
  • plugins.entries.acpx.config.permissionMode=approve-all
Tutte le chiavi dangerous*/dangerously* nello schema di configurazione

Control UI e browser:

  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback
  • gateway.controlUi.dangerouslyDisableDeviceAuth
  • browser.ssrfPolicy.dangerouslyAllowPrivateNetwork

Corrispondenza dei nomi dei canali (canali integrati e dei Plugin; anche per accounts.<accountId> ove applicabile):

  • channels.discord.dangerouslyAllowNameMatching
  • channels.googlechat.dangerouslyAllowNameMatching
  • channels.msteams.dangerouslyAllowNameMatching
  • channels.slack.dangerouslyAllowNameMatching
  • channels.irc.dangerouslyAllowNameMatching (canale del Plugin)
  • channels.mattermost.dangerouslyAllowNameMatching (canale del Plugin)
  • channels.synology-chat.dangerouslyAllowNameMatching (canale del Plugin)
  • channels.synology-chat.dangerouslyAllowInheritedWebhookPath (canale del Plugin)
  • channels.zalouser.dangerouslyAllowNameMatching (canale del Plugin)

Esposizione della rete:

  • channels.telegram.network.dangerouslyAllowPrivateNetwork (anche per account)

Docker della sandbox (valori predefiniti + per agente):

  • agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets
  • agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources
  • agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin

Attendibilità della distribuzione e dell'host

  • Crittografia completa del disco sull'host del gateway; se l'host è condiviso, è preferibile utilizzare un account utente del sistema operativo dedicato per il Gateway.
  • Blocco delle dipendenze del pacchetto pubblicato: i checkout del sorgente utilizzano pnpm-lock.yaml; il pacchetto npm openclaw pubblicato e i pacchetti npm dei Plugin di proprietà di OpenClaw includono npm-shrinkwrap.json, affinché le installazioni utilizzino il grafo delle dipendenze transitive esaminato della release anziché risolvere un nuovo grafo al momento dell'installazione. Si tratta di un confine per il rafforzamento della sicurezza della catena di fornitura e la riproducibilità delle release, non di una sandbox; consultare shrinkwrap npm.
  • Operazioni sicure sui file: OpenClaw utilizza @openclaw/fs-safe per l'accesso ai file vincolato alla radice, le scritture atomiche, l'estrazione degli archivi, gli spazi di lavoro temporanei e gli helper per i file contenenti segreti. L'helper Python POSIX facoltativo è disattivato per impostazione predefinita; impostare OPENCLAW_FS_SAFE_PYTHON_MODE=auto o require solo quando si desidera il rafforzamento aggiuntivo delle mutazioni relative ai descrittori di file e si può supportare un runtime Python. Dettagli: Operazioni sicure sui file.
  • Rischio di uno spazio di lavoro Slack condiviso: se chiunque in Slack può inviare messaggi al bot, il rischio principale è l'autorità delegata sugli strumenti: qualsiasi mittente autorizzato può indurre chiamate agli strumenti (exec, browser, strumenti di rete/file) entro i limiti della policy dell'agente, l'iniezione di prompt/contenuti da parte di un mittente può influire su stato/dispositivi/output condivisi e, se l'agente condiviso dispone di credenziali/file sensibili, qualsiasi mittente autorizzato può potenzialmente provocarne l'esfiltrazione tramite l'utilizzo degli strumenti. Per i flussi di lavoro del team, utilizzare agenti/gateway separati con strumenti minimi; mantenere privati gli agenti che gestiscono dati personali.
  • Agente condiviso in azienda (modello accettabile): è appropriato quando tutti gli utenti dell'agente appartengono allo stesso confine di attendibilità (ad esempio, un unico team aziendale) e l'ambito dell'agente è strettamente professionale. Eseguirlo su una macchina/VM/un container dedicato, utilizzare un utente del sistema operativo dedicato e browser/profilo/account dedicati e non accedere in tale runtime con account Apple/Google personali o con profili personali del gestore di password/browser. La combinazione di identità personali e aziendali nello stesso runtime annulla la separazione e aumenta il rischio di esposizione dei dati personali.

Segreti su disco

Presupporre che qualsiasi elemento in ~/.openclaw/ (o $OPENCLAW_STATE_DIR/) possa contenere segreti o dati privati:

Percorso Contenuti
openclaw.json La configurazione può includere token (Gateway, Gateway remoto), impostazioni dei provider ed elenchi di elementi consentiti.
credentials/** Credenziali dei canali (ad esempio, credenziali di WhatsApp), elenchi di elementi consentiti per l'associazione, importazioni OAuth legacy.
agents/<agentId>/agent/auth-profiles.json Chiavi API, profili di token, token OAuth, keyRef/tokenRef facoltativi.
agents/<agentId>/agent/codex-home/** Account, configurazione, Skills, Plugin, stato nativo dei thread e diagnostica del server applicativo Codex per agente (impostazione predefinita).
$CODEX_HOME/** o ~/.codex/** Stato del runtime nativo Codex. L'harness ordinario vi accede solo con plugins.entries.codex.config.appServer.homeScope: "user" esplicito. La connessione di supervisione separata vi accede quando il relativo ambito home risolto è "user", che costituisce l'impostazione predefinita per stdio o Unix quando non è specificato. Contiene l'account Codex nativo, la configurazione, i Plugin e l'archivio dei thread. La supervisione elenca i metadati di origine e mantiene il ramo nativo canonico di una Chat proseguita e i turni successivi su tale connessione; la creazione di un ramo copia una porzione limitata della cronologia persistente dell'utente e dell'assistente in una Chat OpenClaw autenticata e vincolata al modello. Abilitare solo per un Gateway controllato dal proprietario. Consultare harness Codex e supervisione Codex.
secrets.json (facoltativo) Payload segreto basato su file utilizzato dai provider SecretRef file (secrets.providers).
agents/<agentId>/agent/auth.json File di compatibilità legacy; le voci statiche api_key vengono rimosse quando rilevate.
agents/<agentId>/agent/openclaw-agent.sqlite Stato del runtime per agente, incluse righe di sessione e trascrizioni che possono contenere messaggi privati e output degli strumenti.
agents/<agentId>/sessions/** Origini e archivi della migrazione delle sessioni legacy che possono contenere messaggi privati e output degli strumenti.
pacchetti dei Plugin inclusi Plugin installati (insieme ai relativi node_modules/).
sandboxes/** Spazi di lavoro della sandbox degli strumenti; possono accumulare copie dei file letti o scritti all'interno della sandbox.

Mappa di archiviazione delle credenziali

Utile anche per le decisioni relative al backup:

  • WhatsApp: ~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • Token del bot Telegram: configurazione/ambiente o channels.telegram.tokenFile (solo file normale; i collegamenti simbolici vengono rifiutati)
  • Token del bot Discord: configurazione/ambiente o SecretRef (provider di ambiente/file/esecuzione)
  • Token Slack: configurazione/ambiente (channels.slack.*)
  • Elenchi di elementi consentiti per l'associazione: ~/.openclaw/credentials/<channel>-allowFrom.json (account predefinito) / <channel>-<accountId>-allowFrom.json (account non predefiniti)
  • Profili di autenticazione del modello: ~/.openclaw/agents/<agentId>/agent/auth-profiles.json
  • Importazione OAuth legacy: ~/.openclaw/credentials/oauth.json

Rafforzamento della sicurezza: mantenere restrittive le autorizzazioni (700 per le directory, 600 per i file); utilizzare la crittografia completa del disco sull'host del Gateway; preferire un account utente del sistema operativo dedicato se l'host è condiviso.

Autorizzazioni dei file

  • ~/.openclaw/openclaw.json: 600 (solo lettura/scrittura da parte dell'utente)
  • ~/.openclaw: 700 (solo utente)

openclaw doctor può generare un avviso e proporre di rendere queste autorizzazioni più restrittive.

File .env dello spazio di lavoro

OpenClaw carica i file .env locali dello spazio di lavoro per gli agenti e gli strumenti, ma non consente mai che sostituiscano implicitamente i controlli del runtime del Gateway:

  • Le variabili di ambiente delle credenziali dei provider vengono bloccate nei file .env delle aree di lavoro non attendibili, ad esempio GEMINI_API_KEY, GOOGLE_API_KEY, XAI_API_KEY, MISTRAL_API_KEY, GROQ_API_KEY, DEEPSEEK_API_KEY, PERPLEXITY_API_KEY, BRAVE_API_KEY, TAVILY_API_KEY, EXA_API_KEY, FIRECRAWL_API_KEY e le chiavi di autenticazione dei provider dichiarate dai plugin attendibili installati. Inserire invece le credenziali dei provider nell'ambiente del processo Gateway, in ~/.openclaw/.env ($OPENCLAW_STATE_DIR/.env), nel blocco di configurazione env o in un'importazione facoltativa della shell di login.
  • Qualsiasi chiave che inizia con OPENCLAW_ viene bloccata nei file .env delle aree di lavoro non attendibili, riservando l'intero spazio dei nomi di runtime affinché un futuro controllo OPENCLAW_* sia chiuso per impostazione predefinita in caso di errore, anziché essere ereditato silenziosamente da contenuti .env sottoposti a controllo di versione o forniti da un autore di attacchi.
  • Anche le impostazioni di instradamento degli endpoint di canali e provider vengono bloccate nelle sostituzioni .env dell'area di lavoro (ad esempio MATRIX_HOMESERVER, MATTERMOST_URL, IRC_HOST, SYNOLOGY_CHAT_INCOMING_URL, AZURE_SPEECH_ENDPOINT e altre chiavi che terminano con _ENDPOINT), così un'area di lavoro clonata non può reindirizzare il traffico dei connettori inclusi tramite la configurazione locale degli endpoint. Queste impostazioni devono provenire dall'ambiente del processo Gateway, dal dotenv globale del runtime, dalla configurazione esplicita o da env.shellEnv.
  • Le variabili di ambiente attendibili del processo/sistema operativo, il dotenv globale del runtime, la configurazione env e l'importazione abilitata della shell di login continuano ad applicarsi: questa limitazione riguarda esclusivamente il caricamento dei file .env dell'area di lavoro.

I file .env dell'area di lavoro si trovano spesso accanto al codice dell'agente, vengono accidentalmente sottoposti a commit o scritti dagli strumenti; il blocco delle credenziali dei provider impedisce a un'area di lavoro clonata di sostituire gli account dei provider con account controllati da un autore di attacchi.

Log e trascrizioni

OpenClaw archivia su disco le trascrizioni delle sessioni in ~/.openclaw/agents/<agentId>/sessions/*.jsonl per garantire la continuità delle sessioni e l'indicizzazione facoltativa della memoria: qualsiasi processo o utente con accesso al file system può leggerle. Considerare l'accesso al disco come confine di attendibilità e limitare le autorizzazioni di ~/.openclaw; per un isolamento più efficace, eseguire gli agenti con utenti del sistema operativo o host separati.

I log del Gateway possono includere riepiloghi degli strumenti, errori e URL; le trascrizioni delle sessioni possono includere segreti incollati, contenuti di file, output di comandi e link.

  • Mantenere attiva l'oscurazione di log e trascrizioni (logging.redactSensitive: "tools", valore predefinito).
  • Aggiungere modelli personalizzati per il proprio ambiente tramite logging.redactPatterns (token, nomi host, URL interni).
  • Quando si condividono dati diagnostici, preferire openclaw status --all (incollabile, con i segreti oscurati) ai log non elaborati.
  • Eliminare le vecchie trascrizioni delle sessioni e i file di log se non è necessaria una conservazione prolungata.

Dettagli: Registrazione

Configurazione di base sicura (copia/incolla)

json5
{  gateway: {    mode: "local",    bind: "loopback",    port: 18789,    auth: { mode: "token", token: "your-long-random-token" },  },  channels: {    whatsapp: {      dmPolicy: "pairing",      groups: { "*": { requireMention: true } },    },  },}

Mantiene privato il Gateway, richiede l'associazione per i messaggi diretti ed evita bot di gruppo sempre attivi. Per rendere più sicura anche l'esecuzione degli strumenti, aggiungere una sandbox e negare gli strumenti pericolosi a qualsiasi agente che non sia il proprietario (vedere "Profili di accesso per agente" sopra).

Numeri separati (WhatsApp, Signal, Telegram)

Per i canali basati su numeri di telefono, valutare l'esecuzione dell'assistente su un numero distinto da quello personale, affinché le conversazioni personali rimangano private e il numero del bot gestisca l'automazione entro confini propri.

Risposta agli incidenti

Contenimento

  1. Arrestare il sistema: chiudere l'app macOS (se supervisiona il Gateway) o terminare il processo openclaw gateway.
  2. Interrompere l'esposizione: impostare gateway.bind: "loopback" (o disabilitare Tailscale Funnel/Serve) finché non si comprende quanto accaduto.
  3. Bloccare l'accesso: impostare i messaggi diretti/gruppi rischiosi su dmPolicy: "disabled" / richiedere le menzioni e rimuovere tutte le voci "*" che consentono l'accesso a chiunque.

Rotazione (presumere una compromissione in caso di divulgazione dei segreti)

  1. Ruotare le credenziali di autenticazione del Gateway (gateway.auth.token / OPENCLAW_GATEWAY_PASSWORD) e riavviare.
  2. Ruotare i segreti dei client remoti (gateway.remote.token / .password) su ogni macchina in grado di chiamare il Gateway.
  3. Ruotare le credenziali dei provider/API (credenziali WhatsApp, token Slack/Discord, chiavi del modello/API in auth-profiles.json e, quando utilizzati, i valori dei payload dei segreti crittografati).

Verifica

  1. Controllare i log del Gateway: /tmp/openclaw/openclaw-YYYY-MM-DD.log (o logging.file).
  2. Esaminare le trascrizioni pertinenti: ~/.openclaw/agents/<agentId>/sessions/*.jsonl.
  3. Esaminare le modifiche recenti alla configurazione che potrebbero aver ampliato l'accesso: gateway.bind, gateway.auth, criteri per messaggi diretti/gruppi, tools.elevated, modifiche ai plugin.
  4. Eseguire nuovamente openclaw security audit --deep e confermare che i problemi critici siano stati risolti.

Raccolta dei dati per una segnalazione

  • Data e ora, sistema operativo dell'host del Gateway e versione di OpenClaw.
  • Le trascrizioni delle sessioni e una breve parte finale del log (dopo l'oscuramento).
  • Ciò che l'autore dell'attacco ha inviato e ciò che l'agente ha fatto.
  • Se il Gateway era esposto oltre l'interfaccia di loopback (LAN/Tailscale Funnel/Serve).

Scansione dei segreti

La CI esegue sull'intero repository l'hook pre-commit detect-private-key. Se non riesce, rimuovere o ruotare il materiale delle chiavi sottoposto a commit, quindi riprodurre localmente:

bash
pre-commit run --all-files detect-private-key

Segnalazione di problemi di sicurezza

È stata individuata una vulnerabilità in OpenClaw? Segnalarla responsabilmente:

  1. Email: security@openclaw.ai
  2. Non pubblicarla finché non viene risolta.
  3. Verrà attribuito il merito della segnalazione (salvo preferenza per l'anonimato).
Was this useful?
On this page

On this page