Langsung ke konten utama

Keamanan

Model kepercayaan asisten pribadi: panduan ini mengasumsikan satu batas operator tepercaya per gateway (model pengguna tunggal/asisten pribadi). OpenClaw bukan batas keamanan multi-tenant yang bermusuhan untuk beberapa pengguna yang saling berlawanan yang berbagi satu agen/gateway. Jika Anda memerlukan operasi dengan kepercayaan campuran atau pengguna yang bersifat adversarial, pisahkan batas kepercayaan (gateway + kredensial terpisah, idealnya pengguna/host OS terpisah).
Di halaman ini: Model kepercayaan | Audit cepat | Baseline yang diperketat | Model akses DM | Pengerasan konfigurasi | Respons insiden

Tentukan cakupan lebih dulu: model keamanan asisten pribadi

Panduan keamanan OpenClaw mengasumsikan deployment asisten pribadi: satu batas operator tepercaya, berpotensi banyak agen.
  • Postur keamanan yang didukung: satu pengguna/batas kepercayaan per gateway (lebih baik satu pengguna OS/host/VPS per batas).
  • Bukan batas keamanan yang didukung: satu gateway/agen bersama yang digunakan oleh pengguna yang saling tidak tepercaya atau bersifat adversarial.
  • Jika isolasi pengguna adversarial diperlukan, pisahkan berdasarkan batas kepercayaan (gateway + kredensial terpisah, dan idealnya pengguna/host OS terpisah).
  • Jika beberapa pengguna yang tidak tepercaya dapat mengirim pesan ke satu agen yang mendukung tool, anggap mereka berbagi otoritas tool terdelegasi yang sama untuk agen tersebut.
Halaman ini menjelaskan pengerasan di dalam model tersebut. Halaman ini tidak mengklaim adanya isolasi multi-tenant yang bermusuhan pada satu gateway bersama.

Pemeriksaan cepat: openclaw security audit

Lihat juga: Verifikasi Formal (Model Keamanan) Jalankan ini secara rutin (terutama setelah mengubah konfigurasi atau mengekspos permukaan jaringan):
openclaw security audit
openclaw security audit --deep
openclaw security audit --fix
openclaw security audit --json
security audit --fix sengaja dibuat sempit cakupannya: ini mengubah kebijakan grup terbuka yang umum menjadi allowlist, memulihkan logging.redactSensitive: "tools", memperketat izin state/config/include-file, dan menggunakan reset ACL Windows alih-alih POSIX chmod saat berjalan di Windows. Ini menandai footgun umum (paparan autentikasi Gateway, paparan kontrol browser, allowlist yang ditinggikan, izin filesystem, persetujuan exec yang permisif, dan paparan tool kanal terbuka). OpenClaw adalah produk sekaligus eksperimen: Anda menghubungkan perilaku model frontier ke permukaan pesan nyata dan tool nyata. Tidak ada penyiapan yang “sepenuhnya aman”. Tujuannya adalah bersikap sengaja dan cermat mengenai:
  • siapa yang dapat berbicara dengan bot Anda
  • di mana bot diizinkan bertindak
  • apa yang dapat disentuh bot
Mulailah dengan akses sekecil mungkin yang masih berfungsi, lalu perluas seiring bertambahnya kepercayaan Anda.

Deployment dan kepercayaan host

OpenClaw mengasumsikan batas host dan konfigurasi tepercaya:
  • Jika seseorang dapat mengubah state/config host Gateway (~/.openclaw, termasuk openclaw.json), anggap mereka sebagai operator tepercaya.
  • Menjalankan satu Gateway untuk beberapa operator yang saling tidak tepercaya/adversarial bukan penyiapan yang direkomendasikan.
  • Untuk tim dengan kepercayaan campuran, pisahkan batas kepercayaan dengan gateway terpisah (atau minimal pengguna/host OS terpisah).
  • Default yang direkomendasikan: satu pengguna per mesin/host (atau VPS), satu gateway untuk pengguna itu, dan satu atau lebih agen di gateway tersebut.
  • Di dalam satu instance Gateway, akses operator terautentikasi adalah peran control-plane tepercaya, bukan peran tenant per pengguna.
  • Pengidentifikasi sesi (sessionKey, ID sesi, label) adalah pemilih routing, bukan token otorisasi.
  • Jika beberapa orang dapat mengirim pesan ke satu agen yang mendukung tool, masing-masing dari mereka dapat mengarahkan set izin yang sama tersebut. Isolasi sesi/memori per pengguna membantu privasi, tetapi tidak mengubah agen bersama menjadi otorisasi host per pengguna.

Workspace Slack bersama: risiko nyata

Jika “semua orang di Slack bisa mengirim pesan ke bot,” risiko utamanya adalah otoritas tool yang didelegasikan:
  • pengirim mana pun yang diizinkan dapat memicu panggilan tool (exec, browser, tool jaringan/file) dalam kebijakan agen;
  • injeksi prompt/konten dari satu pengirim dapat menyebabkan tindakan yang memengaruhi state, perangkat, atau output bersama;
  • jika satu agen bersama memiliki kredensial/file sensitif, pengirim mana pun yang diizinkan berpotensi mendorong eksfiltrasi melalui penggunaan tool.
Gunakan agen/gateway terpisah dengan tool minimal untuk alur kerja tim; jaga agar agen data pribadi tetap privat.

Agen bersama perusahaan: pola yang dapat diterima

Ini dapat diterima ketika semua orang yang menggunakan agen tersebut berada dalam batas kepercayaan yang sama (misalnya satu tim perusahaan) dan agen dibatasi secara ketat untuk urusan bisnis.
  • jalankan di mesin/VM/container khusus;
  • gunakan pengguna OS + browser/profile/akun khusus untuk runtime tersebut;
  • jangan masuk ke akun Apple/Google pribadi atau profile browser/password manager pribadi pada runtime tersebut.
Jika Anda mencampur identitas pribadi dan perusahaan pada runtime yang sama, Anda meruntuhkan pemisahan dan meningkatkan risiko paparan data pribadi.

Konsep kepercayaan gateway dan node

Perlakukan Gateway dan node sebagai satu domain kepercayaan operator, dengan peran berbeda:
  • Gateway adalah control plane dan permukaan kebijakan (gateway.auth, kebijakan tool, routing).
  • Node adalah permukaan eksekusi jarak jauh yang dipasangkan ke Gateway tersebut (perintah, tindakan perangkat, kemampuan lokal host).
  • Pemanggil yang terautentikasi ke Gateway dipercaya pada cakupan Gateway. Setelah pairing, tindakan node adalah tindakan operator tepercaya pada node tersebut.
  • sessionKey adalah pemilihan routing/konteks, bukan autentikasi per pengguna.
  • Persetujuan exec (allowlist + ask) adalah guardrail untuk niat operator, bukan isolasi multi-tenant yang bermusuhan.
  • Default produk OpenClaw untuk penyiapan operator tepercaya tunggal adalah exec host pada gateway/node diizinkan tanpa prompt persetujuan (security="full", ask="off" kecuali Anda memperketatnya). Default itu disengaja untuk UX, bukan kerentanan dengan sendirinya.
  • Persetujuan exec mengikat konteks permintaan yang tepat dan best-effort operand file lokal langsung; ini tidak memodelkan secara semantik setiap jalur loader runtime/interpreter. Gunakan sandboxing dan isolasi host untuk batas yang kuat.
Jika Anda memerlukan isolasi pengguna yang bermusuhan, pisahkan batas kepercayaan berdasarkan pengguna/host OS dan jalankan gateway terpisah.

Matriks batas kepercayaan

Gunakan ini sebagai model cepat saat menilai risiko:
Batas atau kontrolArtinyaSalah tafsir yang umum
gateway.auth (token/password/trusted-proxy/device auth)Mengautentikasi pemanggil ke API gateway“Harus ada tanda tangan per pesan di setiap frame agar aman”
sessionKeyKunci routing untuk pemilihan konteks/sesi“Kunci sesi adalah batas autentikasi pengguna”
Guardrail prompt/kontenMengurangi risiko penyalahgunaan model“Injeksi prompt saja membuktikan bypass autentikasi”
canvas.eval / browser evaluateKapabilitas operator yang disengaja saat diaktifkan“Setiap primitive JS eval otomatis menjadi vuln dalam model kepercayaan ini”
Shell ! TUI lokalEksekusi lokal yang dipicu operator secara eksplisit“Perintah praktis shell lokal adalah injeksi jarak jauh”
Pairing node dan perintah nodeEksekusi jarak jauh tingkat operator pada perangkat yang dipasangkan“Kontrol perangkat jarak jauh harus dianggap sebagai akses pengguna tak tepercaya secara default”

Bukan kerentanan secara desain

Pola-pola ini sering dilaporkan dan biasanya ditutup tanpa tindakan kecuali ditunjukkan bypass batas yang nyata:
  • Rantai berbasis injeksi prompt saja tanpa bypass kebijakan/autentikasi/sandbox.
  • Klaim yang mengasumsikan operasi multi-tenant bermusuhan pada satu host/config bersama.
  • Klaim yang mengklasifikasikan akses jalur baca operator normal (misalnya sessions.list/sessions.preview/chat.history) sebagai IDOR dalam penyiapan gateway bersama.
  • Temuan deployment localhost-only (misalnya HSTS pada gateway loopback-only).
  • Temuan tanda tangan webhook masuk Discord untuk jalur masuk yang tidak ada di repo ini.
  • Laporan yang memperlakukan metadata pairing node sebagai lapisan persetujuan tersembunyi kedua per perintah untuk system.run, padahal batas eksekusi yang sebenarnya tetap kebijakan perintah node global gateway ditambah persetujuan exec node sendiri.
  • Temuan “otorisasi per pengguna hilang” yang memperlakukan sessionKey sebagai token autentikasi.

Checklist prapenerbangan peneliti

Sebelum membuka GHSA, verifikasi semua ini:
  1. Reproduksi masih berfungsi pada main terbaru atau rilis terbaru.
  2. Laporan menyertakan jalur kode yang tepat (file, fungsi, rentang baris) dan versi/commit yang diuji.
  3. Dampak melintasi batas kepercayaan yang terdokumentasi (bukan sekadar injeksi prompt).
  4. Klaim tidak tercantum di Out of Scope.
  5. Advisory yang ada telah diperiksa untuk duplikasi (gunakan kembali GHSA kanonis bila berlaku).
  6. Asumsi deployment dibuat eksplisit (loopback/lokal vs terekspos, operator tepercaya vs tak tepercaya).

Baseline yang diperketat dalam 60 detik

Gunakan baseline ini terlebih dahulu, lalu aktifkan kembali tool secara selektif per agen tepercaya:
{
  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 } } },
  },
}
Ini menjaga Gateway tetap lokal-only, mengisolasi DM, dan menonaktifkan tool control-plane/runtime secara default.

Aturan cepat inbox bersama

