Przejdź do głównej treści

Bezpieczeństwo

Model zaufania osobistego asystenta: te wskazówki zakładają jedną granicę zaufanego operatora na Gateway (model jednoosobowy/osobistego asystenta). OpenClaw nie jest odporną na wrogie działania granicą bezpieczeństwa wielodostępną dla wielu antagonistycznych użytkowników współdzielących jednego agenta/Gateway. Jeśli potrzebujesz działania przy mieszanym zaufaniu lub z antagonistycznymi użytkownikami, rozdziel granice zaufania (osobny Gateway + poświadczenia, najlepiej także osobni użytkownicy OS/hosty).
Na tej stronie: Model zaufania | Szybki audyt | Utwardzona baza | Model dostępu DM | Utwardzanie konfiguracji | Reagowanie na incydenty

Najpierw zakres: model bezpieczeństwa osobistego asystenta

Wskazówki bezpieczeństwa OpenClaw zakładają wdrożenie typu osobisty asystent: jedną granicę zaufanego operatora, potencjalnie wielu agentów.
  • Obsługiwana postawa bezpieczeństwa: jeden użytkownik/jedna granica zaufania na Gateway (preferowany jeden użytkownik OS/host/VPS na granicę).
  • Nieobsługiwana granica bezpieczeństwa: jeden współdzielony Gateway/agent używany przez wzajemnie nieufających sobie lub antagonistycznych użytkowników.
  • Jeśli wymagana jest izolacja antagonistycznych użytkowników, rozdziel według granic zaufania (osobny Gateway + poświadczenia, a najlepiej także osobni użytkownicy OS/hosty).
  • Jeśli wielu niezaufanych użytkowników może wysyłać wiadomości do jednego agenta z włączonymi narzędziami, traktuj ich tak, jakby współdzielili ten sam delegowany zakres uprawnień narzędzi dla tego agenta.
Ta strona wyjaśnia utwardzanie w ramach tego modelu. Nie twierdzi, że zapewnia wrogą wielodostępną izolację na jednym współdzielonym Gateway.

Szybkie sprawdzenie: openclaw security audit

Zobacz też: Formalna weryfikacja (modele bezpieczeństwa) Uruchamiaj to regularnie (szczególnie po zmianie konfiguracji lub wystawieniu powierzchni sieciowych):
openclaw security audit
openclaw security audit --deep
openclaw security audit --fix
openclaw security audit --json
security audit --fix celowo ma wąski zakres: przełącza typowe otwarte zasady grup na allowlisty, przywraca logging.redactSensitive: "tools", zaostrza uprawnienia stan/config/include-file i używa resetów ACL Windows zamiast POSIX chmod podczas działania w Windows. Wskazuje typowe pułapki (ekspozycja uwierzytelniania Gateway, ekspozycja sterowania przeglądarką, podniesione allowlisty, uprawnienia systemu plików, permisywne zatwierdzanie exec oraz ekspozycja narzędzi w otwartych kanałach). OpenClaw to jednocześnie produkt i eksperyment: łączysz zachowanie modeli granicznych z prawdziwymi powierzchniami komunikacyjnymi i prawdziwymi narzędziami. Nie istnieje konfiguracja „idealnie bezpieczna”. Celem jest świadome określenie:
  • kto może rozmawiać z Twoim botem
  • gdzie bot może działać
  • czego bot może dotykać
Zacznij od najmniejszego dostępu, który nadal działa, a następnie rozszerzaj go wraz ze wzrostem pewności.

Wdrożenie i zaufanie do hosta

OpenClaw zakłada, że host i granica konfiguracji są zaufane:
  • Jeśli ktoś może modyfikować stan/konfigurację hosta Gateway (~/.openclaw, w tym openclaw.json), traktuj go jak zaufanego operatora.
  • Uruchamianie jednego Gateway dla wielu wzajemnie nieufających sobie/antagonistycznych operatorów nie jest zalecaną konfiguracją.
  • Dla zespołów o mieszanym poziomie zaufania rozdziel granice zaufania na osobne Gateway (albo co najmniej osobnych użytkowników OS/hosty).
  • Zalecane ustawienie domyślne: jeden użytkownik na maszynę/host (lub VPS), jeden gateway dla tego użytkownika i jeden lub więcej agentów w tym Gateway.
  • W ramach jednej instancji Gateway uwierzytelniony dostęp operatora jest zaufaną rolą płaszczyzny sterowania, a nie rolą dzierżawcy per użytkownik.
  • Identyfikatory sesji (sessionKey, identyfikatory sesji, etykiety) są selektorami routingu, a nie tokenami autoryzacji.
  • Jeśli kilka osób może wysyłać wiadomości do jednego agenta z włączonymi narzędziami, każda z nich może sterować tym samym zestawem uprawnień. Izolacja sesji/pamięci per użytkownik pomaga w prywatności, ale nie zamienia współdzielonego agenta w autoryzację hosta per użytkownik.

Współdzielona przestrzeń robocza Slack: realne ryzyko

Jeśli „wszyscy w Slacku mogą pisać do bota”, głównym ryzykiem jest delegowany zakres uprawnień narzędzi:
  • każdy dozwolony nadawca może wywoływać narzędzia (exec, przeglądarka, narzędzia sieciowe/plikowe) w ramach polityki agenta;
  • prompt injection / content injection od jednego nadawcy może wywołać działania wpływające na współdzielony stan, urządzenia lub wyniki;
  • jeśli jeden współdzielony agent ma wrażliwe poświadczenia/pliki, każdy dozwolony nadawca może potencjalnie wymusić eksfiltrację przez użycie narzędzi.
Do przepływów zespołowych używaj osobnych agentów/Gateway z minimalnym zestawem narzędzi; agentów z danymi osobistymi trzymaj prywatnie.

Współdzielony agent firmowy: akceptowalny wzorzec

Jest to akceptowalne, gdy wszyscy korzystający z tego agenta znajdują się w tej samej granicy zaufania (na przykład jeden zespół firmowy), a agent ma ściśle biznesowy zakres.
  • uruchamiaj go na dedykowanej maszynie/VM/kontenerze;
  • używaj dedykowanego użytkownika OS + dedykowanej przeglądarki/profilu/kont dla tego runtime;
  • nie loguj tego runtime do osobistych kont Apple/Google ani osobistych profili menedżera haseł/przeglądarki.
Jeśli mieszasz tożsamości osobiste i firmowe w tym samym runtime, niwelujesz separację i zwiększasz ryzyko ekspozycji danych osobistych.

Koncepcja zaufania do Gateway i Node

Traktuj Gateway i Node jako jedną domenę zaufania operatora, ale o różnych rolach:
  • Gateway to płaszczyzna sterowania i powierzchnia polityk (gateway.auth, polityka narzędzi, routing).
  • Node to powierzchnia zdalnego wykonywania sparowana z tym Gateway (polecenia, działania na urządzeniu, lokalne możliwości hosta).
  • Wywołujący uwierzytelniony w Gateway jest zaufany w zakresie Gateway. Po sparowaniu działania Node są zaufanymi działaniami operatora na tym Node.
  • sessionKey służy do wyboru routingu/kontekstu, a nie do uwierzytelniania per użytkownik.
  • Zatwierdzenia exec (allowlista + ask) są barierami ochronnymi dla intencji operatora, a nie izolacją przed wrogą wielodostępnością.
  • Domyślne zachowanie produktu OpenClaw dla zaufanych konfiguracji z jednym operatorem polega na tym, że host exec na gateway/node jest dozwolony bez monitów zatwierdzenia (security="full", ask="off", chyba że to zaostrzysz). To ustawienie domyślne jest celowym UX, a nie samo w sobie podatnością.
  • Zatwierdzenia exec wiążą dokładny kontekst żądania i best-effort bezpośrednie lokalne operandy plikowe; nie modelują semantycznie każdej ścieżki ładowania runtime/interpretera. Dla silnych granic używaj sandboxingu i izolacji hosta.
Jeśli potrzebujesz izolacji przed wrogimi użytkownikami, rozdziel granice zaufania według użytkownika OS/hosta i uruchamiaj osobne Gateway.

Macierz granic zaufania

Użyj tego jako szybkiego modelu podczas triage ryzyka:
Granica lub kontrolaCo to oznaczaCzęsty błędny odczyt
gateway.auth (token/hasło/trusted-proxy/device auth)Uwierzytelnia wywołujących do API Gateway„Aby było bezpiecznie, potrzebuje podpisów per wiadomość na każdej ramce”
sessionKeyKlucz routingu do wyboru kontekstu/sesji„Klucz sesji jest granicą uwierzytelniania użytkownika”
Bariery prompt/contentOgraniczają ryzyko nadużycia modelu„Sama prompt injection dowodzi obejścia uwierzytelniania”
canvas.eval / evaluate przeglądarkiZamierzona możliwość operatora, gdy włączona„Każdy prymityw JS eval to automatycznie luka w tym modelu zaufania”
Lokalne TUI ! shellJawnie wywoływane lokalne wykonanie przez operatora„Wygodne lokalne polecenie shell to zdalna iniekcja”
Parowanie Node i polecenia NodeZdalne wykonanie na poziomie operatora na sparowanych urządzeniach„Zdalne sterowanie urządzeniem domyślnie należy traktować jak dostęp niezaufanego użytkownika”

To z założenia nie są podatności

Takie wzorce są często zgłaszane i zwykle zamykane bez działań, chyba że zostanie pokazane rzeczywiste obejście granicy:
  • Łańcuchy oparte wyłącznie na prompt injection bez obejścia polityki/uwierzytelniania/sandboxa.
  • Twierdzenia zakładające wrogą wielodostępną pracę na jednym współdzielonym hoście/konfiguracji.
  • Twierdzenia klasyfikujące zwykły operatorski dostęp ścieżką odczytu (na przykład sessions.list/sessions.preview/chat.history) jako IDOR w konfiguracji współdzielonego Gateway.
  • Ustalenia dotyczące wdrożeń tylko localhost (na przykład HSTS na Gateway dostępnym wyłącznie przez loopback).
  • Ustalenia o podpisach przychodzących Webhooków Discord dla ścieżek przychodzących, które nie istnieją w tym repo.
  • Zgłoszenia traktujące metadane parowania Node jako ukrytą drugą warstwę zatwierdzania per polecenie dla system.run, gdy rzeczywistą granicą wykonania pozostaje globalna polityka poleceń Node po stronie Gateway oraz własne zatwierdzenia exec po stronie Node.
  • Ustalenia o „braku autoryzacji per użytkownik”, które traktują sessionKey jak token uwierzytelniania.

Lista kontrolna badacza przed zgłoszeniem

Przed otwarciem GHSA zweryfikuj wszystkie poniższe punkty:
  1. Reprodukcja nadal działa na najnowszym main albo najnowszym wydaniu.
  2. Zgłoszenie zawiera dokładną ścieżkę kodu (file, funkcja, zakres linii) oraz testowaną wersję/commit.
  3. Wpływ przekracza udokumentowaną granicę zaufania (a nie tylko prompt injection).
  4. Twierdzenie nie znajduje się na liście Out of Scope.
  5. Istniejące advisory zostały sprawdzone pod kątem duplikatów (użyj kanonicznego GHSA, gdy ma zastosowanie).
  6. Założenia wdrożeniowe są jawne (loopback/local vs wystawione, operatorzy zaufani vs niezaufani).

Utwardzona baza w 60 sekund

Najpierw użyj tej bazy, a potem selektywnie ponownie włączaj narzędzia per zaufany agent:
{
  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 } } },
  },
}
To utrzymuje Gateway jako lokalny, izoluje DM i domyślnie wyłącza narzędzia płaszczyzny sterowania/runtime.

Szybka zasada dla współdzielonej skrzynki odbiorczej

Jeśli więcej niż jedna osoba może wysyłać DM do Twojego bota:
  • Ustaw session.dmScope: "per-channel-peer" (albo "per-account-channel-peer" dla kanałów wielokontowych).
  • Zachowaj dmPolicy: "pairing" albo ścisłe allowlisty.
  • Nigdy nie łącz współdzielonych DM z szerokim dostępem do narzędzi.
  • To utwardza współpracujące/współdzielone skrzynki odbiorcze, ale nie zostało zaprojektowane jako izolacja przed wrogimi współdzierżawcami, gdy użytkownicy współdzielą uprawnienia zapisu do hosta/konfiguracji.

Model widoczności kontekstu

OpenClaw rozdziela dwa pojęcia:
  • Autoryzacja wyzwolenia: kto może wyzwolić agenta (dmPolicy, groupPolicy, allowlisty, bramki wzmianek).
  • Widoczność kontekstu: jaki dodatkowy kontekst jest wstrzykiwany do wejścia modelu (treść odpowiedzi, cytowany tekst, historia wątku, metadane przekazania dalej).