Jika lebih dari satu orang dapat DM bot Anda:
  • Setel session.dmScope: "per-channel-peer" (atau "per-account-channel-peer" untuk channel multi-akun).
  • Pertahankan dmPolicy: "pairing" atau allowlist yang ketat.
  • Jangan pernah menggabungkan DM bersama dengan akses tool yang luas.
  • Ini memperkeras inbox kooperatif/bersama, tetapi tidak dirancang sebagai isolasi co-tenant yang bermusuhan ketika pengguna berbagi akses tulis host/config.

Model visibilitas konteks

OpenClaw memisahkan dua konsep:
  • Otorisasi pemicu: siapa yang dapat memicu agen (dmPolicy, groupPolicy, allowlist, mention gate).
  • Visibilitas konteks: konteks tambahan apa yang disuntikkan ke input model (isi balasan, teks kutipan, riwayat thread, metadata yang diteruskan).
Allowlists mengatur pemicu dan otorisasi perintah. Pengaturan contextVisibility mengontrol bagaimana konteks tambahan (balasan kutipan, root thread, riwayat yang diambil) difilter:
  • contextVisibility: "all" (default) mempertahankan konteks tambahan sebagaimana diterima.
  • contextVisibility: "allowlist" memfilter konteks tambahan ke pengirim yang diizinkan oleh pemeriksaan allowlist aktif.
  • contextVisibility: "allowlist_quote" berperilaku seperti allowlist, tetapi tetap mempertahankan satu balasan kutipan eksplisit.
Setel contextVisibility per channel atau per room/percakapan. Lihat Percakapan Grup untuk detail penyiapan. Panduan triase advisory:
  • Klaim yang hanya menunjukkan “model dapat melihat teks kutipan atau historis dari pengirim yang tidak di-allowlist” adalah temuan pengerasan yang dapat ditangani dengan contextVisibility, bukan bypass batas autentikasi atau sandbox dengan sendirinya.
  • Agar berdampak keamanan, laporan tetap perlu menunjukkan bypass batas kepercayaan yang nyata (autentikasi, kebijakan, sandbox, persetujuan, atau batas terdokumentasi lain).

Yang diperiksa audit (gambaran umum)

  • Akses masuk (kebijakan DM, kebijakan grup, allowlist): apakah orang asing bisa memicu bot?
  • Radius ledakan tool (tool yang ditinggikan + room terbuka): bisakah injeksi prompt berubah menjadi tindakan shell/file/jaringan?
  • Pergeseran persetujuan exec (security=full, autoAllowSkills, allowlist interpreter tanpa strictInlineEval): apakah guardrail host-exec masih melakukan yang Anda kira?
    • security="full" adalah peringatan postur yang luas, bukan bukti adanya bug. Ini adalah default yang dipilih untuk penyiapan asisten pribadi tepercaya; perketat hanya jika model ancaman Anda memerlukan guardrail persetujuan atau allowlist.
  • Paparan jaringan (bind/auth Gateway, Tailscale Serve/Funnel, token autentikasi lemah/pendek).
  • Paparan kontrol browser (node jarak jauh, port relay, endpoint CDP jarak jauh).
  • Kebersihan disk lokal (izin, symlink, include konfigurasi, jalur “folder tersinkronisasi”).
  • Plugins (extension ada tanpa allowlist eksplisit).
  • Pergeseran kebijakan/miskonfigurasi (pengaturan sandbox docker dikonfigurasi tetapi mode sandbox mati; pola gateway.nodes.denyCommands yang tidak efektif karena pencocokan hanya nama perintah yang persis, misalnya system.run, dan tidak memeriksa teks shell; entri gateway.nodes.allowCommands yang berbahaya; tools.profile="minimal" global dioverride oleh profil per agen; tool plugin extension dapat dijangkau di bawah kebijakan tool yang permisif).
  • Pergeseran ekspektasi runtime (misalnya mengasumsikan exec implisit masih berarti sandbox ketika tools.exec.host sekarang default ke auto, atau secara eksplisit menetapkan tools.exec.host="sandbox" saat mode sandbox mati).
  • Kebersihan model (peringatan ketika model yang dikonfigurasi tampak lawas; bukan pemblokiran keras).
Jika Anda menjalankan --deep, OpenClaw juga mencoba probe Gateway live dengan best-effort.

Peta penyimpanan kredensial

Gunakan ini saat mengaudit akses atau menentukan apa yang perlu dicadangkan:
  • WhatsApp: ~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • Token bot Telegram: config/env atau channels.telegram.tokenFile (hanya file biasa; symlink ditolak)
  • Token bot Discord: config/env atau SecretRef (penyedia env/file/exec)
  • Token Slack: config/env (channels.slack.*)
  • Allowlist pairing:
    • ~/.openclaw/credentials/<channel>-allowFrom.json (akun default)
    • ~/.openclaw/credentials/<channel>-<accountId>-allowFrom.json (akun non-default)
  • Profil autentikasi model: ~/.openclaw/agents/<agentId>/agent/auth-profiles.json
  • Payload rahasia berbasis file (opsional): ~/.openclaw/secrets.json
  • Impor OAuth lama: ~/.openclaw/credentials/oauth.json

Checklist audit keamanan

Ketika audit mencetak temuan, perlakukan ini sebagai urutan prioritas:
  1. Apa pun yang “open” + tool aktif: kunci dulu DM/grup (pairing/allowlist), lalu perketat kebijakan tool/sandboxing.
  2. Paparan jaringan publik (bind LAN, Funnel, autentikasi hilang): perbaiki segera.
  3. Paparan jarak jauh kontrol browser: perlakukan seperti akses operator (hanya tailnet, pair node dengan sengaja, hindari paparan publik).
  4. Izin: pastikan state/config/credentials/auth tidak dapat dibaca grup/dunia.
  5. Plugin/extension: muat hanya yang Anda percayai secara eksplisit.
  6. Pemilihan model: utamakan model modern yang diperkeras instruksi untuk bot mana pun yang memiliki tool.

Glosarium audit keamanan