Allowlisty sterują wyzwalaniem i autoryzacją poleceń. Ustawienie contextVisibility kontroluje, jak filtrowany jest dodatkowy kontekst (cytowane odpowiedzi, korzenie wątków, pobrana historia):
  • contextVisibility: "all" (domyślnie) zachowuje dodatkowy kontekst w postaci otrzymanej.
  • contextVisibility: "allowlist" filtruje dodatkowy kontekst do nadawców dozwolonych przez aktywne sprawdzenia allowlist.
  • contextVisibility: "allowlist_quote" działa jak allowlist, ale nadal zachowuje jedną jawną cytowaną odpowiedź.
Ustaw contextVisibility per kanał albo per pokój/konwersację. Zobacz Czaty grupowe, aby poznać szczegóły konfiguracji. Wskazówki do triage advisory:
  • Twierdzenia pokazujące jedynie, że „model może zobaczyć cytowany lub historyczny tekst od nadawców spoza allowlisty”, są ustaleniami dotyczącymi utwardzania, które można rozwiązać przez contextVisibility, a nie same w sobie obejściem granicy uwierzytelniania, polityki lub sandboxa.
  • Aby zgłoszenie miało wpływ bezpieczeństwa, nadal musi wykazywać obejście granicy zaufania (uwierzytelnianie, polityka, sandbox, zatwierdzenie lub inna udokumentowana granica).

Co sprawdza audyt (wysoki poziom)

  • Dostęp przychodzący (zasady DM, zasady grup, allowlisty): czy obce osoby mogą wyzwolić bota?
  • Promień rażenia narzędzi (narzędzia podwyższone + otwarte pokoje): czy prompt injection może przerodzić się w działania powłoki/plików/sieci?
  • Dryf zatwierdzeń exec (security=full, autoAllowSkills, allowlisty interpreterów bez strictInlineEval): czy bariery ochronne host-exec nadal działają tak, jak myślisz?
    • security="full" to szerokie ostrzeżenie o postawie, a nie dowód błędu. Jest to wybrane ustawienie domyślne dla zaufanych konfiguracji osobistego asystenta; zaostrzaj je tylko wtedy, gdy Twój model zagrożeń wymaga zatwierdzeń lub barier allowlist.
  • Ekspozycja sieciowa (bind/auth Gateway, Tailscale Serve/Funnel, słabe/krótkie tokeny uwierzytelniające).
  • Ekspozycja sterowania przeglądarką (zdalne Node, porty przekaźnika, zdalne punkty końcowe CDP).
  • Higiena lokalnego dysku (uprawnienia, symlinki, include konfiguracji, ścieżki „zsynchronizowanych folderów”).
  • Plugins (Plugins ładują się bez jawnej allowlisty).
  • Dryf polityki/błędna konfiguracja (ustawienia sandbox docker są skonfigurowane, ale tryb sandbox jest wyłączony; nieskuteczne wzorce gateway.nodes.denyCommands, ponieważ dopasowanie dotyczy wyłącznie dokładnej nazwy polecenia (na przykład system.run) i nie analizuje tekstu powłoki; niebezpieczne wpisy gateway.nodes.allowCommands; globalne tools.profile="minimal" nadpisane przez profile per agent; narzędzia należące do Pluginów osiągalne przy permisywnej polityce narzędzi).
  • Dryf oczekiwań runtime (na przykład założenie, że niejawny exec nadal oznacza sandbox, gdy tools.exec.host ma teraz domyślnie wartość auto, albo jawne ustawienie tools.exec.host="sandbox" przy wyłączonym trybie sandbox).
  • Higiena modeli (ostrzeżenie, gdy skonfigurowane modele wyglądają na starsze; nie jest to twarda blokada).
Jeśli uruchomisz --deep, OpenClaw wykona również test Gateway na żywo w trybie best-effort.

Mapa przechowywania poświadczeń

Używaj tego podczas audytu dostępu lub podejmowania decyzji o tym, co kopiować zapasowo:
  • WhatsApp: ~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • Token bota Telegram: config/env albo channels.telegram.tokenFile (tylko zwykły plik; symlinki są odrzucane)
  • Token bota Discord: config/env albo SecretRef (dostawcy env/file/exec)
  • Tokeny Slack: config/env (channels.slack.*)
  • Allowlisty parowania:
    • ~/.openclaw/credentials/<channel>-allowFrom.json (konto domyślne)
    • ~/.openclaw/credentials/<channel>-<accountId>-allowFrom.json (konta niedomyślne)
  • Profile uwierzytelniania modeli: ~/.openclaw/agents/<agentId>/agent/auth-profiles.json
  • Ładunek sekretów oparty na pliku (opcjonalnie): ~/.openclaw/secrets.json
  • Starszy import OAuth: ~/.openclaw/credentials/oauth.json

Lista kontrolna audytu bezpieczeństwa

Gdy audyt wypisze ustalenia, traktuj tę kolejność jako priorytet:
  1. Wszystko, co jest „open” + włączone narzędzia: najpierw zablokuj DM/grupy (pairing/allowlisty), potem zaostrz politykę narzędzi/sandboxing.
  2. Publiczna ekspozycja sieciowa (bind LAN, Funnel, brak uwierzytelniania): napraw natychmiast.
  3. Zdalna ekspozycja sterowania przeglądarką: traktuj to jak dostęp operatora (tylko tailnet, paruj Node świadomie, unikaj publicznej ekspozycji).
  4. Uprawnienia: upewnij się, że stan/config/poświadczenia/uwierzytelnianie nie są czytelne dla grupy/świata.
  5. Plugins: ładuj tylko to, czemu jawnie ufasz.
  6. Wybór modelu: preferuj nowoczesne modele utwardzone instrukcyjnie dla każdego bota z narzędziami.

Słownik audytu bezpieczeństwa