Nilai checkId dengan sinyal tinggi yang paling mungkin Anda lihat pada deployment nyata (tidak lengkap):
checkIdKeparahanMengapa pentingKunci/jalur perbaikan utamaPerbaikan otomatis
fs.state_dir.perms_world_writablecriticalPengguna/proses lain dapat mengubah seluruh state OpenClawizin filesystem pada ~/.openclawya
fs.state_dir.perms_group_writablewarnPengguna grup dapat mengubah seluruh state OpenClawizin filesystem pada ~/.openclawya
fs.state_dir.perms_readablewarnDirektori state dapat dibaca orang lainizin filesystem pada ~/.openclawya
fs.state_dir.symlinkwarnTarget direktori state menjadi batas kepercayaan laintata letak filesystem direktori statetidak
fs.config.perms_writablecriticalOrang lain dapat mengubah kebijakan autentikasi/tool/configizin filesystem pada ~/.openclaw/openclaw.jsonya
fs.config.symlinkwarnTarget config menjadi batas kepercayaan laintata letak filesystem file configtidak
fs.config.perms_group_readablewarnPengguna grup dapat membaca token/pengaturan configizin filesystem pada file configya
fs.config.perms_world_readablecriticalConfig dapat mengekspos token/pengaturanizin filesystem pada file configya
fs.config_include.perms_writablecriticalFile include config dapat diubah oleh orang lainizin file include yang dirujuk dari openclaw.jsonya
fs.config_include.perms_group_readablewarnPengguna grup dapat membaca rahasia/pengaturan yang di-includeizin file include yang dirujuk dari openclaw.jsonya
fs.config_include.perms_world_readablecriticalRahasia/pengaturan yang di-include dapat dibaca semua orangizin file include yang dirujuk dari openclaw.jsonya
fs.auth_profiles.perms_writablecriticalOrang lain dapat menyuntikkan atau mengganti kredensial model yang tersimpanizin agents/<agentId>/agent/auth-profiles.jsonya
fs.auth_profiles.perms_readablewarnOrang lain dapat membaca API key dan token OAuthizin agents/<agentId>/agent/auth-profiles.jsonya
fs.credentials_dir.perms_writablecriticalOrang lain dapat mengubah state pairing/kredensial channelizin filesystem pada ~/.openclaw/credentialsya
fs.credentials_dir.perms_readablewarnOrang lain dapat membaca state kredensial channelizin filesystem pada ~/.openclaw/credentialsya
fs.sessions_store.perms_readablewarnOrang lain dapat membaca transkrip/metadata sesiizin penyimpanan sesiya
fs.log_file.perms_readablewarnOrang lain dapat membaca log yang telah direduksi namun tetap sensitifizin file log gatewayya
fs.synced_dirwarnState/config di iCloud/Dropbox/Drive memperluas paparan token/transkrippindahkan config/state keluar dari folder tersinkronisasitidak
gateway.bind_no_authcriticalBind jarak jauh tanpa rahasia bersamagateway.bind, gateway.auth.*tidak
gateway.loopback_no_authcriticalLoopback yang diproksikan balik bisa menjadi tanpa autentikasigateway.auth.*, penyiapan proxytidak
gateway.trusted_proxies_missingwarnHeader reverse-proxy ada tetapi tidak tepercayagateway.trustedProxiestidak
gateway.http.no_authwarn/criticalAPI HTTP Gateway dapat dijangkau dengan auth.mode="none"gateway.auth.mode, gateway.http.endpoints.*tidak
gateway.http.session_key_override_enabledinfoPemanggil API HTTP dapat mengoverride sessionKeygateway.http.allowSessionKeyOverridetidak
gateway.tools_invoke_http.dangerous_allowwarn/criticalMengaktifkan kembali tool berbahaya melalui API HTTPgateway.tools.allowtidak
gateway.nodes.allow_commands_dangerouswarn/criticalMengaktifkan perintah node berdampak tinggi (kamera/layar/kontak/kalender/SMS)gateway.nodes.allowCommandstidak
gateway.nodes.deny_commands_ineffectivewarnEntri deny mirip pola tidak cocok dengan teks shell atau grupgateway.nodes.denyCommandstidak
gateway.tailscale_funnelcriticalPaparan internet publikgateway.tailscale.modetidak
gateway.tailscale_serveinfoPaparan tailnet diaktifkan melalui Servegateway.tailscale.modetidak
gateway.control_ui.allowed_origins_requiredcriticalControl UI non-loopback tanpa allowlist origin browser eksplisitgateway.controlUi.allowedOriginstidak
gateway.control_ui.allowed_origins_wildcardwarn/criticalallowedOrigins=["*"] menonaktifkan allowlisting origin browsergateway.controlUi.allowedOriginstidak
gateway.control_ui.host_header_origin_fallbackwarn/criticalMengaktifkan fallback origin Host-header (penurunan hardening DNS rebinding)gateway.controlUi.dangerouslyAllowHostHeaderOriginFallbacktidak
gateway.control_ui.insecure_authwarnToggle kompatibilitas autentikasi tidak aman diaktifkangateway.controlUi.allowInsecureAuthtidak
gateway.control_ui.device_auth_disabledcriticalMenonaktifkan pemeriksaan identitas perangkatgateway.controlUi.dangerouslyDisableDeviceAuthtidak
gateway.real_ip_fallback_enabledwarn/criticalMempercayai fallback X-Real-IP dapat mengaktifkan spoofing IP sumber melalui miskonfigurasi proxygateway.allowRealIpFallback, gateway.trustedProxiestidak
gateway.token_too_shortwarnToken bersama pendek lebih mudah di-bruteforcegateway.auth.tokentidak
gateway.auth_no_rate_limitwarnAuth yang terekspos tanpa rate limiting meningkatkan risiko brute-forcegateway.auth.rateLimittidak
gateway.trusted_proxy_authcriticalIdentitas proxy kini menjadi batas autentikasigateway.auth.mode="trusted-proxy"tidak
gateway.trusted_proxy_no_proxiescriticalAuth trusted-proxy tanpa IP proxy tepercaya tidak amangateway.trustedProxiestidak
gateway.trusted_proxy_no_user_headercriticalAuth trusted-proxy tidak dapat menentukan identitas pengguna dengan amangateway.auth.trustedProxy.userHeadertidak
gateway.trusted_proxy_no_allowlistwarnAuth trusted-proxy menerima pengguna upstream terautentikasi mana pungateway.auth.trustedProxy.allowUserstidak
gateway.probe_auth_secretref_unavailablewarnProbe mendalam tidak dapat menyelesaikan auth SecretRef pada jalur perintah inisumber auth deep-probe / ketersediaan SecretReftidak
gateway.probe_failedwarn/criticalProbe Gateway live gagaljangkauan/auth gatewaytidak
discovery.mdns_full_modewarn/criticalMode penuh mDNS mengiklankan metadata cliPath/sshPort di jaringan lokaldiscovery.mdns.mode, gateway.bindtidak
config.insecure_or_dangerous_flagswarnAda flag debug tidak aman/berbahaya yang diaktifkanbanyak key (lihat detail temuan)tidak
config.secrets.gateway_password_in_configwarnPassword Gateway disimpan langsung di configgateway.auth.passwordtidak
config.secrets.hooks_token_in_configwarnToken bearer hook disimpan langsung di confighooks.tokentidak
hooks.token_reuse_gateway_tokencriticalToken ingress hook juga membuka auth Gatewayhooks.token, gateway.auth.tokentidak
hooks.token_too_shortwarnBrute-force pada ingress hook menjadi lebih mudahhooks.tokentidak
hooks.default_session_key_unsetwarnFan out hook agent berjalan ke sesi per permintaan yang dihasilkanhooks.defaultSessionKeytidak
hooks.allowed_agent_ids_unrestrictedwarn/criticalPemanggil hook terautentikasi dapat merutekan ke agen terkonfigurasi mana punhooks.allowedAgentIdstidak
hooks.request_session_key_enabledwarn/criticalPemanggil eksternal dapat memilih sessionKeyhooks.allowRequestSessionKeytidak
hooks.request_session_key_prefixes_missingwarn/criticalTidak ada batas pada bentuk kunci sesi eksternalhooks.allowedSessionKeyPrefixestidak
hooks.path_rootcriticalJalur hook adalah /, membuat ingress lebih mudah bertabrakan atau salah rutehooks.pathtidak
hooks.installs_unpinned_npm_specswarnRekaman instal hook tidak dipatok ke npm spec yang immutablemetadata instal hooktidak
hooks.installs_missing_integritywarnRekaman instal hook tidak memiliki metadata integritymetadata instal hooktidak
hooks.installs_version_driftwarnRekaman instal hook berbeda dari package yang terinstalmetadata instal hooktidak
logging.redact_offwarnNilai sensitif bocor ke log/statuslogging.redactSensitiveya
browser.control_invalid_configwarnConfig kontrol browser tidak valid sebelum runtimebrowser.*tidak
browser.control_no_authcriticalKontrol browser terekspos tanpa autentikasi token/passwordgateway.auth.*tidak
browser.remote_cdp_httpwarnCDP jarak jauh melalui HTTP biasa tidak memiliki enkripsi transportprofile browser cdpUrltidak
browser.remote_cdp_private_hostwarnCDP jarak jauh menargetkan host privat/internalprofile browser cdpUrl, browser.ssrfPolicy.*tidak
sandbox.docker_config_mode_offwarnConfig Docker sandbox ada tetapi tidak aktifagents.*.sandbox.modetidak
sandbox.bind_mount_non_absolutewarnBind mount relatif dapat di-resolve secara tidak terdugaagents.*.sandbox.docker.binds[]tidak
sandbox.dangerous_bind_mountcriticalTarget bind mount sandbox menuju jalur sistem, kredensial, atau socket Docker yang diblokiragents.*.sandbox.docker.binds[]tidak
sandbox.dangerous_network_modecriticalJaringan Docker sandbox menggunakan mode gabung namespace host atau container:*agents.*.sandbox.docker.networktidak
sandbox.dangerous_seccomp_profilecriticalProfil seccomp sandbox melemahkan isolasi containeragents.*.sandbox.docker.securityOpttidak
sandbox.dangerous_apparmor_profilecriticalProfil AppArmor sandbox melemahkan isolasi containeragents.*.sandbox.docker.securityOpttidak
sandbox.browser_cdp_bridge_unrestrictedwarnBridge browser sandbox terekspos tanpa pembatasan rentang sumbersandbox.browser.cdpSourceRangetidak
sandbox.browser_container.non_loopback_publishcriticalContainer browser yang ada memublikasikan CDP pada interface non-loopbackkonfigurasi publish container sandbox browsertidak
sandbox.browser_container.hash_label_missingwarnContainer browser yang ada lebih lama dari label hash konfigurasi saat iniopenclaw sandbox recreate --browser --alltidak
sandbox.browser_container.hash_epoch_stalewarnContainer browser yang ada lebih lama dari epoch config browser saat iniopenclaw sandbox recreate --browser --alltidak
tools.exec.host_sandbox_no_sandbox_defaultswarnexec host=sandbox gagal tertutup saat sandbox matitools.exec.host, agents.defaults.sandbox.modetidak
tools.exec.host_sandbox_no_sandbox_agentswarnexec host=sandbox per agen gagal tertutup saat sandbox matiagents.list[].tools.exec.host, agents.list[].sandbox.modetidak
tools.exec.security_full_configuredwarn/criticalHost exec berjalan dengan security="full"tools.exec.security, agents.list[].tools.exec.securitytidak
tools.exec.auto_allow_skills_enabledwarnPersetujuan exec mempercayai bin skill secara implisit~/.openclaw/exec-approvals.jsontidak
tools.exec.allowlist_interpreter_without_strict_inline_evalwarnAllowlist interpreter mengizinkan inline eval tanpa persetujuan ulang wajibtools.exec.strictInlineEval, agents.list[].tools.exec.strictInlineEval, exec approvals allowlisttidak
tools.exec.safe_bins_interpreter_unprofiledwarnBin interpreter/runtime di safeBins tanpa profil eksplisit memperluas risiko exectools.exec.safeBins, tools.exec.safeBinProfiles, agents.list[].tools.exec.*tidak
tools.exec.safe_bins_broad_behaviorwarnTool berperilaku luas di safeBins melemahkan model kepercayaan stdin-filter berisiko rendahtools.exec.safeBins, agents.list[].tools.exec.safeBinstidak
tools.exec.safe_bin_trusted_dirs_riskywarnsafeBinTrustedDirs mencakup direktori mutable atau berisikotools.exec.safeBinTrustedDirs, agents.list[].tools.exec.safeBinTrustedDirstidak
skills.workspace.symlink_escapewarnWorkspace skills/**/SKILL.md di-resolve di luar root workspace (pergeseran rantai symlink)state filesystem workspace skills/**tidak
plugins.extensions_no_allowlistwarnExtensions terinstal tanpa allowlist plugin eksplisitplugins.allowlisttidak
plugins.installs_unpinned_npm_specswarnRekaman instal plugin tidak dipatok ke npm spec yang immutablemetadata instal plugintidak
plugins.installs_missing_integritywarnRekaman instal plugin tidak memiliki metadata integritymetadata instal plugintidak
plugins.installs_version_driftwarnRekaman instal plugin berbeda dari package yang terinstalmetadata instal plugintidak
plugins.code_safetywarn/criticalPemindaian kode plugin menemukan pola mencurigakan atau berbahayakode plugin / sumber instaltidak
plugins.code_safety.entry_pathwarnJalur entri plugin menunjuk ke lokasi tersembunyi atau node_modulesentry manifest plugintidak
plugins.code_safety.entry_escapecriticalEntri plugin keluar dari direktori pluginentry manifest plugintidak
plugins.code_safety.scan_failedwarnPemindaian kode plugin tidak dapat diselesaikanjalur extension plugin / lingkungan pemindaiantidak
skills.code_safetywarn/criticalMetadata/kode installer skill berisi pola mencurigakan atau berbahayasumber instal skilltidak
skills.code_safety.scan_failedwarnPemindaian kode skill tidak dapat diselesaikanlingkungan pemindaian skilltidak
security.exposure.open_channels_with_execwarn/criticalRoom bersama/publik dapat menjangkau agen dengan exec aktifchannels.*.dmPolicy, channels.*.groupPolicy, tools.exec.*, agents.list[].tools.exec.*tidak
security.exposure.open_groups_with_elevatedcriticalGrup terbuka + tool yang ditinggikan menciptakan jalur injeksi prompt berdampak tinggichannels.*.groupPolicy, tools.elevated.*tidak
security.exposure.open_groups_with_runtime_or_fscritical/warnGrup terbuka dapat menjangkau tool perintah/file tanpa guard sandbox/workspacechannels.*.groupPolicy, tools.profile/deny, tools.fs.workspaceOnly, agents.*.sandbox.modetidak
security.trust_model.multi_user_heuristicwarnConfig tampak multi-user sementara model kepercayaan gateway adalah asisten pribadipisahkan batas kepercayaan, atau pengerasan pengguna bersama (sandbox.mode, deny tool/scoping workspace)tidak
tools.profile_minimal_overriddenwarnOverride agen melewati profil minimal globalagents.list[].tools.profiletidak
plugins.tools_reachable_permissive_policywarnTool extension dapat dijangkau dalam konteks yang permisiftools.profile + allow/deny tooltidak
models.legacywarnKeluarga model lawas masih dikonfigurasipemilihan modeltidak
models.weak_tierwarnModel yang dikonfigurasi berada di bawah tier yang direkomendasikan saat inipemilihan modeltidak
models.small_paramscritical/infoModel kecil + permukaan tool yang tidak aman meningkatkan risiko injeksipemilihan model + kebijakan sandbox/tooltidak
summary.attack_surfaceinfoRingkasan gabungan postur auth, channel, tool, dan paparanbanyak key (lihat detail temuan)tidak

Control UI melalui HTTP

Control UI memerlukan konteks aman (HTTPS atau localhost) untuk menghasilkan identitas perangkat. gateway.controlUi.allowInsecureAuth adalah toggle kompatibilitas lokal:
  • Di localhost, ini memungkinkan auth Control UI tanpa identitas perangkat ketika halaman dimuat melalui HTTP yang tidak aman.
  • Ini tidak melewati pemeriksaan pairing.
  • Ini tidak melonggarkan persyaratan identitas perangkat jarak jauh (non-localhost).
Utamakan HTTPS (Tailscale Serve) atau buka UI di 127.0.0.1. Hanya untuk skenario break-glass, gateway.controlUi.dangerouslyDisableDeviceAuth menonaktifkan pemeriksaan identitas perangkat sepenuhnya. Ini adalah penurunan keamanan yang parah; biarkan tetap mati kecuali Anda sedang aktif melakukan debugging dan dapat segera membalikkan perubahan. Terpisah dari flag berbahaya tersebut, gateway.auth.mode: "trusted-proxy" yang berhasil dapat mengizinkan sesi operator Control UI operator tanpa identitas perangkat. Itu adalah perilaku mode auth yang disengaja, bukan jalan pintas allowInsecureAuth, dan tetap tidak meluas ke sesi Control UI peran node. openclaw security audit memperingatkan ketika pengaturan ini diaktifkan.

Ringkasan flag tidak aman atau berbahaya

openclaw security audit menyertakan config.insecure_or_dangerous_flags ketika switch debug tidak aman/berbahaya yang diketahui diaktifkan. Pemeriksaan itu saat ini mengagregasi:
  • 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
Kunci config lengkap dangerous* / dangerously* yang didefinisikan dalam skema config 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 (channel extension)
  • channels.synology-chat.accounts.<accountId>.dangerouslyAllowNameMatching (channel extension)
  • channels.synology-chat.dangerouslyAllowInheritedWebhookPath (channel extension)
  • channels.zalouser.dangerouslyAllowNameMatching (channel extension)
  • channels.zalouser.accounts.<accountId>.dangerouslyAllowNameMatching (channel extension)
  • channels.irc.dangerouslyAllowNameMatching (channel extension)
  • channels.irc.accounts.<accountId>.dangerouslyAllowNameMatching (channel extension)
  • channels.mattermost.dangerouslyAllowNameMatching (channel extension)
  • channels.mattermost.accounts.<accountId>.dangerouslyAllowNameMatching (channel extension)
  • 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

Konfigurasi Reverse Proxy

Jika Anda menjalankan Gateway di belakang reverse proxy (nginx, Caddy, Traefik, dll.), konfigurasikan gateway.trustedProxies untuk penanganan IP klien yang diteruskan dengan benar. Ketika Gateway mendeteksi header proxy dari alamat yang tidak ada di trustedProxies, Gateway tidak akan memperlakukan koneksi sebagai klien lokal. Jika auth gateway dinonaktifkan, koneksi tersebut ditolak. Ini mencegah bypass autentikasi ketika koneksi yang diproksikan sebaliknya akan tampak berasal dari localhost dan menerima kepercayaan otomatis. gateway.trustedProxies juga digunakan oleh gateway.auth.mode: "trusted-proxy", tetapi mode auth itu lebih ketat:
  • auth trusted-proxy gagal tertutup untuk proxy bersumber loopback
  • reverse proxy loopback pada host yang sama masih dapat menggunakan gateway.trustedProxies untuk deteksi klien lokal dan penanganan IP yang diteruskan
  • untuk reverse proxy loopback pada host yang sama, gunakan auth token/password alih-alih gateway.auth.mode: "trusted-proxy"
gateway:
  trustedProxies:
    - "10.0.0.1" # IP reverse proxy
  # Opsional. Default false.
  # Aktifkan hanya jika proxy Anda tidak dapat menyediakan X-Forwarded-For.
  allowRealIpFallback: false
  auth:
    mode: password
    password: ${OPENCLAW_GATEWAY_PASSWORD}
Ketika trustedProxies dikonfigurasi, Gateway menggunakan X-Forwarded-For untuk menentukan IP klien. X-Real-IP diabaikan secara default kecuali gateway.allowRealIpFallback: true disetel secara eksplisit. Perilaku reverse proxy yang baik (menimpa header forwarding masuk):
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
Perilaku reverse proxy yang buruk (menambahkan/mempertahankan header forwarding tak tepercaya):
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Catatan HSTS dan origin

  • Gateway OpenClaw mengutamakan lokal/loopback. Jika Anda mengakhiri TLS di reverse proxy, setel HSTS pada domain HTTPS yang menghadap proxy di sana.
  • Jika gateway itu sendiri mengakhiri HTTPS, Anda dapat menyetel gateway.http.securityHeaders.strictTransportSecurity untuk mengirim header HSTS dari respons OpenClaw.
  • Panduan deployment terperinci ada di Trusted Proxy Auth.
  • Untuk deployment Control UI non-loopback, gateway.controlUi.allowedOrigins wajib secara default.
  • gateway.controlUi.allowedOrigins: ["*"] adalah kebijakan origin browser allow-all yang eksplisit, bukan default yang diperkeras. Hindari di luar pengujian lokal yang dikendalikan ketat.
  • Kegagalan auth origin browser pada loopback tetap dikenai rate limiting bahkan saat pengecualian loopback umum diaktifkan, tetapi kunci lockout dibatasi per nilai Origin yang dinormalisasi, bukan satu bucket localhost bersama.
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true mengaktifkan mode fallback origin Host-header; perlakukan ini sebagai kebijakan berbahaya yang dipilih operator.
  • Perlakukan DNS rebinding dan perilaku host header proxy sebagai perhatian pengerasan deployment; pertahankan trustedProxies tetap ketat dan hindari mengekspos gateway langsung ke internet publik.

Log sesi lokal tersimpan di disk

OpenClaw menyimpan transkrip sesi di disk di bawah ~/.openclaw/agents/<agentId>/sessions/*.jsonl. Ini diperlukan untuk kesinambungan sesi dan (opsional) pengindeksan memori sesi, tetapi juga berarti setiap proses/pengguna dengan akses filesystem dapat membaca log tersebut. Perlakukan akses disk sebagai batas kepercayaan dan kunci izin pada ~/.openclaw (lihat bagian audit di bawah). Jika Anda memerlukan isolasi yang lebih kuat antar agen, jalankan mereka di bawah pengguna OS terpisah atau host terpisah.

Eksekusi node (system.run)

Jika node macOS dipasangkan, Gateway dapat memanggil system.run pada node tersebut. Ini adalah eksekusi kode jarak jauh di Mac:
  • Memerlukan pairing node (persetujuan + token).
  • Pairing node Gateway bukan permukaan persetujuan per perintah. Ini menetapkan identitas/kepercayaan node dan penerbitan token.
  • Gateway menerapkan kebijakan perintah node global yang kasar melalui gateway.nodes.allowCommands / denyCommands.
  • Dikendalikan di Mac melalui Settings → Exec approvals (security + ask + allowlist).
  • Kebijakan system.run per node adalah file persetujuan exec milik node sendiri (exec.approvals.node.*), yang bisa lebih ketat atau lebih longgar daripada kebijakan ID perintah global gateway.
  • Node yang berjalan dengan security="full" dan ask="off" mengikuti model operator tepercaya default. Perlakukan ini sebagai perilaku yang diharapkan kecuali deployment Anda secara eksplisit memerlukan persetujuan atau allowlist yang lebih ketat.
  • Mode persetujuan mengikat konteks permintaan yang tepat dan, bila memungkinkan, satu operand skrip/file lokal konkret. Jika OpenClaw tidak dapat mengidentifikasi tepat satu file lokal langsung untuk perintah interpreter/runtime, eksekusi berbasis persetujuan ditolak alih-alih menjanjikan cakupan semantik penuh.
  • Untuk host=node, eksekusi berbasis persetujuan juga menyimpan systemRunPlan kanonis yang telah disiapkan; penerusan yang kemudian disetujui menggunakan kembali rencana tersimpan tersebut, dan validasi gateway menolak perubahan pemanggil pada konteks perintah/cwd/sesi setelah permintaan persetujuan dibuat.
  • Jika Anda tidak menginginkan eksekusi jarak jauh, setel security ke deny dan hapus pairing node untuk Mac tersebut.
Pembedaan ini penting untuk triase:
  • Node berpasangan yang terhubung kembali dan mengiklankan daftar perintah berbeda bukan, dengan sendirinya, kerentanan jika kebijakan global Gateway dan persetujuan exec lokal node masih menegakkan batas eksekusi yang sebenarnya.
  • Laporan yang memperlakukan metadata pairing node sebagai lapisan persetujuan tersembunyi kedua per perintah biasanya merupakan kebingungan kebijakan/UX, bukan bypass batas keamanan.

Skills dinamis (watcher / node jarak jauh)

OpenClaw dapat menyegarkan daftar Skills di tengah sesi:
  • Skills watcher: perubahan pada SKILL.md dapat memperbarui snapshot Skills pada giliran agen berikutnya.
  • Node jarak jauh: menghubungkan node macOS dapat membuat skill khusus macOS memenuhi syarat (berdasarkan probing bin).
Perlakukan folder skill sebagai kode tepercaya dan batasi siapa yang dapat mengubahnya.

Model Ancaman

Asisten AI Anda dapat:
  • Menjalankan perintah shell arbitrer
  • Membaca/menulis file
  • Mengakses layanan jaringan
  • Mengirim pesan ke siapa saja (jika Anda memberinya akses WhatsApp)
Orang yang mengirim pesan kepada Anda dapat:
  • Mencoba menipu AI Anda agar melakukan hal buruk
  • Melakukan rekayasa sosial untuk mengakses data Anda
  • Menyelidiki detail infrastruktur

Konsep inti: kontrol akses sebelum kecerdasan

Sebagian besar kegagalan di sini bukan eksploit mewah — melainkan “seseorang mengirim pesan ke bot dan bot melakukan apa yang diminta.” Sikap OpenClaw:
  • Identitas terlebih dahulu: putuskan siapa yang dapat berbicara dengan bot (pairing DM / allowlist / open eksplisit).
  • Cakupan berikutnya: putuskan di mana bot diizinkan bertindak (allowlist grup + mention gating, tool, sandboxing, izin perangkat).
  • Model terakhir: asumsikan model bisa dimanipulasi; rancang agar manipulasi memiliki radius dampak yang terbatas.

Model otorisasi perintah

Slash command dan directive hanya dihormati untuk pengirim yang berwenang. Otorisasi diturunkan dari allowlist/pairing channel ditambah commands.useAccessGroups (lihat Configuration dan Slash commands). Jika allowlist channel kosong atau mencakup "*", perintah secara efektif terbuka untuk channel tersebut. /exec adalah kemudahan khusus sesi untuk operator yang berwenang. Ini tidak menulis config atau mengubah sesi lain.

Risiko tool control plane

Dua tool bawaan dapat membuat perubahan control-plane yang persisten:
  • gateway dapat memeriksa config dengan config.schema.lookup / config.get, dan dapat membuat perubahan persisten dengan config.apply, config.patch, dan update.run.
  • cron dapat membuat tugas terjadwal yang terus berjalan setelah chat/tugas asli berakhir.
Tool runtime gateway khusus pemilik masih menolak untuk menulis ulang tools.exec.ask atau tools.exec.security; alias lama tools.bash.* dinormalisasi ke jalur exec terlindungi yang sama sebelum penulisan. Untuk agen/permukaan mana pun yang menangani konten tak tepercaya, tolak ini secara default:
{
  tools: {
    deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],
  },
}
commands.restart=false hanya memblokir tindakan restart. Ini tidak menonaktifkan tindakan config/update gateway.

Plugin/extension

Plugin berjalan di dalam proses dengan Gateway. Perlakukan mereka sebagai kode tepercaya:
  • Instal hanya plugin dari sumber yang Anda percayai.
  • Utamakan allowlist plugins.allow yang eksplisit.
  • Tinjau config plugin sebelum mengaktifkannya.
  • Restart Gateway setelah perubahan plugin.
  • Jika Anda menginstal atau memperbarui plugin (openclaw plugins install <package>, openclaw plugins update <id>), perlakukan seperti menjalankan kode tak tepercaya:
    • Jalur instal adalah direktori per plugin di bawah root instal plugin aktif.
    • OpenClaw menjalankan pemindaian kode berbahaya bawaan sebelum instal/update. Temuan critical diblokir secara default.
    • OpenClaw menggunakan npm pack lalu menjalankan npm install --omit=dev di direktori tersebut (skrip lifecycle npm dapat menjalankan kode selama instalasi).
    • Utamakan versi yang dipatok secara tepat (@scope/pkg@1.2.3), dan periksa kode yang sudah di-unpack di disk sebelum mengaktifkan.
    • --dangerously-force-unsafe-install hanya untuk break-glass pada false positive pemindaian bawaan dalam alur instal/update plugin. Ini tidak melewati blok kebijakan hook before_install plugin dan tidak melewati kegagalan pemindaian.
    • Instal dependensi skill berbasis Gateway mengikuti pemisahan dangerous/suspicious yang sama: temuan bawaan critical memblokir kecuali pemanggil secara eksplisit menyetel dangerouslyForceUnsafeInstall, sementara temuan suspicious tetap hanya memberi peringatan. openclaw skills install tetap merupakan alur unduh/instal skill ClawHub yang terpisah.
Detail: Plugins

Model akses DM (pairing / allowlist / open / disabled)

Semua channel yang saat ini mendukung DM memiliki kebijakan DM (dmPolicy atau *.dm.policy) yang memblokir DM masuk sebelum pesan diproses:
  • pairing (default): pengirim tak dikenal menerima kode pairing singkat dan bot mengabaikan pesan mereka sampai disetujui. Kode kedaluwarsa setelah 1 jam; DM berulang tidak akan mengirim ulang kode sampai permintaan baru dibuat. Permintaan yang tertunda dibatasi hingga 3 per channel secara default.
  • allowlist: pengirim tak dikenal diblokir (tanpa handshake pairing).
  • open: izinkan siapa saja untuk DM (publik). Memerlukan allowlist channel mencakup "*" (opt-in eksplisit).
  • disabled: abaikan DM masuk sepenuhnya.
Setujui melalui CLI:
openclaw pairing list <channel>
openclaw pairing approve <channel> <code>
Detail + file di disk: Pairing

Isolasi sesi DM (mode multi-pengguna)

Secara default, OpenClaw merutekan semua DM ke sesi utama sehingga asisten Anda memiliki kesinambungan di seluruh perangkat dan channel. Jika beberapa orang dapat DM bot (DM terbuka atau allowlist multi-orang), pertimbangkan untuk mengisolasi sesi DM:
{
  session: { dmScope: "per-channel-peer" },
}
Ini mencegah kebocoran konteks lintas pengguna sambil menjaga obrolan grup tetap terisolasi. Ini adalah batas konteks pesan, bukan batas admin host. Jika pengguna saling bersifat adversarial dan berbagi host/config Gateway yang sama, jalankan gateway terpisah per batas kepercayaan.

Mode DM aman (disarankan)

Perlakukan cuplikan di atas sebagai mode DM aman:
  • Default: session.dmScope: "main" (semua DM berbagi satu sesi untuk kesinambungan).
  • Default onboarding CLI lokal: menulis session.dmScope: "per-channel-peer" saat tidak disetel (menjaga nilai eksplisit yang sudah ada).
  • Mode DM aman: session.dmScope: "per-channel-peer" (setiap pasangan channel+pengirim mendapat konteks DM terisolasi).
  • Isolasi peer lintas channel: session.dmScope: "per-peer" (setiap pengirim mendapat satu sesi di semua channel dengan tipe yang sama).
Jika Anda menjalankan beberapa akun pada channel yang sama, gunakan per-account-channel-peer sebagai gantinya. Jika orang yang sama menghubungi Anda di beberapa channel, gunakan session.identityLinks untuk meruntuhkan sesi DM tersebut menjadi satu identitas kanonis. Lihat Manajemen Sesi dan Configuration.

Allowlists (DM + grup) - terminologi

OpenClaw memiliki dua lapisan terpisah “siapa yang bisa memicu saya?”:
  • Allowlist DM (allowFrom / channels.discord.allowFrom / channels.slack.allowFrom; lama: channels.discord.dm.allowFrom, channels.slack.dm.allowFrom): siapa yang diizinkan berbicara dengan bot di pesan langsung.
    • Ketika dmPolicy="pairing", persetujuan ditulis ke penyimpanan allowlist pairing yang dicakup akun di bawah ~/.openclaw/credentials/ (<channel>-allowFrom.json untuk akun default, <channel>-<accountId>-allowFrom.json untuk akun non-default), lalu digabung dengan allowlist config.
  • Allowlist grup (khusus channel): grup/channel/guild mana yang akan menerima pesan ke bot sama sekali.
    • Pola umum:
      • channels.whatsapp.groups, channels.telegram.groups, channels.imessage.groups: default per grup seperti requireMention; saat disetel, ini juga bertindak sebagai allowlist grup (sertakan "*" untuk mempertahankan perilaku izinkan-semua).
      • groupPolicy="allowlist" + groupAllowFrom: membatasi siapa yang dapat memicu bot di dalam sesi grup (WhatsApp/Telegram/Signal/iMessage/Microsoft Teams).
      • channels.discord.guilds / channels.slack.channels: allowlist per permukaan + default mention.
    • Pemeriksaan grup berjalan dalam urutan ini: groupPolicy/allowlist grup terlebih dahulu, aktivasi mention/balasan kedua.
    • Membalas pesan bot (mention implisit) tidak melewati allowlist pengirim seperti groupAllowFrom.
    • Catatan keamanan: perlakukan dmPolicy="open" dan groupPolicy="open" sebagai pengaturan pilihan terakhir. Ini seharusnya jarang sekali digunakan; utamakan pairing + allowlist kecuali Anda sepenuhnya mempercayai setiap anggota room.
Detail: Configuration dan Groups

Injeksi prompt (apa itu, mengapa penting)

Injeksi prompt terjadi ketika penyerang membuat pesan yang memanipulasi model agar melakukan sesuatu yang tidak aman (“abaikan instruksi Anda”, “dump filesystem Anda”, “ikuti tautan ini dan jalankan perintah”, dll.). Bahkan dengan system prompt yang kuat, injeksi prompt belum terpecahkan. Guardrail system prompt hanyalah panduan lunak; penegakan keras datang dari kebijakan tool, persetujuan exec, sandboxing, dan allowlist channel (dan operator dapat menonaktifkannya secara desain). Hal yang membantu dalam praktik:
  • Jaga DM masuk tetap terkunci (pairing/allowlist).
  • Utamakan mention gating di grup; hindari bot “selalu aktif” di room publik.
  • Perlakukan tautan, lampiran, dan instruksi yang ditempel sebagai bermusuhan secara default.
  • Jalankan eksekusi tool sensitif di sandbox; jauhkan rahasia dari filesystem yang dapat dijangkau agen.
  • Catatan: sandboxing bersifat opt-in. Jika mode sandbox mati, host=auto implisit di-resolve ke host gateway. host=sandbox eksplisit tetap gagal tertutup karena tidak ada runtime sandbox yang tersedia. Setel host=gateway jika Anda ingin perilaku itu eksplisit di config.
  • Batasi tool berisiko tinggi (exec, browser, web_fetch, web_search) ke agen tepercaya atau allowlist eksplisit.
  • Jika Anda meng-allowlist interpreter (python, node, ruby, perl, php, lua, osascript), aktifkan tools.exec.strictInlineEval agar bentuk inline eval tetap memerlukan persetujuan eksplisit.
  • Pemilihan model penting: model yang lebih lama/lebih kecil/lawas secara signifikan kurang tangguh terhadap injeksi prompt dan penyalahgunaan tool. Untuk agen dengan tool aktif, gunakan model generasi terbaru yang paling kuat dan diperkeras instruksi.
Tanda bahaya yang harus diperlakukan sebagai tak tepercaya:
  • “Baca file/URL ini dan lakukan persis seperti yang tertulis.”
  • “Abaikan system prompt atau aturan keamanan Anda.”
  • “Ungkapkan instruksi tersembunyi atau output tool Anda.”
  • “Tempel seluruh isi ~/.openclaw atau log Anda.”

Flag bypass konten eksternal yang tidak aman

OpenClaw menyertakan flag bypass eksplisit yang menonaktifkan pembungkusan keamanan konten eksternal:
  • hooks.mappings[].allowUnsafeExternalContent
  • hooks.gmail.allowUnsafeExternalContent
  • Field payload cron allowUnsafeExternalContent
Panduan:
  • Biarkan ini tidak disetel/false di produksi.
  • Aktifkan hanya sementara untuk debugging yang sangat terbatas.
  • Jika diaktifkan, isolasi agen tersebut (sandbox + tool minimal + namespace sesi khusus).
Catatan risiko hook:
  • Payload hook adalah konten tak tepercaya, bahkan ketika pengiriman berasal dari sistem yang Anda kendalikan (konten email/dokumen/web dapat membawa injeksi prompt).
  • Tier model yang lemah meningkatkan risiko ini. Untuk otomatisasi berbasis hook, utamakan tier model modern yang kuat dan pertahankan kebijakan tool yang ketat (tools.profile: "messaging" atau lebih ketat), ditambah sandboxing bila memungkinkan.

Injeksi prompt tidak memerlukan DM publik

Bahkan jika hanya Anda yang dapat mengirim pesan ke bot, injeksi prompt tetap dapat terjadi melalui konten tak tepercaya apa pun yang dibaca bot (hasil web search/fetch, halaman browser, email, dokumen, lampiran, log/kode yang ditempel). Dengan kata lain: pengirim bukan satu-satunya permukaan ancaman; konten itu sendiri dapat membawa instruksi adversarial. Ketika tool diaktifkan, risiko umumnya adalah mengekfiltrasi konteks atau memicu panggilan tool. Kurangi radius dampak dengan:
  • Menggunakan reader agent read-only atau tanpa tool untuk merangkum konten tak tepercaya, lalu kirim ringkasan tersebut ke agen utama Anda.
  • Menjaga web_search / web_fetch / browser tetap mati untuk agen dengan tool aktif kecuali diperlukan.
  • Untuk input URL OpenResponses (input_file / input_image), setel gateway.http.endpoints.responses.files.urlAllowlist dan gateway.http.endpoints.responses.images.urlAllowlist secara ketat, dan pertahankan maxUrlParts rendah. Allowlists kosong diperlakukan sebagai tidak disetel; gunakan files.allowUrl: false / images.allowUrl: false jika Anda ingin menonaktifkan pengambilan URL sepenuhnya.
  • Untuk input file OpenResponses, teks input_file yang telah didekode masih disuntikkan sebagai konten eksternal tak tepercaya. Jangan mengandalkan teks file sebagai tepercaya hanya karena Gateway mendekodenya secara lokal. Blok yang disuntikkan tetap membawa penanda batas <<<EXTERNAL_UNTRUSTED_CONTENT ...>>> eksplisit ditambah metadata Source: External, meskipun jalur ini tidak menyertakan banner SECURITY NOTICE: yang lebih panjang.
  • Pembungkusan berbasis penanda yang sama juga diterapkan ketika media-understanding mengekstrak teks dari dokumen terlampir sebelum menambahkan teks tersebut ke prompt media.
  • Mengaktifkan sandboxing dan allowlist tool yang ketat untuk agen mana pun yang menyentuh input tak tepercaya.
  • Menjaga rahasia tetap keluar dari prompt; teruskan melalui env/config pada host gateway.

Kekuatan model (catatan keamanan)

Ketahanan terhadap injeksi prompt tidak seragam di semua tier model. Model yang lebih kecil/lebih murah umumnya lebih rentan terhadap penyalahgunaan tool dan pembajakan instruksi, terutama di bawah prompt adversarial.
Untuk agen dengan tool aktif atau agen yang membaca konten tak tepercaya, risiko injeksi prompt dengan model yang lebih lama/lebih kecil sering kali terlalu tinggi. Jangan jalankan beban kerja tersebut pada tier model yang lemah.
Rekomendasi:
  • Gunakan model tier terbaik generasi terbaru untuk bot mana pun yang dapat menjalankan tool atau menyentuh file/jaringan.
  • Jangan gunakan tier yang lebih lama/lebih lemah/lebih kecil untuk agen dengan tool aktif atau inbox tak tepercaya; risiko injeksi prompt terlalu tinggi.
  • Jika Anda harus menggunakan model yang lebih kecil, kurangi radius dampak (tool read-only, sandboxing kuat, akses filesystem minimal, allowlist ketat).
  • Saat menjalankan model kecil, aktifkan sandboxing untuk semua sesi dan nonaktifkan web_search/web_fetch/browser kecuali input dikendalikan dengan ketat.
  • Untuk asisten pribadi khusus chat dengan input tepercaya dan tanpa tool, model yang lebih kecil biasanya cukup baik.

Reasoning & output verbose di grup

/reasoning dan /verbose dapat mengekspos reasoning internal atau output tool yang tidak dimaksudkan untuk channel publik. Dalam pengaturan grup, perlakukan ini sebagai debug saja dan biarkan tetap mati kecuali Anda secara eksplisit membutuhkannya. Panduan:
  • Biarkan /reasoning dan /verbose tetap dinonaktifkan di room publik.
  • Jika Anda mengaktifkannya, lakukan hanya di DM tepercaya atau room yang dikendalikan dengan ketat.
  • Ingat: output verbose dapat mencakup argumen tool, URL, dan data yang dilihat model.

Pengerasan Konfigurasi (contoh)

0) Izin file

Jaga config + state tetap privat pada host gateway:
  • ~/.openclaw/openclaw.json: 600 (hanya baca/tulis pengguna)
  • ~/.openclaw: 700 (hanya pengguna)
openclaw doctor dapat memperingatkan dan menawarkan untuk memperketat izin ini.

0.4) Paparan jaringan (bind + port + firewall)

Gateway memultipleks WebSocket + HTTP pada satu port:
  • Default: 18789
  • Config/flag/env: gateway.port, --port, OPENCLAW_GATEWAY_PORT
Permukaan HTTP ini mencakup Control UI dan host canvas:
  • Control UI (aset SPA) (jalur dasar default /)
  • Host canvas: /__openclaw__/canvas/ dan /__openclaw__/a2ui/ (HTML/JS arbitrer; perlakukan sebagai konten tak tepercaya)
Jika Anda memuat konten canvas di browser biasa, perlakukan seperti halaman web tak tepercaya lainnya:
  • Jangan ekspos host canvas ke jaringan/pengguna tak tepercaya.
  • Jangan buat konten canvas berbagi origin yang sama dengan permukaan web berhak istimewa kecuali Anda sepenuhnya memahami implikasinya.
Mode bind mengontrol di mana Gateway mendengarkan:
  • gateway.bind: "loopback" (default): hanya klien lokal yang dapat terhubung.
  • Bind non-loopback ("lan", "tailnet", "custom") memperluas permukaan serangan. Gunakan hanya dengan auth gateway (token/password bersama atau trusted proxy non-loopback yang dikonfigurasi dengan benar) dan firewall sungguhan.
Aturan praktis:
  • Utamakan Tailscale Serve daripada bind LAN (Serve menjaga Gateway tetap di loopback, dan Tailscale menangani akses).
  • Jika Anda harus bind ke LAN, firewall port tersebut ke allowlist IP sumber yang ketat; jangan port-forward secara luas.
  • Jangan pernah mengekspos Gateway tanpa autentikasi di 0.0.0.0.

0.4.1) Publikasi port Docker + UFW (DOCKER-USER)

Jika Anda menjalankan OpenClaw dengan Docker pada VPS, ingat bahwa port container yang dipublikasikan (-p HOST:CONTAINER atau Compose ports:) dirutekan melalui rantai forwarding Docker, bukan hanya aturan INPUT host. Agar traffic Docker tetap selaras dengan kebijakan firewall Anda, terapkan aturan di DOCKER-USER (rantai ini dievaluasi sebelum aturan accept milik Docker sendiri). Pada banyak distro modern, iptables/ip6tables menggunakan frontend iptables-nft dan tetap menerapkan aturan ini ke backend nftables. Contoh allowlist minimal (IPv4):
# /etc/ufw/after.rules (tambahkan sebagai bagian *filter tersendiri)
*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 memiliki tabel terpisah. Tambahkan kebijakan yang cocok di /etc/ufw/after6.rules jika Docker IPv6 diaktifkan. Hindari meng-hardcode nama interface seperti eth0 dalam cuplikan dokumen. Nama interface bervariasi antar image VPS (ens3, enp*, dll.) dan ketidakcocokan dapat secara tidak sengaja melewati aturan deny Anda. Validasi cepat setelah reload:
ufw reload
iptables -S DOCKER-USER
ip6tables -S DOCKER-USER
nmap -sT -p 1-65535 <public-ip> --open
Port eksternal yang diharapkan seharusnya hanya yang memang Anda ekspos secara sengaja (untuk sebagian besar penyiapan: SSH + port reverse proxy Anda).

0.4.2) Discovery mDNS/Bonjour (pengungkapan informasi)

Gateway menyiarkan keberadaannya melalui mDNS (_openclaw-gw._tcp di port 5353) untuk discovery perangkat lokal. Dalam mode penuh, ini mencakup TXT record yang dapat mengekspos detail operasional:
  • cliPath: jalur filesystem lengkap ke binary CLI (mengungkapkan nama pengguna dan lokasi instalasi)
  • sshPort: mengiklankan ketersediaan SSH pada host
  • displayName, lanHost: informasi hostname
Pertimbangan keamanan operasional: Menyiarkan detail infrastruktur mempermudah reconnaissance bagi siapa pun di jaringan lokal. Bahkan info yang tampak “tidak berbahaya” seperti jalur filesystem dan ketersediaan SSH membantu penyerang memetakan lingkungan Anda. Rekomendasi:
  1. Mode minimal (default, direkomendasikan untuk gateway yang terekspos): hilangkan field sensitif dari siaran mDNS:
    {
      discovery: {
        mdns: { mode: "minimal" },
      },
    }
    
  2. Nonaktifkan sepenuhnya jika Anda tidak memerlukan discovery perangkat lokal:
    {
      discovery: {
        mdns: { mode: "off" },
      },
    }
    
  3. Mode penuh (opt-in): sertakan cliPath + sshPort dalam TXT record:
    {
      discovery: {
        mdns: { mode: "full" },
      },
    }
    
  4. Variabel lingkungan (alternatif): setel OPENCLAW_DISABLE_BONJOUR=1 untuk menonaktifkan mDNS tanpa perubahan config.
Dalam mode minimal, Gateway tetap menyiarkan cukup informasi untuk discovery perangkat (role, gatewayPort, transport) tetapi menghilangkan cliPath dan sshPort. Aplikasi yang membutuhkan informasi jalur CLI dapat mengambilnya melalui koneksi WebSocket terautentikasi.

0.5) Kunci WebSocket Gateway (auth lokal)

Auth Gateway wajib secara default. Jika tidak ada jalur auth gateway yang valid dikonfigurasi, Gateway menolak koneksi WebSocket (gagal tertutup). Onboarding menghasilkan token secara default (bahkan untuk loopback) sehingga klien lokal harus melakukan autentikasi. Setel token agar semua klien WS harus terautentikasi:
{
  gateway: {
    auth: { mode: "token", token: "your-token" },
  },
}
Doctor dapat membuatkannya untuk Anda: openclaw doctor --generate-gateway-token. Catatan: gateway.remote.token / .password adalah sumber kredensial klien. Mereka tidak melindungi akses WS lokal dengan sendirinya. Jalur panggilan lokal dapat menggunakan gateway.remote.* sebagai fallback hanya ketika gateway.auth.* tidak disetel. Jika gateway.auth.token / gateway.auth.password dikonfigurasi secara eksplisit melalui SecretRef dan tidak dapat di-resolve, resolusi gagal tertutup (tidak ada fallback remote yang menutupi). Opsional: pin TLS jarak jauh dengan gateway.remote.tlsFingerprint saat menggunakan wss://. ws:// plaintext adalah loopback-only secara default. Untuk jalur private-network tepercaya, setel OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 pada proses klien sebagai break-glass. Pairing perangkat lokal:
  • Pairing perangkat disetujui otomatis untuk koneksi loopback lokal langsung agar klien host yang sama tetap lancar.
  • OpenClaw juga memiliki jalur self-connect backend/container-local yang sempit untuk alur helper rahasia bersama tepercaya.
  • Koneksi tailnet dan LAN, termasuk bind tailnet pada host yang sama, diperlakukan sebagai remote untuk pairing dan tetap memerlukan persetujuan.
Mode auth:
  • gateway.auth.mode: "token": token bearer bersama (direkomendasikan untuk sebagian besar penyiapan).
  • gateway.auth.mode: "password": auth password (lebih baik disetel via env: OPENCLAW_GATEWAY_PASSWORD).
  • gateway.auth.mode: "trusted-proxy": percayakan reverse proxy yang sadar identitas untuk mengautentikasi pengguna dan meneruskan identitas melalui header (lihat Trusted Proxy Auth).
Checklist rotasi (token/password):
  1. Buat/setel rahasia baru (gateway.auth.token atau OPENCLAW_GATEWAY_PASSWORD).
  2. Restart Gateway (atau restart app macOS jika ia mengawasi Gateway).
  3. Perbarui klien remote mana pun (gateway.remote.token / .password pada mesin yang memanggil Gateway).
  4. Verifikasi bahwa Anda tidak lagi dapat terhubung dengan kredensial lama.

0.6) Header identitas Tailscale Serve

Saat gateway.auth.allowTailscale bernilai true (default untuk Serve), OpenClaw menerima header identitas Tailscale Serve (tailscale-user-login) untuk autentikasi Control UI/WebSocket. OpenClaw memverifikasi identitas dengan me-resolve alamat x-forwarded-for melalui daemon Tailscale lokal (tailscale whois) dan mencocokkannya dengan header. Ini hanya terpicu untuk permintaan yang mencapai loopback dan menyertakan x-forwarded-for, x-forwarded-proto, dan x-forwarded-host sebagaimana disuntikkan oleh Tailscale. Untuk jalur pemeriksaan identitas async ini, upaya gagal untuk {scope, ip} yang sama diserialisasikan sebelum limiter mencatat kegagalan. Karena itu, retry buruk yang konkuren dari satu klien Serve dapat langsung mengunci upaya kedua alih-alih berlomba melewati sebagai dua ketidakcocokan biasa. Endpoint API HTTP (misalnya /v1/*, /tools/invoke, dan /api/channels/*) tidak menggunakan auth header identitas Tailscale. Mereka tetap mengikuti mode auth HTTP gateway yang dikonfigurasi. Catatan batas penting:
  • Auth bearer HTTP Gateway pada praktiknya adalah akses operator semua-atau-tidak-sama-sekali.
  • Perlakukan kredensial yang dapat memanggil /v1/chat/completions, /v1/responses, atau /api/channels/* sebagai rahasia operator akses penuh untuk gateway tersebut.
  • Pada permukaan HTTP yang kompatibel dengan OpenAI, auth bearer rahasia bersama memulihkan seluruh cakupan operator default (operator.admin, operator.approvals, operator.pairing, operator.read, operator.talk.secrets, operator.write) dan semantik owner untuk giliran agen; nilai x-openclaw-scopes yang lebih sempit tidak mengurangi jalur rahasia bersama itu.
  • Semantik cakupan per permintaan pada HTTP hanya berlaku ketika permintaan berasal dari mode yang membawa identitas seperti auth trusted proxy atau gateway.auth.mode="none" pada ingress privat.
  • Dalam mode yang membawa identitas tersebut, menghilangkan x-openclaw-scopes akan fallback ke set cakupan default operator normal; kirim header secara eksplisit saat Anda menginginkan set cakupan yang lebih sempit.
  • /tools/invoke mengikuti aturan rahasia bersama yang sama: auth bearer token/password diperlakukan sebagai akses operator penuh di sana juga, sementara mode yang membawa identitas tetap menghormati cakupan yang dinyatakan.
  • Jangan bagikan kredensial ini kepada pemanggil tak tepercaya; lebih baik gunakan gateway terpisah per batas kepercayaan.
Asumsi kepercayaan: auth Serve tanpa token mengasumsikan host gateway tepercaya. Jangan perlakukan ini sebagai perlindungan terhadap proses host yang bermusuhan. Jika kode lokal tak tepercaya dapat berjalan pada host gateway, nonaktifkan gateway.auth.allowTailscale dan wajibkan auth rahasia bersama eksplisit dengan gateway.auth.mode: "token" atau "password". Aturan keamanan: jangan teruskan header ini dari reverse proxy Anda sendiri. Jika Anda mengakhiri TLS atau melakukan proxy di depan gateway, nonaktifkan gateway.auth.allowTailscale dan gunakan auth rahasia bersama (gateway.auth.mode: "token" atau "password") atau Trusted Proxy Auth sebagai gantinya. Trusted proxies:
  • Jika Anda mengakhiri TLS di depan Gateway, setel gateway.trustedProxies ke IP proxy Anda.
  • OpenClaw akan mempercayai x-forwarded-for (atau x-real-ip) dari IP tersebut untuk menentukan IP klien untuk pemeriksaan pairing lokal dan pemeriksaan auth/lokal HTTP.
  • Pastikan proxy Anda menimpa x-forwarded-for dan memblokir akses langsung ke port Gateway.
Lihat Tailscale dan Ikhtisar web.

0.6.1) Kontrol browser melalui host node (disarankan)

Jika Gateway Anda remote tetapi browser berjalan di mesin lain, jalankan host node di mesin browser dan biarkan Gateway memproksikan tindakan browser (lihat Browser tool). Perlakukan pairing node seperti akses admin. Pola yang direkomendasikan:
  • Pertahankan Gateway dan host node pada tailnet yang sama (Tailscale).
  • Pair node dengan sengaja; nonaktifkan routing proxy browser jika Anda tidak membutuhkannya.
Hindari:
  • Mengekspos port relay/kontrol melalui LAN atau internet publik.
  • Tailscale Funnel untuk endpoint kontrol browser (paparan publik).

0.7) Rahasia di disk (data sensitif)

Anggap apa pun di bawah ~/.openclaw/ (atau $OPENCLAW_STATE_DIR/) dapat berisi rahasia atau data privat:
  • openclaw.json: config dapat mencakup token (gateway, gateway remote), pengaturan provider, dan allowlist.
  • credentials/**: kredensial channel (contoh: kredensial WhatsApp), allowlist pairing, impor OAuth lama.
  • agents/<agentId>/agent/auth-profiles.json: API key, profil token, token OAuth, dan opsional keyRef/tokenRef.
  • secrets.json (opsional): payload rahasia berbasis file yang digunakan oleh provider SecretRef file (secrets.providers).
  • agents/<agentId>/agent/auth.json: file kompatibilitas lama. Entri api_key statis dibersihkan saat ditemukan.
  • agents/<agentId>/sessions/**: transkrip sesi (*.jsonl) + metadata routing (sessions.json) yang dapat berisi pesan pribadi dan output tool.
  • package plugin bawaan: plugin yang terinstal (beserta node_modules/ mereka).
  • sandboxes/**: workspace sandbox tool; dapat menumpuk salinan file yang Anda baca/tulis di dalam sandbox.
Tips pengerasan:
  • Jaga izin tetap ketat (700 pada direktori, 600 pada file).
  • Gunakan enkripsi seluruh disk pada host gateway.
  • Lebih baik gunakan akun pengguna OS khusus untuk Gateway jika host dibagikan.

0.8) Log + transkrip (redaksi + retensi)

Log dan transkrip dapat membocorkan informasi sensitif bahkan ketika kontrol akses sudah benar:
  • Log Gateway dapat mencakup ringkasan tool, error, dan URL.
  • Transkrip sesi dapat mencakup rahasia yang ditempel, isi file, output perintah, dan tautan.
Rekomendasi:
  • Biarkan redaksi ringkasan tool tetap aktif (logging.redactSensitive: "tools"; default).
  • Tambahkan pola kustom untuk lingkungan Anda melalui logging.redactPatterns (token, hostname, URL internal).
  • Saat membagikan diagnostik, utamakan openclaw status --all (dapat ditempel, rahasia sudah direduksi) daripada log mentah.
  • Pangkas transkrip sesi dan file log lama jika Anda tidak memerlukan retensi panjang.
Detail: Logging

1) DM: pairing secara default

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

2) Grup: wajib mention di mana saja

{
  "channels": {
    "whatsapp": {
      "groups": {
        "*": { "requireMention": true }
      }
    }
  },
  "agents": {
    "list": [
      {
        "id": "main",
        "groupChat": { "mentionPatterns": ["@openclaw", "@mybot"] }
      }
    ]
  }
}
Dalam obrolan grup, hanya merespons saat disebut secara eksplisit.

3) Nomor terpisah (WhatsApp, Signal, Telegram)

Untuk channel berbasis nomor telepon, pertimbangkan untuk menjalankan AI Anda pada nomor telepon yang terpisah dari nomor pribadi Anda:
  • Nomor pribadi: Percakapan Anda tetap privat
  • Nomor bot: AI menangani ini, dengan batas yang sesuai

4) Mode read-only (melalui sandbox + tools)

Anda dapat membangun profil read-only dengan menggabungkan:
  • agents.defaults.sandbox.workspaceAccess: "ro" (atau "none" untuk tanpa akses workspace)
  • daftar allow/deny tool yang memblokir write, edit, apply_patch, exec, process, dll.
Opsi pengerasan tambahan:
  • tools.exec.applyPatch.workspaceOnly: true (default): memastikan apply_patch tidak dapat menulis/menghapus di luar direktori workspace bahkan saat sandboxing mati. Setel ke false hanya jika Anda sengaja ingin apply_patch menyentuh file di luar workspace.
  • tools.fs.workspaceOnly: true (opsional): membatasi jalur read/write/edit/apply_patch dan jalur autoload gambar prompt bawaan ke direktori workspace (berguna jika Anda saat ini mengizinkan jalur absolut dan ingin satu guardrail tunggal).
  • Jaga root filesystem tetap sempit: hindari root yang luas seperti direktori home Anda untuk workspace agen/workspace sandbox. Root yang luas dapat mengekspos file lokal sensitif (misalnya state/config di bawah ~/.openclaw) ke tool filesystem.

5) Baseline aman (copy/paste)

Satu config “aman secara default” yang menjaga Gateway tetap privat, mewajibkan pairing DM, dan menghindari bot grup yang selalu aktif:
{
  gateway: {
    mode: "local",
    bind: "loopback",
    port: 18789,
    auth: { mode: "token", token: "your-long-random-token" },
  },
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
Jika Anda menginginkan eksekusi tool yang “lebih aman secara default” juga, tambahkan sandbox + tolak tool berbahaya untuk agen non-owner mana pun (contoh di bawah “Per-agent access profiles”). Baseline bawaan untuk giliran agen yang digerakkan chat: pengirim non-owner tidak dapat menggunakan tool cron atau gateway.

Sandboxing (disarankan)

Dokumen khusus: Sandboxing Dua pendekatan yang saling melengkapi:
  • Jalankan seluruh Gateway di Docker (batas container): Docker
  • Sandbox tool (agents.defaults.sandbox, gateway host + tool yang diisolasi Docker): Sandboxing
Catatan: untuk mencegah akses lintas agen, pertahankan agents.defaults.sandbox.scope pada "agent" (default) atau "session" untuk isolasi per sesi yang lebih ketat. scope: "shared" menggunakan satu container/workspace bersama. Pertimbangkan juga akses workspace agen di dalam sandbox:
  • agents.defaults.sandbox.workspaceAccess: "none" (default) menjaga workspace agen tetap tidak dapat diakses; tools berjalan terhadap workspace sandbox di bawah ~/.openclaw/sandboxes
  • agents.defaults.sandbox.workspaceAccess: "ro" me-mount workspace agen sebagai read-only di /agent (menonaktifkan write/edit/apply_patch)
  • agents.defaults.sandbox.workspaceAccess: "rw" me-mount workspace agen baca/tulis di /workspace
  • sandbox.docker.binds tambahan divalidasi terhadap jalur sumber yang telah dinormalisasi dan dikanonisasi. Trik symlink parent dan alias home kanonis tetap gagal tertutup jika mereka di-resolve ke root yang diblokir seperti /etc, /var/run, atau direktori kredensial di bawah home OS.
Penting: tools.elevated adalah jalan keluar baseline global yang menjalankan exec di luar sandbox. Host efektifnya adalah gateway secara default, atau node saat target exec dikonfigurasi ke node. Pertahankan tools.elevated.allowFrom tetap ketat dan jangan aktifkan untuk orang asing. Anda dapat lebih membatasi elevated per agen melalui agents.list[].tools.elevated. Lihat Elevated Mode.

Guardrail delegasi sub-agent

Jika Anda mengizinkan tool sesi, perlakukan jalur sub-agent yang didelegasikan sebagai keputusan batas lainnya:
  • Tolak sessions_spawn kecuali agen benar-benar membutuhkan delegasi.
  • Pertahankan agents.defaults.subagents.allowAgents dan override per agen agents.list[].subagents.allowAgents tetap terbatas pada agen target yang diketahui aman.
  • Untuk alur kerja apa pun yang harus tetap tersandbox, panggil sessions_spawn dengan sandbox: "require" (default adalah inherit).
  • sandbox: "require" gagal cepat ketika runtime child target tidak tersandbox.

Risiko kontrol browser

Mengaktifkan kontrol browser memberi model kemampuan untuk mengendalikan browser sungguhan. Jika profile browser itu sudah berisi sesi login, model dapat mengakses akun dan data tersebut. Perlakukan profile browser sebagai state sensitif:
  • Utamakan profile khusus untuk agen (profile default openclaw).
  • Hindari mengarahkan agen ke profile harian pribadi Anda.
  • Biarkan kontrol browser host tetap dinonaktifkan untuk agen tersandbox kecuali Anda memercayainya.
  • API kontrol browser loopback mandiri hanya menghormati auth rahasia bersama (auth bearer token gateway atau password gateway). Ini tidak mengonsumsi header identitas trusted-proxy atau Tailscale Serve.
  • Perlakukan unduhan browser sebagai input tak tepercaya; utamakan direktori unduhan yang terisolasi.
  • Nonaktifkan sinkronisasi browser/password manager pada profile agen bila memungkinkan (mengurangi radius dampak).
  • Untuk gateway remote, anggap “kontrol browser” setara dengan “akses operator” ke apa pun yang dapat dijangkau profile tersebut.
  • Pertahankan Gateway dan host node hanya di tailnet; hindari mengekspos port kontrol browser ke LAN atau internet publik.
  • Nonaktifkan routing proxy browser saat tidak dibutuhkan (gateway.nodes.browser.mode="off").
  • Mode existing-session Chrome MCP bukan “lebih aman”; ini dapat bertindak sebagai Anda pada apa pun yang dapat dijangkau profile Chrome host itu.

Kebijakan SSRF browser (default jaringan tepercaya)

Kebijakan jaringan browser OpenClaw secara default mengikuti model operator tepercaya: tujuan privat/internal diizinkan kecuali Anda menonaktifkannya secara eksplisit.
  • Default: browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true (implisit saat tidak disetel).
  • Alias lama: browser.ssrfPolicy.allowPrivateNetwork masih diterima untuk kompatibilitas.
  • Mode ketat: setel browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: false untuk memblokir tujuan privat/internal/special-use secara default.
  • Dalam mode ketat, gunakan hostnameAllowlist (pola seperti *.example.com) dan allowedHostnames (pengecualian host persis, termasuk nama yang diblokir seperti localhost) untuk pengecualian eksplisit.
  • Navigasi diperiksa sebelum permintaan dan diperiksa ulang secara best-effort pada URL http(s) final setelah navigasi untuk mengurangi pivot berbasis redirect.
Contoh kebijakan ketat:
{
  browser: {
    ssrfPolicy: {
      dangerouslyAllowPrivateNetwork: false,
      hostnameAllowlist: ["*.example.com", "example.com"],
      allowedHostnames: ["localhost"],
    },
  },
}

Profil akses per agen (multi-agent)

Dengan routing multi-agent, setiap agen dapat memiliki sandbox + kebijakan tool sendiri: gunakan ini untuk memberi akses penuh, read-only, atau tanpa akses per agen. Lihat Multi-Agent Sandbox & Tools untuk detail lengkap dan aturan prioritas. Kasus penggunaan umum:
  • Agen pribadi: akses penuh, tanpa sandbox
  • Agen keluarga/kerja: tersandbox + tool read-only
  • Agen publik: tersandbox + tanpa tool filesystem/shell

Contoh: akses penuh (tanpa sandbox)

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

Contoh: tool read-only + workspace read-only

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

Contoh: tanpa akses filesystem/shell (pesan provider diizinkan)

{
  agents: {
    list: [
      {
        id: "public",
        workspace: "~/.openclaw/workspace-public",
        sandbox: {
          mode: "all",
          scope: "agent",
          workspaceAccess: "none",
        },
        // Tool sesi dapat mengungkap data sensitif dari transkrip. Secara default OpenClaw membatasi tool ini
        // ke sesi saat ini + sesi subagen yang dihasilkan, tetapi Anda dapat membatasi lebih jauh bila perlu.
        // Lihat `tools.sessions.visibility` dalam referensi konfigurasi.
        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",
          ],
        },
      },
    ],
  },
}

Apa yang Harus Anda Katakan kepada AI Anda

Sertakan panduan keamanan dalam system prompt agen Anda:
## Aturan Keamanan
- Jangan pernah membagikan daftar direktori atau jalur file kepada orang asing
- Jangan pernah mengungkap API key, kredensial, atau detail infrastruktur
- Verifikasi permintaan yang mengubah konfigurasi sistem dengan pemilik
- Jika ragu, tanyakan sebelum bertindak
- Jaga data pribadi tetap privat kecuali diizinkan secara eksplisit

Respons Insiden

Jika AI Anda melakukan sesuatu yang buruk:

Menahan

  1. Hentikan: hentikan app macOS (jika ia mengawasi Gateway) atau terminasi proses openclaw gateway Anda.
  2. Tutup paparan: setel gateway.bind: "loopback" (atau nonaktifkan Tailscale Funnel/Serve) sampai Anda memahami apa yang terjadi.
  3. Bekukan akses: ubah DM/grup berisiko ke dmPolicy: "disabled" / wajib mention, dan hapus entri izinkan-semua "*" jika Anda memilikinya.

Rotasi (anggap kompromi jika rahasia bocor)

  1. Rotasi auth Gateway (gateway.auth.token / OPENCLAW_GATEWAY_PASSWORD) dan restart.
  2. Rotasi rahasia klien remote (gateway.remote.token / .password) pada mesin mana pun yang dapat memanggil Gateway.
  3. Rotasi kredensial provider/API (kredensial WhatsApp, token Slack/Discord, model/API key di auth-profiles.json, dan nilai payload rahasia terenkripsi bila digunakan).

Audit

  1. Periksa log Gateway: /tmp/openclaw/openclaw-YYYY-MM-DD.log (atau logging.file).
  2. Tinjau transkrip yang relevan: ~/.openclaw/agents/<agentId>/sessions/*.jsonl.
  3. Tinjau perubahan config terbaru (apa pun yang dapat memperluas akses: gateway.bind, gateway.auth, kebijakan DM/grup, tools.elevated, perubahan plugin).
  4. Jalankan ulang openclaw security audit --deep dan konfirmasi temuan kritis telah terselesaikan.

Kumpulkan untuk laporan

  • Timestamp, OS host gateway + versi OpenClaw
  • Transkrip sesi + log tail singkat (setelah redaksi)
  • Apa yang dikirim penyerang + apa yang dilakukan agen
  • Apakah Gateway terekspos di luar loopback (LAN/Tailscale Funnel/Serve)

Pemindaian Rahasia (detect-secrets)

CI menjalankan hook pre-commit detect-secrets di job secrets. Push ke main selalu menjalankan pemindaian semua file. Pull request menggunakan jalur cepat file yang berubah saat commit dasar tersedia, dan fallback ke pemindaian semua file jika tidak. Jika gagal, ada kandidat baru yang belum ada dalam baseline.

Jika CI gagal

  1. Reproduksi secara lokal:
    pre-commit run --all-files detect-secrets
    
  2. Pahami tool:
    • detect-secrets dalam pre-commit menjalankan detect-secrets-hook dengan baseline dan exclude milik repo.
    • detect-secrets audit membuka tinjauan interaktif untuk menandai setiap item baseline sebagai nyata atau false positive.
  3. Untuk rahasia nyata: rotasi/hapus, lalu jalankan ulang pemindaian untuk memperbarui baseline.
  4. Untuk false positive: jalankan audit interaktif dan tandai sebagai false:
    detect-secrets audit .secrets.baseline
    
  5. Jika Anda memerlukan exclude baru, tambahkan ke .detect-secrets.cfg dan buat ulang baseline dengan flag --exclude-files / --exclude-lines yang sesuai (file config hanya untuk referensi; detect-secrets tidak membacanya secara otomatis).
Commit .secrets.baseline yang diperbarui setelah mencerminkan state yang dimaksud.

Melaporkan Masalah Keamanan

Menemukan kerentanan di OpenClaw? Mohon laporkan secara bertanggung jawab:
  1. Email: security@openclaw.ai
  2. Jangan posting secara publik sampai diperbaiki
  3. Kami akan memberi kredit kepada Anda (kecuali Anda memilih anonim)