Wysokosygnałowe wartości checkId, które najprawdopodobniej zobaczysz w rzeczywistych wdrożeniach (lista niepełna):
checkIdPoziom ważnościDlaczego to ma znaczenieGłówny klucz/ścieżka naprawyAutomatyczna naprawa
fs.state_dir.perms_world_writablecriticalInni użytkownicy/procesy mogą modyfikować cały stan OpenClawuprawnienia systemu plików dla ~/.openclawtak
fs.state_dir.perms_group_writablewarnUżytkownicy z grupy mogą modyfikować cały stan OpenClawuprawnienia systemu plików dla ~/.openclawtak
fs.state_dir.perms_readablewarnKatalog stanu jest czytelny dla innychuprawnienia systemu plików dla ~/.openclawtak
fs.state_dir.symlinkwarnCel katalogu stanu staje się inną granicą zaufaniaukład systemu plików katalogu stanunie
fs.config.perms_writablecriticalInni mogą zmieniać uwierzytelnianie/politykę narzędzi/konfiguracjęuprawnienia systemu plików dla ~/.openclaw/openclaw.jsontak
fs.config.symlinkwarnCel konfiguracji staje się inną granicą zaufaniaukład systemu plików pliku konfiguracjinie
fs.config.perms_group_readablewarnUżytkownicy z grupy mogą odczytać tokeny/ustawienia z konfiguracjiuprawnienia systemu plików pliku konfiguracjitak
fs.config.perms_world_readablecriticalKonfiguracja może ujawniać tokeny/ustawieniauprawnienia systemu plików pliku konfiguracjitak
fs.config_include.perms_writablecriticalInni mogą modyfikować plik include konfiguracjiuprawnienia pliku include wskazanego z openclaw.jsontak
fs.config_include.perms_group_readablewarnUżytkownicy z grupy mogą odczytać dołączone sekrety/ustawieniauprawnienia pliku include wskazanego z openclaw.jsontak
fs.config_include.perms_world_readablecriticalDołączone sekrety/ustawienia są czytelne dla wszystkichuprawnienia pliku include wskazanego z openclaw.jsontak
fs.auth_profiles.perms_writablecriticalInni mogą wstrzykiwać lub podmieniać zapisane poświadczenia modeliuprawnienia agents/<agentId>/agent/auth-profiles.jsontak
fs.auth_profiles.perms_readablewarnInni mogą odczytać klucze API i tokeny OAuthuprawnienia agents/<agentId>/agent/auth-profiles.jsontak
fs.credentials_dir.perms_writablecriticalInni mogą modyfikować stan parowania/poświadczeń kanałówuprawnienia systemu plików dla ~/.openclaw/credentialstak
fs.credentials_dir.perms_readablewarnInni mogą odczytać stan poświadczeń kanałówuprawnienia systemu plików dla ~/.openclaw/credentialstak
fs.sessions_store.perms_readablewarnInni mogą odczytać transkrypcje/metadane sesjiuprawnienia magazynu sesjitak
fs.log_file.perms_readablewarnInni mogą odczytać logi, które mimo redakcji nadal zawierają dane wrażliweuprawnienia pliku logu Gatewaytak
fs.synced_dirwarnStan/konfiguracja w iCloud/Dropbox/Drive poszerza ekspozycję tokenów/transkrypcjiprzenieś konfigurację/stan poza synchronizowane folderynie
gateway.bind_no_authcriticalZdalny bind bez wspólnego sekretugateway.bind, gateway.auth.*nie
gateway.loopback_no_authcriticalGateway na loopback za reverse proxy może stać się nieuwierzytelnionygateway.auth.*, konfiguracja proxynie
gateway.trusted_proxies_missingwarnNagłówki reverse proxy są obecne, ale nie są zaufanegateway.trustedProxiesnie
gateway.http.no_authwarn/criticalAPI HTTP Gateway są osiągalne przy auth.mode="none"gateway.auth.mode, gateway.http.endpoints.*nie
gateway.http.session_key_override_enabledinfoWywołujący API HTTP mogą nadpisywać sessionKeygateway.http.allowSessionKeyOverridenie
gateway.tools_invoke_http.dangerous_allowwarn/criticalPonownie włącza niebezpieczne narzędzia przez API HTTPgateway.tools.allownie
gateway.nodes.allow_commands_dangerouswarn/criticalWłącza polecenia Node o dużym wpływie (kamera/ekran/kontakty/kalendarz/SMS)gateway.nodes.allowCommandsnie
gateway.nodes.deny_commands_ineffectivewarnWpisy deny przypominające wzorce nie dopasowują tekstu powłoki ani grupgateway.nodes.denyCommandsnie
gateway.tailscale_funnelcriticalPubliczna ekspozycja do Internetugateway.tailscale.modenie
gateway.tailscale_serveinfoEkspozycja w tailnet jest włączona przez Servegateway.tailscale.modenie
gateway.control_ui.allowed_origins_requiredcriticalControl UI poza loopback bez jawnej allowlisty źródeł przeglądarkigateway.controlUi.allowedOriginsnie
gateway.control_ui.allowed_origins_wildcardwarn/criticalallowedOrigins=["*"] wyłącza allowlistę źródeł przeglądarkigateway.controlUi.allowedOriginsnie
gateway.control_ui.host_header_origin_fallbackwarn/criticalWłącza fallback źródła oparty na nagłówku Host (obniżenie ochrony przed DNS rebinding)gateway.controlUi.dangerouslyAllowHostHeaderOriginFallbacknie
gateway.control_ui.insecure_authwarnWłączony przełącznik zgodności z niezabezpieczonym uwierzytelnianiemgateway.controlUi.allowInsecureAuthnie
gateway.control_ui.device_auth_disabledcriticalWyłącza sprawdzanie tożsamości urządzeniagateway.controlUi.dangerouslyDisableDeviceAuthnie
gateway.real_ip_fallback_enabledwarn/criticalZaufanie do fallbacku X-Real-IP może umożliwić spoofing źródłowego IP przez błędną konfigurację proxygateway.allowRealIpFallback, gateway.trustedProxiesnie
gateway.token_too_shortwarnKrótki współdzielony token łatwiej złamać metodą brute forcegateway.auth.tokennie
gateway.auth_no_rate_limitwarnWystawione uwierzytelnianie bez limitowania żądań zwiększa ryzyko brute forcegateway.auth.rateLimitnie
gateway.trusted_proxy_authcriticalTożsamość proxy staje się teraz granicą uwierzytelnianiagateway.auth.mode="trusted-proxy"nie
gateway.trusted_proxy_no_proxiescriticalUwierzytelnianie trusted-proxy bez zaufanych adresów IP proxy jest niebezpiecznegateway.trustedProxiesnie
gateway.trusted_proxy_no_user_headercriticalUwierzytelnianie trusted-proxy nie może bezpiecznie rozstrzygać tożsamości użytkownikagateway.auth.trustedProxy.userHeadernie
gateway.trusted_proxy_no_allowlistwarnUwierzytelnianie trusted-proxy akceptuje dowolnego uwierzytelnionego użytkownika upstreamgateway.auth.trustedProxy.allowUsersnie
checkIdPoziom ważnościDlaczego to ma znaczenieGłówny klucz/ścieżka naprawyAutomatyczna naprawa
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
gateway.probe_auth_secretref_unavailablewarnGłęboki test nie mógł rozstrzygnąć SecretRef uwierzytelniania w tej ścieżce poleceniaźródło uwierzytelniania deep-probe / dostępność SecretRefnie
gateway.probe_failedwarn/criticalTest Gateway na żywo nie powiódł sięosiągalność/uwierzytelnianie Gatewaynie
discovery.mdns_full_modewarn/criticalPełny tryb mDNS ogłasza metadane cliPath/sshPort w sieci lokalnejdiscovery.mdns.mode, gateway.bindnie
config.insecure_or_dangerous_flagswarnWłączono dowolne niebezpieczne/niezabezpieczone flagi debugowaniawiele kluczy (szczegóły w opisie ustalenia)nie
config.secrets.gateway_password_in_configwarnHasło Gateway jest zapisane bezpośrednio w konfiguracjigateway.auth.passwordnie
config.secrets.hooks_token_in_configwarnToken bearer Hooka jest zapisany bezpośrednio w konfiguracjihooks.tokennie
hooks.token_reuse_gateway_tokencriticalToken wejściowy Hooka odblokowuje też uwierzytelnianie Gatewayhooks.token, gateway.auth.tokennie
hooks.token_too_shortwarnŁatwiejszy brute force na wejściu Hookahooks.tokennie
hooks.default_session_key_unsetwarnAgent Hooka rozsyła uruchomienia do generowanych per żądanie sesjihooks.defaultSessionKeynie
hooks.allowed_agent_ids_unrestrictedwarn/criticalUwierzytelnieni wywołujący Hooka mogą kierować ruch do dowolnego skonfigurowanego agentahooks.allowedAgentIdsnie
hooks.request_session_key_enabledwarn/criticalZewnętrzny wywołujący może wybrać sessionKeyhooks.allowRequestSessionKeynie
hooks.request_session_key_prefixes_missingwarn/criticalBrak ograniczeń dla kształtu zewnętrznych kluczy sesjihooks.allowedSessionKeyPrefixesnie
hooks.path_rootcriticalŚcieżka Hooka to /, co ułatwia kolizje lub błędne routowanie wejściahooks.pathnie
hooks.installs_unpinned_npm_specswarnRekordy instalacji Hooków nie są przypięte do niezmiennych specyfikacji npmmetadane instalacji Hookanie
hooks.installs_missing_integritywarnRekordom instalacji Hooków brakuje metadanych integralnościmetadane instalacji Hookanie
hooks.installs_version_driftwarnRekordy instalacji Hooków odbiegają od zainstalowanych pakietówmetadane instalacji Hookanie
logging.redact_offwarnWrażliwe wartości wyciekają do logów/statusulogging.redactSensitivetak
browser.control_invalid_configwarnKonfiguracja sterowania przeglądarką jest nieprawidłowa przed runtimebrowser.*nie
browser.control_no_authcriticalSterowanie przeglądarką wystawione bez uwierzytelniania tokenem/hasłemgateway.auth.*nie
browser.remote_cdp_httpwarnZdalne CDP po zwykłym HTTP nie ma szyfrowania transportucdpUrl profilu przeglądarkinie
browser.remote_cdp_private_hostwarnZdalne CDP kieruje na host prywatny/wewnętrznycdpUrl profilu przeglądarki, browser.ssrfPolicy.*nie
sandbox.docker_config_mode_offwarnKonfiguracja Docker sandbox istnieje, ale jest nieaktywnaagents.*.sandbox.modenie
sandbox.bind_mount_non_absolutewarnWzględne bind mounty mogą rozstrzygać się nieprzewidywalnieagents.*.sandbox.docker.binds[]nie
sandbox.dangerous_bind_mountcriticalBind mount sandboxa wskazuje zablokowane ścieżki systemowe, poświadczeń lub socketu Dockeragents.*.sandbox.docker.binds[]nie
sandbox.dangerous_network_modecriticalSieć Docker sandboxa używa trybu host lub container:* do dołączania przestrzeni nazwagents.*.sandbox.docker.networknie
sandbox.dangerous_seccomp_profilecriticalProfil seccomp sandboxa osłabia izolację konteneraagents.*.sandbox.docker.securityOptnie
sandbox.dangerous_apparmor_profilecriticalProfil AppArmor sandboxa osłabia izolację konteneraagents.*.sandbox.docker.securityOptnie
sandbox.browser_cdp_bridge_unrestrictedwarnMost CDP przeglądarki w sandboxie jest wystawiony bez ograniczenia zakresu źródełsandbox.browser.cdpSourceRangenie
sandbox.browser_container.non_loopback_publishcriticalIstniejący kontener przeglądarki publikuje CDP na interfejsach innych niż loopbackkonfiguracja publikacji kontenera sandbox przeglądarkinie
sandbox.browser_container.hash_label_missingwarnIstniejący kontener przeglądarki jest starszy niż bieżące etykiety hash konfiguracjiopenclaw sandbox recreate --browser --allnie
sandbox.browser_container.hash_epoch_stalewarnIstniejący kontener przeglądarki jest starszy niż bieżąca epoka konfiguracji przeglądarkiopenclaw sandbox recreate --browser --allnie
tools.exec.host_sandbox_no_sandbox_defaultswarnexec host=sandbox kończy się bezpieczną odmową, gdy sandbox jest wyłączonytools.exec.host, agents.defaults.sandbox.modenie
tools.exec.host_sandbox_no_sandbox_agentswarnexec host=sandbox per agent kończy się bezpieczną odmową, gdy sandbox jest wyłączonyagents.list[].tools.exec.host, agents.list[].sandbox.modenie
tools.exec.security_full_configuredwarn/criticalHost exec działa z security="full"tools.exec.security, agents.list[].tools.exec.securitynie
tools.exec.auto_allow_skills_enabledwarnZatwierdzenia exec domyślnie ufają binarkom ze Skills~/.openclaw/exec-approvals.jsonnie
tools.exec.allowlist_interpreter_without_strict_inline_evalwarnAllowlisty interpreterów dopuszczają inline eval bez wymuszonego ponownego zatwierdzeniatools.exec.strictInlineEval, agents.list[].tools.exec.strictInlineEval, allowlista zatwierdzeń execnie
tools.exec.safe_bins_interpreter_unprofiledwarnBinarki interpretera/runtime w safeBins bez jawnych profili poszerzają ryzyko exectools.exec.safeBins, tools.exec.safeBinProfiles, agents.list[].tools.exec.*nie
tools.exec.safe_bins_broad_behaviorwarnNarzędzia o szerokim zachowaniu w safeBins osłabiają model zaufania niskiego ryzyka oparty na filtrze stdintools.exec.safeBins, agents.list[].tools.exec.safeBinsnie
tools.exec.safe_bin_trusted_dirs_riskywarnsafeBinTrustedDirs zawiera modyfikowalne lub ryzykowne katalogitools.exec.safeBinTrustedDirs, agents.list[].tools.exec.safeBinTrustedDirsnie
skills.workspace.symlink_escapewarnskills/**/SKILL.md w obszarze roboczym rozstrzyga się poza katalog główny obszaru roboczego (dryf łańcucha symlinków)stan systemu plików skills/** w obszarze roboczymnie
plugins.extensions_no_allowlistwarnPlugins są instalowane bez jawnej allowlisty Pluginówplugins.allowlistnie
plugins.installs_unpinned_npm_specswarnRekordy instalacji Pluginów nie są przypięte do niezmiennych specyfikacji npmmetadane instalacji Pluginunie
checkIdPoziom ważnościDlaczego to ma znaczenieGłówny klucz/ścieżka naprawyAutomatyczna naprawa
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
plugins.installs_missing_integritywarnRekordom instalacji Pluginów brakuje metadanych integralnościmetadane instalacji Pluginunie
plugins.installs_version_driftwarnRekordy instalacji Pluginów odbiegają od zainstalowanych pakietówmetadane instalacji Pluginunie
plugins.code_safetywarn/criticalSkan kodu Pluginu wykrył podejrzane lub niebezpieczne wzorcekod Pluginu / źródło instalacjinie
plugins.code_safety.entry_pathwarnŚcieżka entry Pluginu wskazuje ukryte lokalizacje lub lokalizacje w node_modulesentry w manifeście Pluginunie
plugins.code_safety.entry_escapecriticalEntry Pluginu wychodzi poza katalog Pluginuentry w manifeście Pluginunie
plugins.code_safety.scan_failedwarnNie udało się ukończyć skanowania kodu Pluginuścieżka Pluginu / środowisko skanowanianie
skills.code_safetywarn/criticalMetadane/kod instalatora Skills zawierają podejrzane lub niebezpieczne wzorceźródło instalacji Skillsnie
skills.code_safety.scan_failedwarnNie udało się ukończyć skanowania kodu Skillsśrodowisko skanowania Skillsnie
security.exposure.open_channels_with_execwarn/criticalWspółdzielone/publiczne pokoje mogą uzyskać dostęp do agentów z włączonym execchannels.*.dmPolicy, channels.*.groupPolicy, tools.exec.*, agents.list[].tools.exec.*nie
security.exposure.open_groups_with_elevatedcriticalOtwarte grupy + narzędzia podwyższone tworzą ścieżki prompt injection o dużym wpływiechannels.*.groupPolicy, tools.elevated.*nie
security.exposure.open_groups_with_runtime_or_fscritical/warnOtwarte grupy mogą uzyskać dostęp do narzędzi poleceń/plików bez sandboxa/ograniczeń obszaru roboczegochannels.*.groupPolicy, tools.profile/deny, tools.fs.workspaceOnly, agents.*.sandbox.modenie
security.trust_model.multi_user_heuristicwarnKonfiguracja wygląda na wieloużytkownikową, mimo że model zaufania Gateway jest osobistym asystentemrozdziel granice zaufania albo zastosuj utwardzanie współdzielonego użytkownika (sandbox.mode, deny narzędzi/ograniczenie obszaru roboczego)nie
tools.profile_minimal_overriddenwarnNadpisania agenta omijają globalny profil minimalnyagents.list[].tools.profilenie
plugins.tools_reachable_permissive_policywarnNarzędzia rozszerzeń są osiągalne w permisywnych kontekstachtools.profile + allow/deny narzędzinie
models.legacywarnNadal skonfigurowane są starsze rodziny modeliwybór modelunie
models.weak_tierwarnSkonfigurowane modele są poniżej obecnie zalecanych poziomówwybór modelunie
models.small_paramscritical/infoMałe modele + niebezpieczne powierzchnie narzędzi zwiększają ryzyko iniekcjiwybór modelu + sandbox/polityka narzędzinie
summary.attack_surfaceinfoZbiorcze podsumowanie postawy uwierzytelniania, kanałów, narzędzi i ekspozycjiwiele kluczy (szczegóły w opisie ustalenia)nie

Interfejs Control UI przez HTTP

Interfejs Control UI potrzebuje bezpiecznego kontekstu (HTTPS albo localhost), aby wygenerować tożsamość urządzenia. gateway.controlUi.allowInsecureAuth to lokalny przełącznik zgodności:
  • Na localhost umożliwia uwierzytelnianie Control UI bez tożsamości urządzenia, gdy strona jest ładowana przez niezabezpieczony HTTP.
  • Nie omija sprawdzeń parowania.
  • Nie osłabia zdalnych (spoza localhost) wymagań dotyczących tożsamości urządzenia.
Preferuj HTTPS (Tailscale Serve) albo otwieraj UI na 127.0.0.1. Wyłącznie na potrzeby awaryjne gateway.controlUi.dangerouslyDisableDeviceAuth całkowicie wyłącza sprawdzanie tożsamości urządzenia. To poważne obniżenie bezpieczeństwa; pozostaw to wyłączone, chyba że aktywnie debugujesz i możesz szybko cofnąć zmianę. Niezależnie od tych niebezpiecznych flag, prawidłowe gateway.auth.mode: "trusted-proxy" może dopuszczać operatorskie sesje Control UI bez tożsamości urządzenia. Jest to zamierzone zachowanie trybu uwierzytelniania, a nie skrót allowInsecureAuth, i nadal nie obejmuje sesji Control UI w roli Node. openclaw security audit ostrzega, gdy to ustawienie jest włączone.

Podsumowanie niebezpiecznych lub niezabezpieczonych flag

openclaw security audit zawiera config.insecure_or_dangerous_flags, gdy włączone są znane niebezpieczne/niezabezpieczone przełączniki debugowania. Ten test obecnie agreguje:
  • gateway.controlUi.allowInsecureAuth=true
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true
  • gateway.controlUi.dangerouslyDisableDeviceAuth=true
  • hooks.gmail.allowUnsafeExternalContent=true
  • hooks.mappings[<index>].allowUnsafeExternalContent=true
  • tools.exec.applyPatch.workspaceOnly=false
  • plugins.entries.acpx.config.permissionMode=approve-all
Pełne klucze konfiguracji dangerous* / dangerously* zdefiniowane w schemacie konfiguracji OpenClaw:
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback
  • gateway.controlUi.dangerouslyDisableDeviceAuth
  • browser.ssrfPolicy.dangerouslyAllowPrivateNetwork
  • channels.discord.dangerouslyAllowNameMatching
  • channels.discord.accounts.<accountId>.dangerouslyAllowNameMatching
  • channels.slack.dangerouslyAllowNameMatching
  • channels.slack.accounts.<accountId>.dangerouslyAllowNameMatching
  • channels.googlechat.dangerouslyAllowNameMatching
  • channels.googlechat.accounts.<accountId>.dangerouslyAllowNameMatching
  • channels.msteams.dangerouslyAllowNameMatching
  • channels.synology-chat.dangerouslyAllowNameMatching (kanał Pluginu)
  • channels.synology-chat.accounts.<accountId>.dangerouslyAllowNameMatching (kanał Pluginu)
  • channels.synology-chat.dangerouslyAllowInheritedWebhookPath (kanał Pluginu)
  • channels.zalouser.dangerouslyAllowNameMatching (kanał Pluginu)
  • channels.zalouser.accounts.<accountId>.dangerouslyAllowNameMatching (kanał Pluginu)
  • channels.irc.dangerouslyAllowNameMatching (kanał Pluginu)
  • channels.irc.accounts.<accountId>.dangerouslyAllowNameMatching (kanał Pluginu)
  • channels.mattermost.dangerouslyAllowNameMatching (kanał Pluginu)
  • channels.mattermost.accounts.<accountId>.dangerouslyAllowNameMatching (kanał Pluginu)
  • channels.telegram.network.dangerouslyAllowPrivateNetwork
  • channels.telegram.accounts.<accountId>.network.dangerouslyAllowPrivateNetwork
  • agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets
  • agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources
  • agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin
  • agents.list[<index>].sandbox.docker.dangerouslyAllowReservedContainerTargets
  • agents.list[<index>].sandbox.docker.dangerouslyAllowExternalBindSources
  • agents.list[<index>].sandbox.docker.dangerouslyAllowContainerNamespaceJoin

Konfiguracja reverse proxy

Jeśli uruchamiasz Gateway za reverse proxy (nginx, Caddy, Traefik itp.), skonfiguruj gateway.trustedProxies, aby poprawnie obsługiwać przekazywany adres IP klienta. Gdy Gateway wykryje nagłówki proxy z adresu, który nie znajduje się w trustedProxies, nie będzie traktować połączeń jako lokalnych klientów. Jeśli uwierzytelnianie gateway jest wyłączone, takie połączenia są odrzucane. Zapobiega to obejściu uwierzytelniania, w którym połączenia przez proxy wyglądałyby inaczej jak z localhost i otrzymywały automatyczne zaufanie. gateway.trustedProxies zasila także gateway.auth.mode: "trusted-proxy", ale ten tryb uwierzytelniania jest bardziej rygorystyczny:
  • uwierzytelnianie trusted-proxy kończy się bezpieczną odmową dla proxy pochodzących z loopback
  • reverse proxy loopback na tym samym hoście nadal mogą używać gateway.trustedProxies do wykrywania lokalnych klientów i obsługi przekazywanego IP
  • dla reverse proxy loopback na tym samym hoście używaj uwierzytelniania tokenem/hasłem zamiast gateway.auth.mode: "trusted-proxy"
gateway:
  trustedProxies:
    - "10.0.0.1" # adres IP reverse proxy
  # Opcjonalne. Domyślnie false.
  # Włączaj tylko wtedy, gdy Twoje proxy nie może dostarczyć X-Forwarded-For.
  allowRealIpFallback: false
  auth:
    mode: password
    password: ${OPENCLAW_GATEWAY_PASSWORD}
Gdy trustedProxies jest skonfigurowane, Gateway używa X-Forwarded-For do określenia IP klienta. X-Real-IP jest domyślnie ignorowane, chyba że jawnie ustawiono gateway.allowRealIpFallback: true. Prawidłowe zachowanie reverse proxy (nadpisywanie przychodzących nagłówków przekazywania):
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
Nieprawidłowe zachowanie reverse proxy (dopisywanie/zachowywanie niezaufanych nagłówków przekazywania):
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Uwagi o HSTS i źródłach

  • Gateway OpenClaw jest projektowany przede wszystkim do pracy lokalnej/loopback. Jeśli kończysz TLS na reverse proxy, ustaw HSTS na domenie HTTPS obsługiwanej przez proxy właśnie tam.
  • Jeśli sam gateway kończy HTTPS, możesz ustawić gateway.http.securityHeaders.strictTransportSecurity, aby emitować nagłówek HSTS z odpowiedzi OpenClaw.
  • Szczegółowe wskazówki wdrożeniowe znajdziesz w Trusted Proxy Auth.
  • Dla wdrożeń Control UI poza loopback gateway.controlUi.allowedOrigins jest domyślnie wymagane.
  • gateway.controlUi.allowedOrigins: ["*"] to jawna polityka przeglądarki zezwalająca na wszystko, a nie utwardzone ustawienie domyślne. Unikaj tego poza ściśle kontrolowanymi lokalnymi testami.
  • Błędy uwierzytelniania źródła przeglądarki na loopback nadal podlegają limitowaniu żądań, nawet gdy włączone jest ogólne zwolnienie loopback, ale klucz blokady jest ograniczony per znormalizowana wartość Origin, a nie do jednego współdzielonego koszyka localhost.
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true włącza tryb fallbacku źródła oparty na nagłówku Host; traktuj to jako niebezpieczną politykę wybraną przez operatora.
  • Traktuj DNS rebinding i zachowanie nagłówka Host w proxy jako kwestie utwardzania wdrożenia; utrzymuj trustedProxies w ścisłym zakresie i unikaj bezpośredniego wystawiania gateway do publicznego Internetu.

Lokalne logi sesji są przechowywane na dysku

OpenClaw przechowuje transkrypcje sesji na dysku pod ~/.openclaw/agents/<agentId>/sessions/*.jsonl. Jest to wymagane dla ciągłości sesji i (opcjonalnie) indeksowania pamięci sesji, ale oznacza też, że każdy proces/użytkownik z dostępem do systemu plików może odczytać te logi. Traktuj dostęp do dysku jako granicę zaufania i zablokuj uprawnienia do ~/.openclaw (zobacz sekcję audytu poniżej). Jeśli potrzebujesz silniejszej izolacji między agentami, uruchamiaj je pod osobnymi użytkownikami OS albo na osobnych hostach.

Wykonywanie na Node (system.run)

Jeśli Node macOS jest sparowany, Gateway może wywoływać system.run na tym Node. To jest zdalne wykonanie kodu na Macu:
  • Wymaga parowania Node (zatwierdzenie + token).
  • Parowanie Node po stronie Gateway nie jest powierzchnią zatwierdzania per polecenie. Ustanawia tożsamość/zaufanie Node i wydawanie tokenów.
  • Gateway stosuje zgrubną globalną politykę poleceń Node przez gateway.nodes.allowCommands / denyCommands.
  • Sterowanie na Macu odbywa się przez Ustawienia → Zatwierdzenia exec (security + ask + allowlist).
  • Polityką system.run per Node jest własny plik zatwierdzeń exec tego Node (exec.approvals.node.*), który może być bardziej lub mniej rygorystyczny niż globalna polityka identyfikatorów poleceń po stronie gateway.
  • Node działający z security="full" i ask="off" postępuje zgodnie z domyślnym modelem zaufanego operatora. Traktuj to jako oczekiwane zachowanie, chyba że Twoje wdrożenie jawnie wymaga bardziej rygorystycznej polityki zatwierdzeń lub allowlist.
  • Tryb zatwierdzania wiąże dokładny kontekst żądania i, gdy to możliwe, jeden konkretny lokalny operand skryptu/pliku. Jeśli OpenClaw nie potrafi zidentyfikować dokładnie jednego bezpośredniego lokalnego pliku dla polecenia interpretera/runtime, wykonanie oparte na zatwierdzeniu jest odrzucane zamiast obiecywać pełne pokrycie semantyczne.
  • Dla host=node wykonania oparte na zatwierdzeniu zapisują też kanoniczny przygotowany systemRunPlan; późniejsze zatwierdzone przekazania dalej ponownie używają tego zapisanego planu, a gateway odrzuca edycje wywołującego dotyczące polecenia/cwd/kontekstu sesji po utworzeniu żądania zatwierdzenia.
  • Jeśli nie chcesz zdalnego wykonywania, ustaw security na deny i usuń parowanie Node dla tego Maca.
To rozróżnienie ma znaczenie przy triage:
  • Ponownie łączący się sparowany Node reklamujący inną listę poleceń sam w sobie nie jest podatnością, jeśli globalna polityka Gateway oraz lokalne zatwierdzenia exec Node nadal egzekwują rzeczywistą granicę wykonania.
  • Zgłoszenia traktujące metadane parowania Node jako drugą ukrytą warstwę zatwierdzania per polecenie są zwykle myleniem polityki/UX, a nie obejściem granicy bezpieczeństwa.

Dynamiczne Skills (watcher / zdalne Node)

OpenClaw może odświeżać listę Skills w trakcie sesji:
  • Watcher Skills: zmiany w SKILL.md mogą zaktualizować migawkę Skills przy następnej turze agenta.
  • Zdalne Node: podłączenie Node macOS może sprawić, że kwalifikować się będą Skills tylko dla macOS (na podstawie wykrywania binarek).
Traktuj foldery Skills jako zaufany kod i ogranicz, kto może je modyfikować.

Model zagrożeń

Twój asystent AI może:
  • wykonywać dowolne polecenia powłoki
  • odczytywać/zapisywać pliki
  • uzyskiwać dostęp do usług sieciowych
  • wysyłać wiadomości do dowolnych osób (jeśli dasz mu dostęp do WhatsApp)
Osoby, które wysyłają Ci wiadomości, mogą:
  • próbować skłonić Twoje AI do zrobienia czegoś złego
  • stosować socjotechnikę, aby uzyskać dostęp do Twoich danych
  • badać szczegóły infrastruktury

Główna koncepcja: kontrola dostępu przed inteligencją

Większość porażek tutaj to nie wyrafinowane exploity — to raczej „ktoś napisał do bota, a bot zrobił to, o co poproszono”. Podejście OpenClaw:
  • Najpierw tożsamość: zdecyduj, kto może rozmawiać z botem (parowanie DM / allowlisty / jawne „open”).
  • Potem zakres: zdecyduj, gdzie bot może działać (allowlisty grup + bramkowanie wzmianek, narzędzia, sandboxing, uprawnienia urządzenia).
  • Model na końcu: zakładaj, że modelem można manipulować; projektuj tak, aby skutki manipulacji miały ograniczony promień rażenia.

Model autoryzacji poleceń

Polecenia ukośnikowe i dyrektywy są honorowane tylko dla autoryzowanych nadawców. Autoryzacja wynika z allowlist/parowania kanałów oraz commands.useAccessGroups (zobacz Konfiguracja i Polecenia ukośnikowe). Jeśli allowlista kanału jest pusta lub zawiera "*", polecenia są w praktyce otwarte dla tego kanału. /exec to wygoda tylko dla sesji autoryzowanych operatorów. Nie zapisuje konfiguracji ani nie zmienia innych sesji.

Ryzyko narzędzi płaszczyzny sterowania

Dwa wbudowane narzędzia mogą wprowadzać trwałe zmiany w płaszczyźnie sterowania:
  • gateway może sprawdzać konfigurację przez config.schema.lookup / config.get, a także wprowadzać trwałe zmiany przez config.apply, config.patch i update.run.
  • cron może tworzyć zadania harmonogramu, które działają dalej po zakończeniu pierwotnego czatu/zadania.
Narzędzie runtime gateway tylko dla właściciela nadal odmawia przepisywania tools.exec.ask albo tools.exec.security; starsze aliasy tools.bash.* są normalizowane do tych samych chronionych ścieżek exec przed zapisem. Dla każdego agenta/powierzchni, która obsługuje niezaufane treści, domyślnie blokuj te narzędzia:
{
  tools: {
    deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],
  },
}
commands.restart=false blokuje tylko działania restartu. Nie wyłącza działań konfiguracji/aktualizacji gateway.

Plugins

Plugins działają w procesie z Gateway. Traktuj je jako zaufany kod:
  • Instaluj Plugins tylko ze źródeł, którym ufasz.
  • Preferuj jawne allowlisty plugins.allow.
  • Przejrzyj konfigurację Pluginu przed jego włączeniem.
  • Po zmianach Pluginów uruchom ponownie Gateway.
  • Jeśli instalujesz lub aktualizujesz Plugins (openclaw plugins install <package>, openclaw plugins update <id>), traktuj to jak uruchamianie niezaufanego kodu:
    • Ścieżka instalacji to katalog per Plugin w aktywnym katalogu instalacji Pluginów.
    • OpenClaw uruchamia przed instalacją/aktualizacją wbudowane skanowanie niebezpiecznego kodu. Ustalenia critical domyślnie blokują operację.
    • OpenClaw używa npm pack, a następnie uruchamia npm install --omit=dev w tym katalogu (skrypty cyklu życia npm mogą wykonywać kod podczas instalacji).
    • Preferuj przypięte, dokładne wersje (@scope/pkg@1.2.3) i sprawdź rozpakowany kod na dysku przed włączeniem.
    • --dangerously-force-unsafe-install jest tylko awaryjną opcją dla fałszywych trafień wbudowanego skanera w przepływach instalacji/aktualizacji Pluginów. Nie omija blokad polityki hooka Pluginu before_install i nie omija błędów skanowania.
    • Instalacje zależności Skills obsługiwane przez Gateway stosują ten sam podział na niebezpieczne/podejrzane: wbudowane ustalenia critical blokują operację, chyba że wywołujący jawnie ustawi dangerouslyForceUnsafeInstall, natomiast podejrzane ustalenia nadal tylko ostrzegają. openclaw skills install pozostaje osobnym przepływem pobierania/instalacji Skills z ClawHub.
Szczegóły: Plugins

Model dostępu DM (pairing / allowlist / open / disabled)

Wszystkie obecne kanały obsługujące DM wspierają politykę DM (dmPolicy lub *.dm.policy), która blokuje przychodzące DM zanim wiadomość zostanie przetworzona:
  • pairing (domyślnie): nieznani nadawcy otrzymują krótki kod parowania, a bot ignoruje ich wiadomość do momentu zatwierdzenia. Kody wygasają po 1 godzinie; powtarzane DM nie wysyłają ponownie kodu, dopóki nie zostanie utworzone nowe żądanie. Oczekujące żądania są domyślnie ograniczone do 3 na kanał.
  • allowlist: nieznani nadawcy są blokowani (bez handshake parowania).
  • open: każdy może wysłać DM (publiczne). Wymaga, aby allowlista kanału zawierała "*" (jawne opt-in).
  • disabled: całkowicie ignoruje przychodzące DM.
Zatwierdzanie przez CLI:
openclaw pairing list <channel>
openclaw pairing approve <channel> <code>
Szczegóły + pliki na dysku: Parowanie

Izolacja sesji DM (tryb wieloużytkownikowy)

Domyślnie OpenClaw kieruje wszystkie DM do głównej sesji, aby Twój asystent zachowywał ciągłość między urządzeniami i kanałami. Jeśli wiele osób może wysyłać DM do bota (otwarte DM albo allowlista wielu osób), rozważ izolację sesji DM:
{
  session: { dmScope: "per-channel-peer" },
}
Zapobiega to wyciekom kontekstu między użytkownikami, przy jednoczesnym zachowaniu izolacji czatów grupowych. To granica kontekstu wiadomości, a nie granica administracyjna hosta. Jeśli użytkownicy są wzajemnie antagonistyczni i współdzielą ten sam host/konfigurację Gateway, uruchamiaj zamiast tego osobne Gateway dla każdej granicy zaufania.

Bezpieczny tryb DM (zalecane)

Traktuj powyższy fragment jako bezpieczny tryb DM:
  • Domyślnie: session.dmScope: "main" (wszystkie DM współdzielą jedną sesję dla zachowania ciągłości).
  • Domyślne zachowanie lokalnego onboardingu CLI: zapisuje session.dmScope: "per-channel-peer", gdy wartość nie jest ustawiona (zachowuje istniejące jawne wartości).
  • Bezpieczny tryb DM: session.dmScope: "per-channel-peer" (każda para kanał+nadawca otrzymuje izolowany kontekst DM).
  • Izolacja peer między kanałami: session.dmScope: "per-peer" (każdy nadawca ma jedną sesję we wszystkich kanałach tego samego typu).
Jeśli uruchamiasz wiele kont w tym samym kanale, użyj zamiast tego per-account-channel-peer. Jeśli ta sama osoba kontaktuje się z Tobą przez wiele kanałów, użyj session.identityLinks, aby zwinąć te sesje DM do jednej kanonicznej tożsamości. Zobacz Zarządzanie sesjami i Konfiguracja.

Allowlisty (DM + grupy) - terminologia

OpenClaw ma dwie osobne warstwy typu „kto może mnie wyzwolić?”:
  • Allowlista DM (allowFrom / channels.discord.allowFrom / channels.slack.allowFrom; starsze: channels.discord.dm.allowFrom, channels.slack.dm.allowFrom): kto może rozmawiać z botem w wiadomościach bezpośrednich.
    • Gdy dmPolicy="pairing", zatwierdzenia są zapisywane do magazynu allowlisty parowania o zakresie konta w ~/.openclaw/credentials/ (<channel>-allowFrom.json dla konta domyślnego, <channel>-<accountId>-allowFrom.json dla kont niedomyślnych), a następnie scalane z allowlistami z konfiguracji.
  • Allowlista grup (specyficzna dla kanału): z których grup/kanałów/gildii bot w ogóle będzie akceptował wiadomości.
    • Typowe wzorce:
      • channels.whatsapp.groups, channels.telegram.groups, channels.imessage.groups: ustawienia domyślne per grupa, takie jak requireMention; po ustawieniu działa to również jako allowlista grup (dodaj "*", aby zachować zachowanie zezwalające na wszystko).
      • groupPolicy="allowlist" + groupAllowFrom: ogranicza, kto może wyzwolić bota wewnątrz sesji grupowej (WhatsApp/Telegram/Signal/iMessage/Microsoft Teams).
      • channels.discord.guilds / channels.slack.channels: allowlisty per powierzchnia + domyślne wzmianki.
    • Sprawdzanie grup działa w tej kolejności: najpierw groupPolicy/allowlisty grup, potem aktywacja przez wzmiankę/odpowiedź.
    • Odpowiedź na wiadomość bota (niejawna wzmianka) nie omija allowlist nadawców, takich jak groupAllowFrom.
    • Uwaga dotycząca bezpieczeństwa: traktuj dmPolicy="open" i groupPolicy="open" jako ustawienia ostateczności. Powinny być używane bardzo rzadko; preferuj pairing + allowlisty, chyba że w pełni ufasz każdemu członkowi danego pokoju.
Szczegóły: Konfiguracja i Grupy

Prompt injection (co to jest i dlaczego ma znaczenie)

Prompt injection występuje wtedy, gdy atakujący tworzy wiadomość manipulującą modelem, aby zrobił coś niebezpiecznego („zignoruj swoje instrukcje”, „zrzuć system plików”, „wejdź pod ten link i uruchom polecenia” itp.). Nawet przy silnych system promptach problem prompt injection nie jest rozwiązany. Bariery ochronne system promptu są jedynie miękką wskazówką; twarde egzekwowanie zapewnia polityka narzędzi, zatwierdzenia exec, sandboxing i allowlisty kanałów (a operatorzy mogą je z założenia wyłączyć). Co pomaga w praktyce:
  • Utrzymuj przychodzące DM zablokowane (pairing/allowlisty).
  • Preferuj bramkowanie wzmianek w grupach; unikaj botów „always-on” w publicznych pokojach.
  • Traktuj linki, załączniki i wklejone instrukcje jako wrogie domyślnie.
  • Uruchamiaj wrażliwe wykonanie narzędzi w sandboxie; trzymaj sekrety poza systemem plików dostępnym dla agenta.
  • Uwaga: sandboxing jest opcjonalny. Jeśli tryb sandbox jest wyłączony, niejawne host=auto rozstrzyga się do hosta gateway. Jawne host=sandbox nadal kończy się bezpieczną odmową, ponieważ runtime sandboxa nie jest dostępny. Ustaw host=gateway, jeśli chcesz, aby to zachowanie było jawne w konfiguracji.
  • Ogranicz narzędzia wysokiego ryzyka (exec, browser, web_fetch, web_search) do zaufanych agentów albo jawnych allowlist.
  • Jeśli dodajesz interpretery do allowlisty (python, node, ruby, perl, php, lua, osascript), włącz tools.exec.strictInlineEval, aby formy inline eval nadal wymagały jawnego zatwierdzenia.
  • Analiza zatwierdzeń powłoki odrzuca także formy rozwijania parametrów POSIX ($VAR, $?, $$, $1, $@, ${…}) wewnątrz niecytowanych heredoców, dzięki czemu treść heredoca z allowlisty nie może przemycić rozwinięcia powłoki podczas przeglądu allowlisty jako zwykłego tekstu. Zacytuj terminator heredoca (na przykład <<'EOF'), aby włączyć semantykę dosłownej treści; niecytowane heredoki, które rozszerzałyby zmienne, są odrzucane.
  • Wybór modelu ma znaczenie: starsze/mniejsze/historyczne modele są znacząco mniej odporne na prompt injection i nadużycia narzędzi. Dla agentów z włączonymi narzędziami używaj najmocniejszego dostępnego modelu najnowszej generacji, utwardzonego instrukcyjnie.
Sygnały ostrzegawcze, które należy traktować jako niezaufane:
  • „Przeczytaj ten plik/URL i zrób dokładnie to, co mówi.”
  • „Zignoruj system prompt albo reguły bezpieczeństwa.”
  • „Ujawnij swoje ukryte instrukcje albo wyniki narzędzi.”
  • „Wklej pełną zawartość ~/.openclaw albo swoich logów.”

Oczyszczanie z tokenów specjalnych w treściach zewnętrznych

OpenClaw usuwa typowe literały tokenów specjalnych z szablonów czatu samohostowanych LLM z opakowanych treści zewnętrznych i metadanych, zanim trafią one do modelu. Obsługiwane rodziny znaczników obejmują tokeny ról/tur Qwen/ChatML, Llama, Gemma, Mistral, Phi i GPT-OSS. Dlaczego:
  • Backendy zgodne z OpenAI, które wystawiają samohostowane modele, czasami zachowują tokeny specjalne pojawiające się w tekście użytkownika zamiast je maskować. Atakujący, który może zapisać dane do przychodzących treści zewnętrznych (pobrana strona, treść e-maila, wynik narzędzia odczytu zawartości pliku), mógłby w przeciwnym razie wstrzyknąć syntetyczną granicę roli assistant albo system i uciec spod barier ochronnych dla opakowanych treści.
  • Oczyszczanie zachodzi na warstwie opakowywania treści zewnętrznych, więc jest stosowane jednolicie we wszystkich narzędziach fetch/read i przychodzących treściach kanałów, zamiast być zależne od dostawcy.
  • Wychodzące odpowiedzi modelu mają już osobny sanitizer, który usuwa wyciekłe konstrukcje <tool_call>, <function_calls> i podobne z odpowiedzi widocznych dla użytkownika. Sanitizer treści zewnętrznych jest odpowiednikiem po stronie wejścia.
Nie zastępuje to innych zabezpieczeń opisanych na tej stronie — dmPolicy, allowlisty, zatwierdzenia exec, sandboxing i contextVisibility nadal wykonują główną pracę. Zamykane jest tu jedno konkretne obejście na warstwie tokenizera przeciw stosom samohostowanym, które przekazują tekst użytkownika z nienaruszonymi tokenami specjalnymi.

Flagi obejścia dla niebezpiecznych treści zewnętrznych

OpenClaw zawiera jawne flagi obejścia, które wyłączają bezpieczne opakowywanie treści zewnętrznych:
  • hooks.mappings[].allowUnsafeExternalContent
  • hooks.gmail.allowUnsafeExternalContent
  • Pole ładunku Cron allowUnsafeExternalContent
Wskazówki:
  • Pozostawiaj je nieustawione/false w środowisku produkcyjnym.
  • Włączaj tylko tymczasowo do ściśle ograniczonego debugowania.
  • Jeśli są włączone, izoluj tego agenta (sandbox + minimalne narzędzia + dedykowana przestrzeń nazw sesji).
Uwaga o ryzyku Hooków:
  • Ładunki Hooków to niezaufane treści, nawet gdy dostarczanie pochodzi z systemów, które kontrolujesz (treści maili/dokumentów/WWW mogą zawierać prompt injection).
  • Słabsze poziomy modeli zwiększają to ryzyko. Dla automatyzacji opartych na Hookach preferuj silne nowoczesne poziomy modeli i utrzymuj ścisłą politykę narzędzi (tools.profile: "messaging" lub bardziej rygorystyczną), plus sandboxing tam, gdzie to możliwe.

Prompt injection nie wymaga publicznych DM

Nawet jeśli tylko Ty możesz wysyłać wiadomości do bota, prompt injection nadal może wystąpić przez dowolne niezaufane treści, które bot odczytuje (wyniki wyszukiwania/pobierania z WWW, strony w przeglądarce, e-maile, dokumenty, załączniki, wklejone logi/kod). Innymi słowy: nadawca nie jest jedyną powierzchnią zagrożenia; sama treść może przenosić antagonistyczne instrukcje. Gdy narzędzia są włączone, typowym ryzykiem jest eksfiltracja kontekstu albo wyzwolenie wywołań narzędzi. Ogranicz promień rażenia przez:
  • Używanie tylko do odczytu albo pozbawionego narzędzi agenta-czytnika do podsumowywania niezaufanych treści, a następnie przekazywanie podsumowania do głównego agenta.
  • Wyłączanie web_search / web_fetch / browser dla agentów z włączonymi narzędziami, jeśli nie są potrzebne.
  • Dla wejść URL OpenResponses (input_file / input_image) ustaw ścisłe gateway.http.endpoints.responses.files.urlAllowlist oraz gateway.http.endpoints.responses.images.urlAllowlist, a także utrzymuj niską wartość maxUrlParts. Puste allowlisty są traktowane jak nieustawione; użyj files.allowUrl: false / images.allowUrl: false, jeśli chcesz całkowicie wyłączyć pobieranie URL.
  • Dla wejść plikowych OpenResponses zdekodowany tekst input_file nadal jest wstrzykiwany jako niezaufana treść zewnętrzna. Nie zakładaj, że tekst pliku jest zaufany tylko dlatego, że Gateway zdekodował go lokalnie. Wstrzyknięty blok nadal zawiera jawne znaczniki graniczne <<<EXTERNAL_UNTRUSTED_CONTENT ...>>> oraz metadane Source: External, mimo że ta ścieżka pomija dłuższy baner SECURITY NOTICE:.
  • To samo opakowywanie oparte na znacznikach jest stosowane, gdy rozumienie mediów wyodrębnia tekst z dołączonych dokumentów przed dołączeniem tego tekstu do promptu mediów.
  • Włączanie sandboxingu i ścisłych allowlist narzędzi dla każdego agenta, który styka się z niezaufanym wejściem.
  • Trzymanie sekretów poza promptami; przekazuj je przez env/config na hoście gateway.

Samohostowane backendy LLM

OpenAI-compatible samohostowane backendy, takie jak vLLM, SGLang, TGI, LM Studio czy niestandardowe stosy tokenizerów Hugging Face, mogą różnić się od hostowanych dostawców sposobem obsługi specjalnych tokenów szablonów czatu. Jeśli backend tokenizuje dosłowne ciągi, takie jak <|im_start|>, <|start_header_id|> albo <start_of_turn>, jako strukturalne tokeny szablonu czatu wewnątrz treści użytkownika, niezaufany tekst może próbować podrobić granice ról na warstwie tokenizera. OpenClaw usuwa typowe literały tokenów specjalnych rodzin modeli z opakowanych treści zewnętrznych przed przekazaniem ich do modelu. Zachowuj włączone opakowywanie treści zewnętrznych i, gdy są dostępne, preferuj ustawienia backendu, które dzielą lub eskapują tokeny specjalne w treściach dostarczonych przez użytkownika. Hostowani dostawcy, tacy jak OpenAI i Anthropic, już stosują własne oczyszczanie po stronie żądania.

Siła modelu (uwaga dotycząca bezpieczeństwa)

Odporność na prompt injection nie jest jednolita między poziomami modeli. Mniejsze/tańsze modele są zazwyczaj bardziej podatne na nadużycia narzędzi i przejmowanie instrukcji, zwłaszcza przy antagonistycznych promptach.
Dla agentów z włączonymi narzędziami albo agentów odczytujących niezaufane treści ryzyko prompt injection przy starszych/mniejszych modelach jest często zbyt wysokie. Nie uruchamiaj takich obciążeń na słabych poziomach modeli.
Zalecenia:
  • Używaj najnowszego, najlepszego poziomu modelu dla każdego bota, który może uruchamiać narzędzia albo dotykać plików/sieci.
  • Nie używaj starszych/słabszych/mniejszych poziomów dla agentów z włączonymi narzędziami albo niezaufanych skrzynek odbiorczych; ryzyko prompt injection jest zbyt wysokie.
  • Jeśli musisz użyć mniejszego modelu, zmniejsz promień rażenia (narzędzia tylko do odczytu, silny sandboxing, minimalny dostęp do systemu plików, ścisłe allowlisty).
  • Przy uruchamianiu małych modeli włącz sandboxing dla wszystkich sesji oraz wyłącz web_search/web_fetch/browser, chyba że wejścia są ściśle kontrolowane.
  • Dla osobistych asystentów tylko do czatu z zaufanym wejściem i bez narzędzi mniejsze modele zwykle są wystarczające.

Reasoning i szczegółowe wyjście w grupach

/reasoning, /verbose i /trace mogą ujawniać wewnętrzne rozumowanie, wyniki narzędzi lub diagnostykę Pluginów, które nie były przeznaczone do kanału publicznego. W ustawieniach grupowych traktuj je jako funkcje wyłącznie debugowe i pozostawiaj wyłączone, chyba że jawnie ich potrzebujesz. Wskazówki:
  • Pozostawiaj /reasoning, /verbose i /trace wyłączone w publicznych pokojach.
  • Jeśli je włączasz, rób to tylko w zaufanych DM albo ściśle kontrolowanych pokojach.
  • Pamiętaj: wyjście verbose i trace może zawierać argumenty narzędzi, adresy URL, diagnostykę Pluginów i dane, które widział model.

Utwardzanie konfiguracji (przykłady)

0) Uprawnienia plików

Zachowuj prywatność konfiguracji + stanu na hoście gateway:
  • ~/.openclaw/openclaw.json: 600 (tylko odczyt/zapis użytkownika)
  • ~/.openclaw: 700 (tylko użytkownik)
openclaw doctor może ostrzec i zaproponować zaostrzenie tych uprawnień.

0.4) Ekspozycja sieciowa (bind + port + zapora)

Gateway multipleksuje WebSocket + HTTP na jednym porcie:
  • Domyślnie: 18789
  • Config/flagi/env: gateway.port, --port, OPENCLAW_GATEWAY_PORT
Ta powierzchnia HTTP obejmuje Control UI i host canvas:
  • Control UI (zasoby SPA) (domyślna ścieżka bazowa /)
  • Host canvas: /__openclaw__/canvas/ i /__openclaw__/a2ui/ (dowolny HTML/JS; traktuj jako niezaufane treści)
Jeśli ładujesz treści canvas w zwykłej przeglądarce, traktuj je jak każdą inną niezaufaną stronę WWW:
  • Nie wystawiaj hosta canvas niezaufanym sieciom/użytkownikom.
  • Nie sprawiaj, aby treści canvas współdzieliły to samo źródło co uprzywilejowane powierzchnie WWW, chyba że w pełni rozumiesz konsekwencje.
Tryb bind kontroluje, gdzie Gateway nasłuchuje:
  • gateway.bind: "loopback" (domyślnie): mogą łączyć się tylko lokalni klienci.
  • Bindowanie poza loopback ("lan", "tailnet", "custom") rozszerza powierzchnię ataku. Używaj ich tylko z uwierzytelnianiem gateway (współdzielony token/hasło albo poprawnie skonfigurowane trusted proxy spoza loopback) i rzeczywistą zaporą.
Praktyczne zasady:
  • Preferuj Tailscale Serve zamiast bindów LAN (Serve utrzymuje Gateway na loopback, a Tailscale obsługuje dostęp).
  • Jeśli musisz bindować do LAN, ogranicz port zaporą do ścisłej allowlisty źródłowych adresów IP; nie przekierowuj go szeroko.
  • Nigdy nie wystawiaj nieuwierzytelnionego Gateway na 0.0.0.0.

0.4.1) Publikowanie portów Docker + UFW (DOCKER-USER)

Jeśli uruchamiasz OpenClaw z Docker na VPS, pamiętaj, że opublikowane porty kontenera (-p HOST:CONTAINER albo Compose ports:) są routowane przez łańcuchy przekazywania Dockera, a nie tylko przez reguły hosta INPUT. Aby utrzymać ruch Dockera zgodny z polityką zapory, wymuszaj reguły w DOCKER-USER (ten łańcuch jest oceniany przed własnymi regułami accept Dockera). W wielu nowoczesnych dystrybucjach iptables/ip6tables używają frontendu iptables-nft i nadal stosują te reguły do backendu nftables. Minimalny przykład allowlisty (IPv4):
# /etc/ufw/after.rules (dodaj jako własną sekcję *filter)
*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 RETURN
COMMIT
IPv6 ma osobne tabele. Dodaj odpowiadającą politykę w /etc/ufw/after6.rules, jeśli Docker IPv6 jest włączony. Unikaj wpisywania na sztywno nazw interfejsów takich jak eth0 w fragmentach dokumentacji. Nazwy interfejsów różnią się między obrazami VPS (ens3, enp* itp.), a niedopasowania mogą przypadkowo pominąć regułę deny. Szybka walidacja po przeładowaniu:
ufw reload
iptables -S DOCKER-USER
ip6tables -S DOCKER-USER
nmap -sT -p 1-65535 <public-ip> --open
Oczekiwane porty zewnętrzne powinny obejmować tylko to, co świadomie wystawiasz (w większości konfiguracji: SSH + porty reverse proxy).

0.4.2) Wykrywanie mDNS/Bonjour (ujawnianie informacji)

Gateway rozgłasza swoją obecność przez mDNS (_openclaw-gw._tcp na porcie 5353) do lokalnego wykrywania urządzeń. W trybie pełnym obejmuje to rekordy TXT, które mogą ujawniać szczegóły operacyjne:
  • cliPath: pełna ścieżka systemu plików do binarki CLI (ujawnia nazwę użytkownika i lokalizację instalacji)
  • sshPort: ogłasza dostępność SSH na hoście
  • displayName, lanHost: informacje o nazwie hosta
Kwestia bezpieczeństwa operacyjnego: rozgłaszanie szczegółów infrastruktury ułatwia rozpoznanie każdemu w sieci lokalnej. Nawet „nieszkodliwe” informacje, takie jak ścieżki systemu plików i dostępność SSH, pomagają atakującym mapować środowisko. Zalecenia:
  1. Tryb minimalny (domyślny, zalecany dla wystawionych gateway): pomija wrażliwe pola z rozgłoszeń mDNS:
    {
      discovery: {
        mdns: { mode: "minimal" },
      },
    }
    
  2. Całkowicie wyłącz, jeśli nie potrzebujesz lokalnego wykrywania urządzeń:
    {
      discovery: {
        mdns: { mode: "off" },
      },
    }
    
  3. Tryb pełny (opt-in): uwzględnia cliPath + sshPort w rekordach TXT:
    {
      discovery: {
        mdns: { mode: "full" },
      },
    }
    
  4. Zmienna środowiskowa (alternatywnie): ustaw OPENCLAW_DISABLE_BONJOUR=1, aby wyłączyć mDNS bez zmian w konfiguracji.
W trybie minimalnym Gateway nadal rozgłasza wystarczająco dużo dla wykrywania urządzeń (role, gatewayPort, transport), ale pomija cliPath i sshPort. Aplikacje, które potrzebują informacji o ścieżce CLI, mogą pobrać ją przez uwierzytelnione połączenie WebSocket.

0.5) Zablokuj WebSocket Gateway (lokalne uwierzytelnianie)

Uwierzytelnianie Gateway jest domyślnie wymagane. Jeśli nie skonfigurowano prawidłowej ścieżki uwierzytelniania gateway, Gateway odmawia połączeń WebSocket (fail‑closed). Onboarding domyślnie generuje token (nawet dla loopback), więc lokalni klienci muszą się uwierzytelnić. Ustaw token, aby wszyscy klienci WS musieli się uwierzytelnić:
{
  gateway: {
    auth: { mode: "token", token: "your-token" },
  },
}
Doctor może wygenerować go za Ciebie: openclaw doctor --generate-gateway-token. Uwaga: gateway.remote.token / .password to źródła poświadczeń klienta. One same w sobie nie chronią lokalnego dostępu WS. Lokalne ścieżki wywołań mogą używać gateway.remote.* jako fallbacku tylko wtedy, gdy gateway.auth.* nie jest ustawione. Jeśli gateway.auth.token / gateway.auth.password jest jawnie skonfigurowane przez SecretRef i pozostaje nierozstrzygnięte, rozstrzygnięcie kończy się bezpieczną odmową (bez maskującego fallbacku zdalnego). Opcjonalnie: przypnij zdalny TLS przez gateway.remote.tlsFingerprint przy użyciu wss://. Niezaszyfrowane ws:// jest domyślnie dozwolone tylko dla loopback. Dla zaufanych ścieżek w sieci prywatnej ustaw OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 w procesie klienta jako awaryjny wyjątek. Lokalne parowanie urządzeń:
  • Parowanie urządzeń jest automatycznie zatwierdzane dla bezpośrednich lokalnych połączeń loopback, aby zachować płynność klientów na tym samym hoście.
  • OpenClaw ma także wąską ścieżkę samołączenia backend/kontener lokalny dla zaufanych przepływów pomocniczych ze współdzielonym sekretem.
  • Połączenia tailnet i LAN, w tym bindy tailnet na tym samym hoście, są traktowane jako zdalne do celów parowania i nadal wymagają zatwierdzenia.
Tryby uwierzytelniania:
  • gateway.auth.mode: "token": współdzielony token bearer (zalecany dla większości konfiguracji).
  • gateway.auth.mode: "password": uwierzytelnianie hasłem (preferowane ustawienie przez env: OPENCLAW_GATEWAY_PASSWORD).
  • gateway.auth.mode: "trusted-proxy": zaufaj reverse proxy świadomemu tożsamości, aby uwierzytelniało użytkowników i przekazywało tożsamość w nagłówkach (zobacz Trusted Proxy Auth).
Lista kontrolna rotacji (token/hasło):
  1. Wygeneruj/ustaw nowy sekret (gateway.auth.token albo OPENCLAW_GATEWAY_PASSWORD).
  2. Uruchom ponownie Gateway (albo aplikację macOS, jeśli nadzoruje Gateway).
  3. Zaktualizuj wszystkie zdalne klienty (gateway.remote.token / .password na maszynach, które wywołują Gateway).
  4. Zweryfikuj, że stare poświadczenia nie pozwalają już na połączenie.

0.6) Nagłówki tożsamości Tailscale Serve

Gdy gateway.auth.allowTailscale ma wartość true (domyślnie dla Serve), OpenClaw akceptuje nagłówki tożsamości Tailscale Serve (tailscale-user-login) do uwierzytelniania Control UI/WebSocket. OpenClaw weryfikuje tożsamość, rozstrzygając adres x-forwarded-for przez lokalny demon Tailscale (tailscale whois) i dopasowując go do nagłówka. Jest to wyzwalane tylko dla żądań trafiających na loopback i zawierających x-forwarded-for, x-forwarded-proto oraz x-forwarded-host, zgodnie z nagłówkami wstrzykiwanymi przez Tailscale. Dla tej asynchronicznej ścieżki sprawdzania tożsamości nieudane próby dla tego samego {scope, ip} są serializowane, zanim limiter zapisze niepowodzenie. Równoległe błędne ponowienia od jednego klienta Serve mogą więc natychmiast zablokować drugą próbę, zamiast przepuścić je wyścigowo jako dwa zwykłe niedopasowania. Punkty końcowe HTTP API (na przykład /v1/*, /tools/invoke i /api/channels/*) nie używają uwierzytelniania nagłówkami tożsamości Tailscale. Nadal stosują skonfigurowany tryb uwierzytelniania HTTP gateway. Ważna uwaga o granicy:
  • Uwierzytelnianie bearer HTTP Gateway jest w praktyce dostępem operatorskim typu wszystko albo nic.
  • Traktuj poświadczenia, które mogą wywoływać /v1/chat/completions, /v1/responses lub /api/channels/*, jako pełnosekretne poświadczenia operatora dla tego gateway.
  • Na powierzchni HTTP zgodnej z OpenAI uwierzytelnianie bearer ze współdzielonym sekretem przywraca pełne domyślne zakresy operatora (operator.admin, operator.approvals, operator.pairing, operator.read, operator.talk.secrets, operator.write) i semantykę właściciela dla tur agenta; węższe wartości x-openclaw-scopes nie ograniczają tej ścieżki ze współdzielonym sekretem.
  • Semantyka zakresów per żądanie w HTTP ma zastosowanie tylko wtedy, gdy żądanie pochodzi z trybu niosącego tożsamość, takiego jak uwierzytelnianie trusted proxy albo gateway.auth.mode="none" na prywatnym wejściu.
  • W tych trybach niosących tożsamość pominięcie x-openclaw-scopes powoduje fallback do zwykłego domyślnego zestawu zakresów operatora; wysyłaj ten nagłówek jawnie, gdy chcesz węższego zestawu zakresów.
  • /tools/invoke stosuje tę samą regułę współdzielonego sekretu: uwierzytelnianie bearer tokenem/hasłem jest tam również traktowane jako pełny dostęp operatora, podczas gdy tryby niosące tożsamość nadal honorują zadeklarowane zakresy.
  • Nie udostępniaj tych poświadczeń niezaufanym wywołującym; preferuj osobne Gateway dla każdej granicy zaufania.
Założenie zaufania: uwierzytelnianie Serve bez tokena zakłada, że host gateway jest zaufany. Nie traktuj tego jako ochrony przed antagonistycznymi procesami działającymi na tym samym hoście. Jeśli na hoście gateway może działać niezaufany kod lokalny, wyłącz gateway.auth.allowTailscale i wymagaj jawnego uwierzytelniania współdzielonym sekretem przez gateway.auth.mode: "token" albo "password". Reguła bezpieczeństwa: nie przekazuj tych nagłówków ze swojego własnego reverse proxy. Jeśli kończysz TLS albo używasz proxy przed gateway, wyłącz gateway.auth.allowTailscale i użyj uwierzytelniania współdzielonym sekretem (gateway.auth.mode: "token" albo "password") albo Trusted Proxy Auth. Zaufane proxy:
  • Jeśli kończysz TLS przed Gateway, ustaw gateway.trustedProxies na adresy IP swojego proxy.
  • OpenClaw będzie ufać x-forwarded-for (albo x-real-ip) z tych adresów IP przy określaniu IP klienta dla lokalnych kontroli parowania i lokalnych kontroli HTTP auth.
  • Upewnij się, że Twoje proxy nadpisuje x-forwarded-for i blokuje bezpośredni dostęp do portu Gateway.
Zobacz Tailscale i Przegląd Web.

0.6.1) Sterowanie przeglądarką przez host Node (zalecane)

Jeśli Twój Gateway jest zdalny, ale przeglądarka działa na innej maszynie, uruchom host Node na maszynie z przeglądarką i pozwól Gateway przekazywać działania przeglądarki dalej (zobacz Narzędzie browser). Traktuj parowanie Node jak dostęp administracyjny. Zalecany wzorzec:
  • Utrzymuj Gateway i host Node w tym samym tailnet (Tailscale).
  • Sparuj Node świadomie; wyłącz routing proxy przeglądarki, jeśli go nie potrzebujesz.
Unikaj:
  • Wystawiania portów przekaźnika/sterowania do LAN albo publicznego Internetu.
  • Tailscale Funnel dla punktów końcowych sterowania przeglądarką (publiczna ekspozycja).

0.7) Sekrety na dysku (dane wrażliwe)

Zakładaj, że wszystko pod ~/.openclaw/ (albo $OPENCLAW_STATE_DIR/) może zawierać sekrety albo dane prywatne:
  • openclaw.json: konfiguracja może zawierać tokeny (gateway, zdalny gateway), ustawienia dostawców i allowlisty.
  • credentials/**: poświadczenia kanałów (przykład: poświadczenia WhatsApp), allowlisty parowania, starsze importy OAuth.
  • agents/<agentId>/agent/auth-profiles.json: klucze API, profile tokenów, tokeny OAuth oraz opcjonalne keyRef/tokenRef.
  • secrets.json (opcjonalnie): ładunek sekretów oparty na pliku używany przez dostawców SecretRef typu file (secrets.providers).
  • agents/<agentId>/agent/auth.json: starszy plik zgodności. Statyczne wpisy api_key są czyszczone po wykryciu.
  • agents/<agentId>/sessions/**: transkrypcje sesji (*.jsonl) + metadane routingu (sessions.json), które mogą zawierać prywatne wiadomości i wyniki narzędzi.
  • pakiety dołączonych Pluginów: zainstalowane Plugins (wraz z ich node_modules/).
  • sandboxes/**: obszary robocze sandboxów narzędzi; mogą gromadzić kopie plików odczytywanych/zapisywanych w sandboxie.
Wskazówki dotyczące utwardzania:
  • Utrzymuj ścisłe uprawnienia (700 dla katalogów, 600 dla plików).
  • Używaj pełnego szyfrowania dysku na hoście gateway.
  • Jeśli host jest współdzielony, preferuj dedykowane konto użytkownika OS dla Gateway.

0.8) Pliki .env obszaru roboczego

OpenClaw ładuje lokalne dla obszaru roboczego pliki .env dla agentów i narzędzi, ale nigdy nie pozwala, aby te pliki po cichu nadpisywały kontrolki runtime gateway.
  • Każdy klucz zaczynający się od OPENCLAW_* jest blokowany w niezaufanych plikach .env obszaru roboczego.
  • Blokada działa w trybie fail-closed: nowa zmienna kontroli runtime dodana w przyszłej wersji nie może zostać odziedziczona z pliku .env zatwierdzonego do repo albo dostarczonego przez atakującego; klucz jest ignorowany, a gateway zachowuje własną wartość.
  • Zaufane zmienne środowiskowe procesu/OS (własna powłoka gateway, jednostka launchd/systemd, pakiet aplikacji) nadal obowiązują — to ograniczenie dotyczy wyłącznie ładowania plików .env.
Dlaczego: pliki .env obszaru roboczego często leżą obok kodu agenta, bywają przypadkowo commitowane albo zapisywane przez narzędzia. Blokowanie całego prefiksu OPENCLAW_* oznacza, że późniejsze dodanie nowej flagi OPENCLAW_* nigdy nie może cofnąć się do cichego dziedziczenia ze stanu obszaru roboczego.

0.9) Logi + transkrypcje (redakcja + retencja)

Logi i transkrypcje mogą ujawniać wrażliwe informacje, nawet gdy kontrola dostępu jest poprawna:
  • Logi Gateway mogą zawierać podsumowania narzędzi, błędy i adresy URL.
  • Transkrypcje sesji mogą zawierać wklejone sekrety, zawartość plików, wyniki poleceń i linki.
Zalecenia:
  • Utrzymuj redakcję podsumowań narzędzi włączoną (logging.redactSensitive: "tools"; domyślnie).
  • Dodawaj własne wzorce dla swojego środowiska przez logging.redactPatterns (tokeny, nazwy hostów, wewnętrzne URL).
  • Przy udostępnianiu diagnostyki preferuj openclaw status --all (nadające się do wklejenia, sekrety zredagowane) zamiast surowych logów.
  • Usuwaj stare transkrypcje sesji i pliki logów, jeśli nie potrzebujesz długiej retencji.
Szczegóły: Logowanie

1) DM: domyślnie pairing

{
  channels: { whatsapp: { dmPolicy: "pairing" } },
}

2) Grupy: wszędzie wymagaj wzmianki

{
  "channels": {
    "whatsapp": {
      "groups": {
        "*": { "requireMention": true }
      }
    }
  },
  "agents": {
    "list": [
      {
        "id": "main",
        "groupChat": { "mentionPatterns": ["@openclaw", "@mybot"] }
      }
    ]
  }
}
W czatach grupowych odpowiadaj tylko po jawnej wzmiance.

3) Oddzielne numery (WhatsApp, Signal, Telegram)

Dla kanałów opartych na numerach telefonów rozważ uruchamianie AI na oddzielnym numerze telefonu niż Twój osobisty:
  • Numer osobisty: Twoje rozmowy pozostają prywatne
  • Numer bota: AI obsługuje te rozmowy, z odpowiednimi granicami

4) Tryb tylko do odczytu (przez sandbox + narzędzia)

Możesz zbudować profil tylko do odczytu, łącząc:
  • agents.defaults.sandbox.workspaceAccess: "ro" (albo "none" bez dostępu do obszaru roboczego)
  • allowlisty/listy deny narzędzi blokujące write, edit, apply_patch, exec, process itp.
Dodatkowe opcje utwardzania:
  • tools.exec.applyPatch.workspaceOnly: true (domyślnie): zapewnia, że apply_patch nie może zapisywać/usuwać poza katalogiem obszaru roboczego nawet przy wyłączonym sandboxingu. Ustaw false tylko wtedy, gdy świadomie chcesz, aby apply_patch dotykało plików poza obszarem roboczym.
  • tools.fs.workspaceOnly: true (opcjonalnie): ogranicza ścieżki read/write/edit/apply_patch i natywne ścieżki automatycznego ładowania obrazów w promptach do katalogu obszaru roboczego (przydatne, jeśli dziś zezwalasz na ścieżki bezwzględne i chcesz jednej bariery ochronnej).
  • Utrzymuj wąskie katalogi główne systemu plików: unikaj szerokich katalogów, takich jak katalog domowy, dla obszarów roboczych agentów/obszarów roboczych sandboxów. Szerokie katalogi główne mogą ujawniać wrażliwe lokalne pliki (na przykład stan/konfigurację pod ~/.openclaw) narzędziom systemu plików.

5) Bezpieczna baza (kopiuj/wklej)

Jedna „bezpieczna domyślna” konfiguracja, która utrzymuje Gateway jako prywatny, wymaga parowania DM i unika botów grupowych działających zawsze:
{
  gateway: {
    mode: "local",
    bind: "loopback",
    port: 18789,
    auth: { mode: "token", token: "your-long-random-token" },
  },
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
Jeśli chcesz też „bezpieczniejszego domyślnie” wykonywania narzędzi, dodaj sandbox + zablokuj niebezpieczne narzędzia dla każdego agenta niebędącego właścicielem (przykład poniżej w sekcji „Profile dostępu per agent”). Wbudowana baza dla tur agentów sterowanych czatem: nadawcy niebędący właścicielem nie mogą używać narzędzi cron ani gateway.

Sandboxing (zalecane)

Osobny dokument: Sandboxing Dwa uzupełniające się podejścia:
  • Uruchom cały Gateway w Docker (granica kontenera): Docker
  • Sandbox narzędzi (agents.defaults.sandbox, host gateway + narzędzia izolowane przez sandbox; Docker jest domyślnym backendem): Sandboxing
Uwaga: aby zapobiec dostępowi między agentami, utrzymuj agents.defaults.sandbox.scope na "agent" (domyślnie) albo "session" dla ostrzejszej izolacji per sesja. scope: "shared" używa jednego kontenera/obszaru roboczego. Rozważ też dostęp agenta do obszaru roboczego wewnątrz sandboxa:
  • agents.defaults.sandbox.workspaceAccess: "none" (domyślnie) utrzymuje obszar roboczy agenta poza zasięgiem; narzędzia działają na obszarze roboczym sandboxa pod ~/.openclaw/sandboxes
  • agents.defaults.sandbox.workspaceAccess: "ro" montuje obszar roboczy agenta jako tylko do odczytu pod /agent (wyłącza write/edit/apply_patch)
  • agents.defaults.sandbox.workspaceAccess: "rw" montuje obszar roboczy agenta do odczytu i zapisu pod /workspace
  • Dodatkowe sandbox.docker.binds są walidowane względem znormalizowanych i kanonizowanych ścieżek źródłowych. Sztuczki z nadrzędnymi symlinkami i kanonicznymi aliasami katalogu domowego nadal kończą się bezpieczną odmową, jeśli rozstrzygają się do zablokowanych katalogów głównych, takich jak /etc, /var/run albo katalogi poświadczeń pod katalogiem domowym OS.
Ważne: tools.elevated to globalna furtka bazowa, która uruchamia exec poza sandboxem. Efektywnym hostem jest domyślnie gateway, albo node, gdy cel exec jest skonfigurowany jako node. Utrzymuj tools.elevated.allowFrom w ścisłym zakresie i nie włączaj tego dla obcych. Możesz dalej ograniczyć tryb podwyższony per agent przez agents.list[].tools.elevated. Zobacz Tryb Elevated.

Bariera ochronna delegacji sub-agentów

Jeśli zezwalasz na narzędzia sesji, traktuj delegowane uruchomienia sub-agentów jako kolejną decyzję graniczną:
  • Blokuj sessions_spawn, chyba że agent naprawdę potrzebuje delegacji.
  • Utrzymuj agents.defaults.subagents.allowAgents oraz wszelkie nadpisania per agent agents.list[].subagents.allowAgents ograniczone do znanych bezpiecznych agentów docelowych.
  • Dla każdego przepływu, który musi pozostać w sandboxie, wywołuj sessions_spawn z sandbox: "require" (domyślnie jest inherit).
  • sandbox: "require" kończy się szybką odmową, gdy docelowy runtime potomny nie jest objęty sandboxem.

Ryzyka sterowania przeglądarką

Włączenie sterowania przeglądarką daje modelowi możliwość sterowania prawdziwą przeglądarką. Jeśli profil tej przeglądarki zawiera już zalogowane sesje, model może uzyskać dostęp do tych kont i danych. Traktuj profile przeglądarki jako stan wrażliwy:
  • Preferuj dedykowany profil dla agenta (domyślny profil openclaw).
  • Unikaj kierowania agenta do swojego osobistego profilu codziennego użytkowania.
  • Pozostawiaj sterowanie przeglądarką hosta wyłączone dla agentów w sandboxie, chyba że im ufasz.
  • Samodzielne API sterowania przeglądarką na loopback honoruje wyłącznie uwierzytelnianie współdzielonym sekretem (uwierzytelnianie bearer tokenem gateway albo hasłem gateway). Nie korzysta z nagłówków tożsamości trusted proxy ani Tailscale Serve.
  • Traktuj pobrania przeglądarki jako niezaufane wejście; preferuj izolowany katalog pobrań.
  • Jeśli to możliwe, wyłącz synchronizację przeglądarki/menedżery haseł w profilu agenta (zmniejsza promień rażenia).
  • Dla zdalnych Gateway zakładaj, że „sterowanie przeglądarką” jest równoważne „dostępowi operatora” do wszystkiego, do czego ten profil ma dostęp.
  • Utrzymuj Gateway i hosty Node tylko w tailnet; unikaj wystawiania portów sterowania przeglądarką do LAN albo publicznego Internetu.
  • Wyłącz routing proxy przeglądarki, gdy go nie potrzebujesz (gateway.nodes.browser.mode="off").
  • Tryb istniejącej sesji Chrome MCP nie jest „bezpieczniejszy”; może działać jako Ty wszędzie tam, gdzie ten profil Chrome hosta ma dostęp.

Polityka SSRF przeglądarki (domyślnie rygorystyczna)

Polityka nawigacji przeglądarki w OpenClaw jest domyślnie rygorystyczna: prywatne/wewnętrzne cele pozostają zablokowane, chyba że jawnie się zgodzisz.
  • Domyślnie: browser.ssrfPolicy.dangerouslyAllowPrivateNetwork nie jest ustawione, więc nawigacja przeglądarki utrzymuje blokadę prywatnych/wewnętrznych/specjalnych adresów docelowych.
  • Starszy alias: browser.ssrfPolicy.allowPrivateNetwork nadal jest akceptowany dla zgodności.
  • Tryb opt-in: ustaw browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true, aby dopuścić prywatne/wewnętrzne/specjalne adresy docelowe.
  • W trybie rygorystycznym używaj hostnameAllowlist (wzorce takie jak *.example.com) oraz allowedHostnames (dokładne wyjątki hostów, w tym zablokowane nazwy takie jak localhost) dla jawnych wyjątków.
  • Nawigacja jest sprawdzana przed żądaniem i ponownie sprawdzana w trybie best-effort względem końcowego URL http(s) po nawigacji, aby ograniczyć pivoty oparte na przekierowaniach.
Przykład polityki rygorystycznej:
{
  browser: {
    ssrfPolicy: {
      dangerouslyAllowPrivateNetwork: false,
      hostnameAllowlist: ["*.example.com", "example.com"],
      allowedHostnames: ["localhost"],
    },
  },
}

Profile dostępu per agent (multi-agent)

Przy routingu multi-agent każdy agent może mieć własny sandbox + politykę narzędzi: używaj tego, aby przydzielić pełny dostęp, tylko do odczytu albo brak dostępu per agent. Pełne szczegóły i reguły pierwszeństwa znajdziesz w Sandboxing i narzędzia Multi-Agent. Typowe przypadki użycia:
  • Agent osobisty: pełny dostęp, bez sandboxa
  • Agent rodzinny/służbowy: sandbox + narzędzia tylko do odczytu
  • Agent publiczny: sandbox + brak narzędzi systemu plików/powłoki

Przykład: pełny dostęp (bez sandboxa)

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

Przykład: narzędzia tylko do odczytu + obszar roboczy tylko do odczytu

{
  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"],
        },
      },
    ],
  },
}

Przykład: brak dostępu do systemu plików/powłoki (dozwolone wiadomości dostawcy)

{
  agents: {
    list: [
      {
        id: "public",
        workspace: "~/.openclaw/workspace-public",
        sandbox: {
          mode: "all",
          scope: "agent",
          workspaceAccess: "none",
        },
        // Narzędzia sesji mogą ujawniać wrażliwe dane z transkrypcji. Domyślnie OpenClaw ogranicza te narzędzia
        // do bieżącej sesji + sesji uruchomionych sub-agentów, ale w razie potrzeby możesz zaostrzyć to jeszcze bardziej.
        // Zobacz `tools.sessions.visibility` w dokumentacji konfiguracji.
        tools: {
          sessions: { visibility: "tree" }, // self | tree | agent | all
          allow: [
            "sessions_list",
            "sessions_history",
            "sessions_send",
            "sessions_spawn",
            "session_status",
            "whatsapp",
            "telegram",
            "slack",
            "discord",
          ],
          deny: [
            "read",
            "write",
            "edit",
            "apply_patch",
            "exec",
            "process",
            "browser",
            "canvas",
            "nodes",
            "cron",
            "gateway",
            "image",
          ],
        },
      },
    ],
  },
}

Co powiedzieć swojemu AI

Uwzględnij wskazówki bezpieczeństwa w system prompt agenta:
## Reguły bezpieczeństwa
- Nigdy nie udostępniaj nieznajomym listingów katalogów ani ścieżek plików
- Nigdy nie ujawniaj kluczy API, poświadczeń ani szczegółów infrastruktury
- Weryfikuj z właścicielem żądania modyfikujące konfigurację systemu
- W razie wątpliwości zapytaj przed działaniem
- Zachowuj prywatność prywatnych danych, chyba że zostało to jawnie autoryzowane

Reagowanie na incydenty

Jeśli Twoje AI zrobi coś złego:

Ogranicz skutki

  1. Zatrzymaj je: zatrzymaj aplikację macOS (jeśli nadzoruje Gateway) albo zakończ proces openclaw gateway.
  2. Zamknij ekspozycję: ustaw gateway.bind: "loopback" (albo wyłącz Tailscale Funnel/Serve), dopóki nie zrozumiesz, co się stało.
  3. Zamroź dostęp: przełącz ryzykowne DM/grupy na dmPolicy: "disabled" / wymaganie wzmianek i usuń wpisy zezwalające na wszystko "*", jeśli były używane.

Rotuj (zakładaj kompromitację, jeśli wyciekły sekrety)

  1. Zrotuj uwierzytelnianie Gateway (gateway.auth.token / OPENCLAW_GATEWAY_PASSWORD) i uruchom ponownie.
  2. Zrotuj sekrety zdalnych klientów (gateway.remote.token / .password) na każdej maszynie, która może wywoływać Gateway.
  3. Zrotuj poświadczenia dostawców/API (poświadczenia WhatsApp, tokeny Slack/Discord, klucze modeli/API w auth-profiles.json oraz zaszyfrowane wartości ładunków sekretów, jeśli są używane).

Audyt

  1. Sprawdź logi Gateway: /tmp/openclaw/openclaw-YYYY-MM-DD.log (albo logging.file).
  2. Przejrzyj odpowiednie transkrypcje: ~/.openclaw/agents/<agentId>/sessions/*.jsonl.
  3. Przejrzyj ostatnie zmiany konfiguracji (wszystko, co mogło poszerzyć dostęp: gateway.bind, gateway.auth, zasady dm/group, tools.elevated, zmiany Pluginów).
  4. Uruchom ponownie openclaw security audit --deep i potwierdź, że ustalenia krytyczne zostały naprawione.

Zbierz materiały do zgłoszenia

  • Znacznik czasu, system operacyjny hosta gateway + wersja OpenClaw
  • Transkrypcje sesji + krótki ogon logu (po redakcji)
  • Co wysłał atakujący + co zrobił agent
  • Czy Gateway był wystawiony poza loopback (LAN/Tailscale Funnel/Serve)

Skanowanie sekretów (detect-secrets)

CI uruchamia hook pre-commit detect-secrets w zadaniu secrets. Wypychanie do main zawsze uruchamia skan wszystkich plików. Pull requesty używają szybkiej ścieżki dla zmienionych plików, gdy dostępny jest commit bazowy, a w przeciwnym razie wracają do skanowania wszystkich plików. Jeśli to się nie powiedzie, oznacza to nowe kandydaty, których nie ma jeszcze w bazie.

Jeśli CI się nie powiedzie

  1. Odtwórz lokalnie:
    pre-commit run --all-files detect-secrets
    
  2. Zrozum narzędzia:
    • detect-secrets w pre-commit uruchamia detect-secrets-hook z bazą i wykluczeniami repozytorium.
    • detect-secrets audit otwiera interaktywny przegląd, aby oznaczyć każdy element bazy jako prawdziwy sekret albo false positive.
  3. Dla prawdziwych sekretów: zrotuj/usuń je, a następnie uruchom skan ponownie, aby zaktualizować bazę.
  4. Dla false positive: uruchom interaktywny audyt i oznacz je jako fałszywe:
    detect-secrets audit .secrets.baseline
    
  5. Jeśli potrzebujesz nowych wykluczeń, dodaj je do .detect-secrets.cfg i zregeneruj bazę z odpowiadającymi flagami --exclude-files / --exclude-lines (plik konfiguracyjny służy tylko jako odniesienie; detect-secrets nie odczytuje go automatycznie).
Zacommituj zaktualizowany .secrets.baseline, gdy będzie już odzwierciedlać zamierzony stan.

Zgłaszanie problemów bezpieczeństwa

Znalazłeś podatność w OpenClaw? Zgłoś ją odpowiedzialnie:
  1. E-mail: security@openclaw.ai
  2. Nie publikuj publicznie do czasu naprawy
  3. Udzielimy Ci uznania (chyba że wolisz anonimowość)