Chuyển đến nội dung chính

Documentation Index

Fetch the complete documentation index at: https://docs2.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

Mô hình tin cậy của trợ lý cá nhân. Hướng dẫn này giả định một ranh giới người vận hành đáng tin cậy cho mỗi gateway (mô hình một người dùng, trợ lý cá nhân). OpenClaw không phải là ranh giới bảo mật đa đối tượng thuê thù địch cho nhiều người dùng đối kháng cùng dùng chung một agent hoặc gateway. Nếu bạn cần vận hành với mức độ tin cậy hỗn hợp hoặc người dùng đối kháng, hãy tách các ranh giới tin cậy (gateway riêng biệt + thông tin xác thực, lý tưởng là người dùng hệ điều hành hoặc host riêng biệt).

Trước tiên xác định phạm vi: mô hình bảo mật trợ lý cá nhân

Hướng dẫn bảo mật OpenClaw giả định một triển khai trợ lý cá nhân: một ranh giới người vận hành đáng tin cậy, có thể có nhiều agent.
  • Tư thế bảo mật được hỗ trợ: một người dùng/ranh giới tin cậy cho mỗi gateway (ưu tiên một người dùng hệ điều hành/host/VPS cho mỗi ranh giới).
  • Không phải là ranh giới bảo mật được hỗ trợ: một gateway/agent dùng chung bởi những người dùng không tin cậy lẫn nhau hoặc đối kháng.
  • Nếu cần cô lập người dùng đối kháng, hãy tách theo ranh giới tin cậy (gateway + thông tin xác thực riêng biệt, và lý tưởng là người dùng/host hệ điều hành riêng biệt).
  • Nếu nhiều người dùng không đáng tin cậy có thể nhắn tin cho một agent có bật công cụ, hãy xem họ như đang dùng chung cùng thẩm quyền công cụ được ủy quyền cho agent đó.
Trang này giải thích cách gia cố trong mô hình đó. Trang này không tuyên bố khả năng cô lập đa đối tượng thuê thù địch trên một gateway dùng chung.

Kiểm tra nhanh: openclaw security audit

Xem thêm: Xác minh hình thức (Mô hình bảo mật) Chạy lệnh này thường xuyên (đặc biệt sau khi thay đổi cấu hình hoặc mở các bề mặt mạng):
openclaw security audit
openclaw security audit --deep
openclaw security audit --fix
openclaw security audit --json
security audit --fix được giữ hẹp một cách có chủ ý: nó chuyển các chính sách nhóm mở phổ biến sang danh sách cho phép, khôi phục logging.redactSensitive: "tools", siết chặt quyền của state/config/include-file, và dùng đặt lại Windows ACL thay vì POSIX chmod khi chạy trên Windows. Nó gắn cờ các lỗi cấu hình phổ biến (phơi lộ xác thực Gateway, phơi lộ điều khiển trình duyệt, danh sách cho phép đặc quyền nâng cao, quyền hệ thống tệp, phê duyệt exec quá rộng, và phơi lộ công cụ trên kênh mở). OpenClaw vừa là sản phẩm vừa là thử nghiệm: bạn đang nối hành vi của mô hình tiên tiến vào các bề mặt nhắn tin thật và công cụ thật. Không có thiết lập nào “bảo mật hoàn hảo”. Mục tiêu là có chủ đích về:
  • ai có thể nói chuyện với bot của bạn
  • bot được phép hành động ở đâu
  • bot có thể chạm vào những gì
Bắt đầu với quyền truy cập nhỏ nhất vẫn hoạt động, rồi mở rộng khi bạn tự tin hơn.

Triển khai và tin cậy host

OpenClaw giả định ranh giới host và cấu hình là đáng tin cậy:
  • Nếu ai đó có thể sửa đổi state/config của host Gateway (~/.openclaw, bao gồm openclaw.json), hãy xem họ là người vận hành đáng tin cậy.
  • Chạy một Gateway cho nhiều người vận hành không tin cậy lẫn nhau/đối kháng không phải là thiết lập được khuyến nghị.
  • Với các nhóm có mức độ tin cậy hỗn hợp, hãy tách ranh giới tin cậy bằng các gateway riêng biệt (hoặc tối thiểu là người dùng/host hệ điều hành riêng biệt).
  • Mặc định được khuyến nghị: một người dùng cho mỗi máy/host (hoặc VPS), một gateway cho người dùng đó, và một hoặc nhiều agent trong gateway đó.
  • Trong một thực thể Gateway, quyền truy cập của người vận hành đã xác thực là vai trò mặt phẳng điều khiển đáng tin cậy, không phải vai trò đối tượng thuê theo từng người dùng.
  • Mã định danh phiên (sessionKey, ID phiên, nhãn) là bộ chọn định tuyến, không phải token ủy quyền.
  • Nếu nhiều người có thể nhắn tin cho một agent có bật công cụ, mỗi người trong số họ có thể điều khiển cùng bộ quyền đó. Cô lập phiên/bộ nhớ theo từng người dùng giúp bảo vệ quyền riêng tư, nhưng không biến một agent dùng chung thành ủy quyền host theo từng người dùng.

Thao tác tệp an toàn

OpenClaw dùng @openclaw/fs-safe cho quyền truy cập tệp bị giới hạn theo thư mục gốc, ghi nguyên tử, giải nén lưu trữ, workspace tạm, và helper tệp bí mật. OpenClaw mặc định tắt helper Python POSIX tùy chọn của fs-safe; chỉ đặt OPENCLAW_FS_SAFE_PYTHON_MODE=auto hoặc require khi bạn muốn gia cố thêm thao tác đột biến tương đối theo fd và có thể hỗ trợ runtime Python. Chi tiết: Thao tác tệp an toàn.

Workspace Slack dùng chung: rủi ro thực

Nếu “mọi người trong Slack đều có thể nhắn tin cho bot”, rủi ro cốt lõi là thẩm quyền công cụ được ủy quyền:
  • bất kỳ người gửi được phép nào cũng có thể khiến công cụ được gọi (exec, trình duyệt, công cụ mạng/tệp) trong phạm vi chính sách của agent;
  • tiêm prompt/nội dung từ một người gửi có thể gây ra hành động ảnh hưởng đến state, thiết bị hoặc đầu ra dùng chung;
  • nếu một agent dùng chung có thông tin xác thực/tệp nhạy cảm, bất kỳ người gửi được phép nào cũng có thể có khả năng thúc đẩy rò rỉ dữ liệu qua việc dùng công cụ.
Dùng các agent/gateway riêng biệt với công cụ tối thiểu cho quy trình làm việc nhóm; giữ riêng tư các agent chứa dữ liệu cá nhân.

Agent dùng chung trong công ty: mẫu chấp nhận được

Điều này chấp nhận được khi tất cả mọi người dùng agent đó nằm trong cùng ranh giới tin cậy (ví dụ một nhóm công ty) và agent được giới hạn nghiêm ngặt cho công việc.
  • chạy nó trên một máy/VM/container chuyên dụng;
  • dùng một người dùng hệ điều hành riêng + trình duyệt/hồ sơ/tài khoản riêng cho runtime đó;
  • không đăng nhập runtime đó vào tài khoản Apple/Google cá nhân hoặc hồ sơ trình quản lý mật khẩu/trình duyệt cá nhân.
Nếu bạn trộn danh tính cá nhân và công ty trên cùng runtime, bạn làm sụp đổ sự tách biệt và tăng rủi ro phơi lộ dữ liệu cá nhân.

Khái niệm tin cậy Gateway và Node

Xem Gateway và node là một miền tin cậy của người vận hành, với các vai trò khác nhau:
  • Gateway là mặt phẳng điều khiển và bề mặt chính sách (gateway.auth, chính sách công cụ, định tuyến).
  • Node là bề mặt thực thi từ xa được ghép cặp với Gateway đó (lệnh, hành động thiết bị, năng lực cục bộ của host).
  • Một bên gọi đã xác thực với Gateway được tin cậy ở phạm vi Gateway. Sau khi ghép cặp, hành động của node là hành động người vận hành đáng tin cậy trên node đó.
  • Các cấp phạm vi người vận hành và kiểm tra tại thời điểm phê duyệt được tóm tắt trong Phạm vi người vận hành.
  • Các client backend loopback trực tiếp đã xác thực bằng token/mật khẩu gateway dùng chung có thể thực hiện RPC mặt phẳng điều khiển nội bộ mà không cần trình bày danh tính thiết bị người dùng. Đây không phải là cách bỏ qua ghép cặp từ xa hoặc trình duyệt: các client mạng, client node, client token thiết bị, và danh tính thiết bị rõ ràng vẫn đi qua ghép cặp và thực thi nâng cấp phạm vi.
  • sessionKey là chọn định tuyến/ngữ cảnh, không phải xác thực theo từng người dùng.
  • Phê duyệt exec (danh sách cho phép + hỏi) là lan can cho ý định của người vận hành, không phải cô lập đa đối tượng thuê thù địch.
  • Mặc định sản phẩm của OpenClaw cho các thiết lập một người vận hành đáng tin cậy là exec trên host tại gateway/node được cho phép mà không có lời nhắc phê duyệt (security="full", ask="off" trừ khi bạn siết chặt). Mặc định đó là UX có chủ đích, tự thân nó không phải là lỗ hổng.
  • Phê duyệt exec gắn với ngữ cảnh yêu cầu chính xác và các toán hạng tệp cục bộ trực tiếp theo nỗ lực tốt nhất; chúng không mô hình hóa về mặt ngữ nghĩa mọi đường dẫn loader runtime/interpreter. Hãy dùng sandboxing và cô lập host cho các ranh giới mạnh.
Nếu bạn cần cô lập người dùng thù địch, hãy tách ranh giới tin cậy theo người dùng/host hệ điều hành và chạy các gateway riêng biệt.

Ma trận ranh giới tin cậy

Dùng bảng này làm mô hình nhanh khi phân loại rủi ro:
Ranh giới hoặc kiểm soátÝ nghĩaCách hiểu sai phổ biến
gateway.auth (token/password/trusted-proxy/device auth)Xác thực bên gọi với API gateway”Cần chữ ký theo từng tin nhắn trên mọi frame mới bảo mật”
sessionKeyKhóa định tuyến để chọn ngữ cảnh/phiên”Khóa phiên là ranh giới xác thực người dùng”
Lan can prompt/nội dungGiảm rủi ro lạm dụng mô hình”Chỉ riêng prompt injection đã chứng minh bypass xác thực”
canvas.eval / browser evaluateNăng lực người vận hành có chủ đích khi được bật”Bất kỳ nguyên thủy JS eval nào cũng tự động là lỗ hổng trong mô hình tin cậy này”
Shell ! TUI cục bộThực thi cục bộ do người vận hành kích hoạt rõ ràng”Lệnh tiện lợi shell cục bộ là tiêm từ xa”
Ghép cặp Node và lệnh nodeThực thi từ xa cấp người vận hành trên thiết bị đã ghép cặp”Điều khiển thiết bị từ xa nên mặc định được xem là quyền truy cập người dùng không đáng tin cậy”
gateway.nodes.pairing.autoApproveCidrsChính sách ghi danh node trên mạng đáng tin cậy theo opt-in”Danh sách cho phép bị tắt mặc định là lỗ hổng ghép cặp tự động”

Không phải lỗ hổng theo thiết kế

Các mẫu này thường được báo cáo và thường bị đóng mà không hành động trừ khi chứng minh được một bypass ranh giới thực:
  • Chuỗi chỉ dựa trên prompt injection mà không bypass chính sách, xác thực hoặc sandbox.
  • Tuyên bố giả định vận hành đa đối tượng thuê thù địch trên một host hoặc cấu hình dùng chung.
  • Tuyên bố phân loại quyền truy cập đường đọc thông thường của người vận hành (ví dụ sessions.list / sessions.preview / chat.history) là IDOR trong một thiết lập gateway dùng chung.
  • Phát hiện về triển khai chỉ trên localhost (ví dụ HSTS trên gateway chỉ loopback).
  • Phát hiện chữ ký Discord inbound webhook cho các đường inbound không tồn tại trong repo này.
  • Báo cáo xem metadata ghép cặp node là một lớp phê duyệt theo từng lệnh thứ hai bị ẩn cho system.run, trong khi ranh giới thực thi thực tế vẫn là chính sách lệnh node toàn cục của gateway cộng với phê duyệt exec riêng của node.
  • Báo cáo xem gateway.nodes.pairing.autoApproveCidrs đã cấu hình là lỗ hổng tự thân. Thiết lập này bị tắt theo mặc định, yêu cầu mục CIDR/IP rõ ràng, chỉ áp dụng cho ghép cặp role: node lần đầu với không có phạm vi được yêu cầu, và không tự động phê duyệt operator/browser/Control UI, WebChat, nâng cấp vai trò, nâng cấp phạm vi, thay đổi metadata, thay đổi public-key, hoặc đường dẫn header trusted-proxy loopback cùng host trừ khi xác thực trusted-proxy loopback đã được bật rõ ràng.
  • Phát hiện “thiếu ủy quyền theo từng người dùng” xem sessionKey là token xác thực.

Đường cơ sở gia cố trong 60 giây

Dùng đường cơ sở này trước, rồi bật lại có chọn lọc các công cụ cho từng agent đáng tin cậy:
{
  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 } } },
  },
}
Điều này giữ Gateway chỉ cục bộ, cô lập DM, và mặc định tắt các công cụ mặt phẳng điều khiển/runtime.

Quy tắc nhanh cho hộp thư dùng chung

Nếu nhiều hơn một người có thể DM bot của bạn:
  • Đặt session.dmScope: "per-channel-peer" (hoặc "per-account-channel-peer" cho các kênh đa tài khoản).
  • Giữ dmPolicy: "pairing" hoặc danh sách cho phép nghiêm ngặt.
  • Không bao giờ kết hợp DM dùng chung với quyền truy cập công cụ rộng.
  • Điều này gia cố các hộp thư hợp tác/dùng chung, nhưng không được thiết kế làm cô lập đối tượng thuê chung thù địch khi người dùng chia sẻ quyền ghi host/config.

Mô hình hiển thị ngữ cảnh

OpenClaw tách hai khái niệm:
  • Ủy quyền kích hoạt: ai có thể kích hoạt agent (dmPolicy, groupPolicy, danh sách cho phép, cổng nhắc tên).
  • Hiển thị ngữ cảnh: ngữ cảnh bổ sung nào được chèn vào đầu vào mô hình (nội dung trả lời, văn bản được trích dẫn, lịch sử luồng, metadata chuyển tiếp).
Danh sách cho phép kiểm soát kích hoạt và ủy quyền lệnh. Thiết lập contextVisibility kiểm soát cách lọc ngữ cảnh bổ sung (trả lời được trích dẫn, gốc luồng, lịch sử đã tải):
  • contextVisibility: "all" (mặc định) giữ ngữ cảnh bổ sung đúng như đã nhận.
  • contextVisibility: "allowlist" lọc ngữ cảnh bổ sung để chỉ gửi đến những người gửi được các kiểm tra danh sách cho phép đang hoạt động cho phép.
  • contextVisibility: "allowlist_quote" hoạt động như allowlist, nhưng vẫn giữ một phản hồi được trích dẫn rõ ràng.
Đặt contextVisibility theo từng kênh hoặc từng phòng/cuộc trò chuyện. Xem Cuộc trò chuyện nhóm để biết chi tiết thiết lập. Hướng dẫn phân loại tư vấn:
  • Những tuyên bố chỉ cho thấy “mô hình có thể thấy văn bản được trích dẫn hoặc văn bản lịch sử từ người gửi không nằm trong danh sách cho phép” là các phát hiện gia cố có thể xử lý bằng contextVisibility, tự thân chúng không phải là vượt qua ranh giới xác thực hoặc sandbox.
  • Để có tác động bảo mật, báo cáo vẫn cần chứng minh được việc vượt qua ranh giới tin cậy (xác thực, chính sách, sandbox, phê duyệt, hoặc một ranh giới khác đã được tài liệu hóa).

Nội dung kiểm toán kiểm tra (mức cao)

  • Truy cập đầu vào (chính sách DM, chính sách nhóm, danh sách cho phép): người lạ có thể kích hoạt bot không?
  • Phạm vi ảnh hưởng của công cụ (công cụ nâng quyền + phòng mở): prompt injection có thể biến thành hành động shell/tệp/mạng không?
  • Độ lệch hệ thống tệp của exec: các công cụ hệ thống tệp có sửa đổi có bị từ chối trong khi exec/process vẫn khả dụng mà không có ràng buộc hệ thống tệp sandbox không?
  • Độ lệch phê duyệt exec (security=full, autoAllowSkills, danh sách cho phép trình thông dịch không có strictInlineEval): các rào chắn host-exec có còn hoạt động như bạn nghĩ không?
    • security="full" là cảnh báo tư thế rộng, không phải bằng chứng về lỗi. Đây là mặc định được chọn cho các thiết lập trợ lý cá nhân đáng tin cậy; chỉ siết chặt khi mô hình đe dọa của bạn cần rào chắn phê duyệt hoặc danh sách cho phép.
  • Phơi bày mạng (Gateway bind/xác thực, Tailscale Serve/Funnel, token xác thực yếu/ngắn).
  • Phơi bày điều khiển trình duyệt (node từ xa, cổng relay, điểm cuối CDP từ xa).
  • Vệ sinh đĩa cục bộ (quyền, symlink, include cấu hình, đường dẫn “thư mục được đồng bộ”).
  • Plugins (plugins tải mà không có danh sách cho phép rõ ràng).
  • Độ lệch chính sách/cấu hình sai (cài đặt docker sandbox đã cấu hình nhưng chế độ sandbox tắt; mẫu gateway.nodes.denyCommands không hiệu quả vì khớp chỉ theo đúng tên lệnh (ví dụ system.run) và không kiểm tra văn bản shell; mục gateway.nodes.allowCommands nguy hiểm; tools.profile="minimal" toàn cục bị cấu hình theo từng agent ghi đè; công cụ do plugin sở hữu có thể truy cập dưới chính sách công cụ dễ dãi).
  • Độ lệch kỳ vọng runtime (ví dụ giả định exec ngầm định vẫn có nghĩa là sandbox khi tools.exec.host hiện mặc định là auto, hoặc đặt rõ tools.exec.host="sandbox" trong khi chế độ sandbox đang tắt).
  • Vệ sinh mô hình (cảnh báo khi mô hình đã cấu hình trông có vẻ cũ; không phải chặn cứng).
Nếu bạn chạy --deep, OpenClaw cũng cố gắng thăm dò Gateway trực tiếp theo khả năng tốt nhất.

Bản đồ lưu trữ thông tin xác thực

Dùng phần này khi kiểm toán truy cập hoặc quyết định cần sao lưu gì:
  • WhatsApp: ~/.openclaw/credentials/whatsapp/<accountId>/creds.json
  • Token bot Telegram: config/env hoặc channels.telegram.tokenFile (chỉ tệp thường; symlink bị từ chối)
  • Token bot Discord: config/env hoặc SecretRef (nhà cung cấp env/file/exec)
  • Token Slack: config/env (channels.slack.*)
  • Danh sách cho phép ghép đôi:
    • ~/.openclaw/credentials/<channel>-allowFrom.json (tài khoản mặc định)
    • ~/.openclaw/credentials/<channel>-<accountId>-allowFrom.json (tài khoản không mặc định)
  • Hồ sơ xác thực mô hình: ~/.openclaw/agents/<agentId>/agent/auth-profiles.json
  • Trạng thái runtime Codex: ~/.openclaw/agents/<agentId>/agent/codex-home/
  • Payload bí mật dựa trên tệp (tùy chọn): ~/.openclaw/secrets.json
  • Nhập OAuth cũ: ~/.openclaw/credentials/oauth.json

Danh sách kiểm tra kiểm toán bảo mật

Khi kiểm toán in các phát hiện, hãy xử lý theo thứ tự ưu tiên này:
  1. Bất cứ thứ gì “mở” + công cụ được bật: khóa DM/nhóm trước (ghép đôi/danh sách cho phép), sau đó siết chính sách công cụ/sandboxing.
  2. Phơi bày mạng công khai (LAN bind, Funnel, thiếu xác thực): sửa ngay.
  3. Phơi bày điều khiển trình duyệt từ xa: xử lý như quyền truy cập của operator (chỉ tailnet, ghép đôi node có chủ đích, tránh phơi bày công khai).
  4. Quyền: bảo đảm trạng thái/cấu hình/thông tin xác thực/xác thực không cho nhóm/mọi người đọc.
  5. Plugins: chỉ tải những gì bạn tin cậy rõ ràng.
  6. Lựa chọn mô hình: ưu tiên các mô hình hiện đại, được gia cố theo chỉ dẫn cho bất kỳ bot nào có công cụ.

Thuật ngữ kiểm toán bảo mật

Mỗi phát hiện kiểm toán được khóa bằng một checkId có cấu trúc (ví dụ gateway.bind_no_auth hoặc tools.exec.security_full_configured). Các lớp mức độ nghiêm trọng nghiêm trọng phổ biến:
  • fs.* - quyền hệ thống tệp trên trạng thái, cấu hình, thông tin xác thực, hồ sơ xác thực.
  • gateway.* - chế độ bind, xác thực, Tailscale, Control UI, thiết lập trusted-proxy.
  • hooks.*, browser.*, sandbox.*, tools.exec.* - gia cố theo từng bề mặt.
  • plugins.*, skills.* - chuỗi cung ứng plugin/skill và phát hiện quét.
  • security.exposure.* - các kiểm tra xuyên suốt nơi chính sách truy cập gặp phạm vi ảnh hưởng của công cụ.
Xem danh mục đầy đủ với mức độ nghiêm trọng, khóa sửa lỗi, và hỗ trợ tự động sửa tại Kiểm tra kiểm toán bảo mật.

Control UI qua HTTP

Control UI cần một ngữ cảnh bảo mật (HTTPS hoặc localhost) để tạo danh tính thiết bị. gateway.controlUi.allowInsecureAuth là nút bật/tắt tương thích cục bộ:
  • Trên localhost, nó cho phép xác thực Control UI không có danh tính thiết bị khi trang được tải qua HTTP không bảo mật.
  • Nó không vượt qua các kiểm tra ghép đôi.
  • Nó không nới lỏng yêu cầu danh tính thiết bị từ xa (không phải localhost).
Ưu tiên HTTPS (Tailscale Serve) hoặc mở UI trên 127.0.0.1. Chỉ dành cho kịch bản phá kính khẩn cấp, gateway.controlUi.dangerouslyDisableDeviceAuth tắt hoàn toàn các kiểm tra danh tính thiết bị. Đây là mức hạ cấp bảo mật nghiêm trọng; hãy để tắt trừ khi bạn đang chủ động gỡ lỗi và có thể hoàn nguyên nhanh. Tách biệt với các cờ nguy hiểm đó, gateway.auth.mode: "trusted-proxy" thành công có thể cho phép các phiên Control UI của operator không có danh tính thiết bị. Đó là hành vi có chủ đích của chế độ xác thực, không phải lối tắt allowInsecureAuth, và nó vẫn không mở rộng đến các phiên Control UI vai trò node. openclaw security audit cảnh báo khi cài đặt này được bật.

Tóm tắt cờ không an toàn hoặc nguy hiểm

openclaw security audit phát sinh config.insecure_or_dangerous_flags khi các công tắc gỡ lỗi không an toàn/nguy hiểm đã biết được bật. Hãy để các công tắc này chưa đặt trong production.
  • 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
Control UI và trình duyệt:
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback
  • gateway.controlUi.dangerouslyDisableDeviceAuth
  • browser.ssrfPolicy.dangerouslyAllowPrivateNetwork
Khớp tên kênh (kênh đi kèm và kênh plugin; cũng khả dụng theo từng accounts.<accountId> khi áp dụng):
  • channels.discord.dangerouslyAllowNameMatching
  • channels.slack.dangerouslyAllowNameMatching
  • channels.googlechat.dangerouslyAllowNameMatching
  • channels.msteams.dangerouslyAllowNameMatching
  • channels.synology-chat.dangerouslyAllowNameMatching (kênh plugin)
  • channels.synology-chat.dangerouslyAllowInheritedWebhookPath (kênh plugin)
  • channels.zalouser.dangerouslyAllowNameMatching (kênh plugin)
  • channels.irc.dangerouslyAllowNameMatching (kênh plugin)
  • channels.mattermost.dangerouslyAllowNameMatching (kênh plugin)
Phơi bày mạng:
  • channels.telegram.network.dangerouslyAllowPrivateNetwork (cũng theo từng tài khoản)
Sandbox Docker (mặc định + theo từng agent):
  • agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets
  • agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources
  • agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin

Cấu hình reverse proxy

Nếu bạn chạy Gateway phía sau reverse proxy (nginx, Caddy, Traefik, v.v.), hãy cấu hình gateway.trustedProxies để xử lý IP client được chuyển tiếp đúng cách. Khi Gateway phát hiện header proxy từ một địa chỉ không nằm trong trustedProxies, nó sẽ không xem các kết nối là client cục bộ. Nếu xác thực gateway bị tắt, các kết nối đó sẽ bị từ chối. Điều này ngăn bypass xác thực khi các kết nối qua proxy lẽ ra có vẻ đến từ localhost và nhận tin cậy tự động. gateway.trustedProxies cũng cấp dữ liệu cho gateway.auth.mode: "trusted-proxy", nhưng chế độ xác thực đó nghiêm ngặt hơn:
  • xác thực trusted-proxy mặc định thất bại đóng đối với proxy nguồn loopback
  • reverse proxy loopback cùng máy có thể dùng gateway.trustedProxies để phát hiện client cục bộ và xử lý IP được chuyển tiếp
  • reverse proxy loopback cùng máy chỉ có thể thỏa mãn gateway.auth.mode: "trusted-proxy" khi gateway.auth.trustedProxy.allowLoopback = true; nếu không hãy dùng xác thực token/mật khẩu
gateway:
  trustedProxies:
    - "10.0.0.1" # reverse proxy IP
  # Optional. Default false.
  # Only enable if your proxy cannot provide X-Forwarded-For.
  allowRealIpFallback: false
  auth:
    mode: password
    password: ${OPENCLAW_GATEWAY_PASSWORD}
Khi trustedProxies được cấu hình, Gateway dùng X-Forwarded-For để xác định IP client. X-Real-IP mặc định bị bỏ qua trừ khi gateway.allowRealIpFallback: true được đặt rõ ràng. Header trusted proxy không làm cho việc ghép đôi thiết bị node tự động được tin cậy. gateway.nodes.pairing.autoApproveCidrs là chính sách operator riêng, mặc định bị tắt. Ngay cả khi được bật, các đường dẫn header trusted-proxy nguồn loopback bị loại khỏi tự động phê duyệt node vì caller cục bộ có thể giả mạo các header đó, bao gồm cả khi xác thực trusted-proxy loopback được bật rõ ràng. Hành vi reverse proxy tốt (ghi đè header chuyển tiếp đến):
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
Hành vi reverse proxy xấu (nối thêm/giữ lại header chuyển tiếp không đáng tin cậy):
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Ghi chú HSTS và origin

  • OpenClaw gateway ưu tiên cục bộ/loopback. Nếu bạn kết thúc TLS tại reverse proxy, hãy đặt HSTS trên miền HTTPS hướng proxy ở đó.
  • Nếu chính gateway kết thúc HTTPS, bạn có thể đặt gateway.http.securityHeaders.strictTransportSecurity để phát header HSTS từ phản hồi OpenClaw.
  • Hướng dẫn triển khai chi tiết nằm trong Xác thực Trusted Proxy.
  • Đối với triển khai Control UI không phải loopback, mặc định bắt buộc có gateway.controlUi.allowedOrigins.
  • gateway.controlUi.allowedOrigins: ["*"] là chính sách origin trình duyệt cho phép tất cả rõ ràng, không phải mặc định được gia cố. Tránh dùng ngoài kiểm thử cục bộ được kiểm soát chặt chẽ.
  • Lỗi xác thực origin trình duyệt trên loopback vẫn bị giới hạn tốc độ ngay cả khi miễn trừ loopback chung được bật, nhưng khóa khóa tạm thời được giới hạn theo từng giá trị Origin đã chuẩn hóa thay vì một bucket localhost dùng chung.
  • gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true bật chế độ fallback origin theo Host-header; hãy coi đó là chính sách nguy hiểm do operator chọn.
  • Xử lý DNS rebinding và hành vi header proxy-host như các mối quan tâm gia cố triển khai; giữ trustedProxies chặt chẽ và tránh phơi bày gateway trực tiếp ra internet công cộng.

Nhật ký phiên cục bộ nằm trên đĩa

OpenClaw lưu bản ghi phiên trên đĩa tại ~/.openclaw/agents/<agentId>/sessions/*.jsonl. Điều này là bắt buộc để duy trì tính liên tục của phiên và (tùy chọn) lập chỉ mục bộ nhớ phiên, nhưng cũng có nghĩa là bất kỳ tiến trình/người dùng nào có quyền truy cập hệ thống tệp đều có thể đọc các nhật ký đó. Hãy coi quyền truy cập đĩa là ranh giới tin cậy và siết chặt quyền trên ~/.openclaw (xem phần kiểm tra bên dưới). Nếu bạn cần cách ly mạnh hơn giữa các agent, hãy chạy chúng dưới các người dùng HĐH riêng biệt hoặc trên các máy chủ riêng biệt.

Thực thi Node (system.run)

Nếu một node macOS đã được ghép đôi, Gateway có thể gọi system.run trên node đó. Đây là thực thi mã từ xa trên máy Mac:
  • Yêu cầu ghép đôi node (phê duyệt + token).
  • Ghép đôi node Gateway không phải là bề mặt phê duyệt theo từng lệnh. Nó thiết lập danh tính/tin cậy của node và cấp phát token.
  • Gateway áp dụng chính sách lệnh node toàn cục thô thông qua gateway.nodes.allowCommands / denyCommands.
  • Được điều khiển trên máy Mac qua Settings → Exec approvals (bảo mật + hỏi + danh sách cho phép).
  • Chính sách system.run theo từng node là tệp phê duyệt exec riêng của node (exec.approvals.node.*), có thể nghiêm ngặt hơn hoặc lỏng hơn chính sách ID lệnh toàn cục của gateway.
  • Một node chạy với security="full"ask="off" đang tuân theo mô hình toán tử tin cậy mặc định. Hãy coi đó là hành vi dự kiến trừ khi triển khai của bạn yêu cầu rõ ràng một lập trường phê duyệt hoặc danh sách cho phép chặt hơn.
  • Chế độ phê duyệt ràng buộc đúng ngữ cảnh yêu cầu và, khi có thể, một toán hạng script/tệp cục bộ cụ thể. Nếu OpenClaw không thể xác định chính xác một tệp cục bộ trực tiếp cho lệnh trình thông dịch/runtime, thực thi dựa trên phê duyệt sẽ bị từ chối thay vì hứa hẹn bao phủ đầy đủ về ngữ nghĩa.
  • Đối với host=node, các lần chạy dựa trên phê duyệt cũng lưu một systemRunPlan chuẩn đã chuẩn bị; các lần chuyển tiếp đã phê duyệt sau đó dùng lại kế hoạch đã lưu đó, và việc xác thực gateway từ chối các chỉnh sửa của bên gọi đối với lệnh/cwd/ngữ cảnh phiên sau khi yêu cầu phê duyệt đã được tạo.
  • Nếu bạn không muốn thực thi từ xa, hãy đặt bảo mật thành deny và gỡ ghép đôi node cho máy Mac đó.
Sự phân biệt này quan trọng khi phân loại:
  • Một node đã ghép đôi đang kết nối lại và quảng bá một danh sách lệnh khác tự nó không phải là lỗ hổng nếu chính sách toàn cục của Gateway và các phê duyệt exec cục bộ của node vẫn thực thi ranh giới thực thi thực tế.
  • Các báo cáo coi siêu dữ liệu ghép đôi node là một lớp phê duyệt theo từng lệnh ẩn thứ hai thường là nhầm lẫn chính sách/UX, không phải vượt qua ranh giới bảo mật.

Skills động (watcher / node từ xa)

OpenClaw có thể làm mới danh sách Skills giữa phiên:
  • Trình theo dõi Skills: các thay đổi đối với SKILL.md có thể cập nhật ảnh chụp Skills ở lượt agent tiếp theo.
  • Node từ xa: việc kết nối một node macOS có thể khiến các Skills chỉ dành cho macOS đủ điều kiện (dựa trên dò tìm bin).
Hãy coi các thư mục Skills là mã tin cậy và hạn chế người có thể sửa đổi chúng.

Mô hình mối đe dọa

Trợ lý AI của bạn có thể:
  • Thực thi lệnh shell tùy ý
  • Đọc/ghi tệp
  • Truy cập dịch vụ mạng
  • Gửi tin nhắn cho bất kỳ ai (nếu bạn cấp cho nó quyền truy cập WhatsApp)
Những người nhắn tin cho bạn có thể:
  • Cố lừa AI của bạn làm việc xấu
  • Dùng kỹ thuật xã hội để truy cập dữ liệu của bạn
  • Thăm dò chi tiết hạ tầng

Khái niệm cốt lõi: kiểm soát truy cập trước trí thông minh

Hầu hết lỗi ở đây không phải là khai thác tinh vi - mà là “ai đó nhắn cho bot và bot làm theo điều họ yêu cầu.” Lập trường của OpenClaw:
  • Danh tính trước: quyết định ai có thể nói chuyện với bot (ghép đôi DM / danh sách cho phép / “open” rõ ràng).
  • Phạm vi tiếp theo: quyết định bot được phép hành động ở đâu (danh sách cho phép nhóm + yêu cầu nhắc tên, công cụ, sandboxing, quyền thiết bị).
  • Mô hình sau cùng: giả định mô hình có thể bị thao túng; thiết kế sao cho việc thao túng có phạm vi tác động hạn chế.

Mô hình ủy quyền lệnh

Lệnh slash và chỉ thị chỉ được tôn trọng đối với người gửi được ủy quyền. Ủy quyền được suy ra từ danh sách cho phép/ghép đôi của kênh cộng với commands.useAccessGroups (xem Cấu hìnhLệnh slash). Nếu danh sách cho phép của một kênh trống hoặc bao gồm "*", lệnh trên thực tế được mở cho kênh đó. /exec chỉ là tiện ích theo phiên cho các toán tử được ủy quyền. Nó không ghi cấu hình hoặc thay đổi các phiên khác.

Rủi ro của công cụ mặt phẳng điều khiển

Hai công cụ tích hợp có thể tạo các thay đổi mặt phẳng điều khiển lâu dài:
  • gateway có thể kiểm tra cấu hình bằng config.schema.lookup / config.get, và có thể tạo thay đổi lâu dài bằng config.apply, config.patch, và update.run.
  • cron có thể tạo các tác vụ đã lên lịch tiếp tục chạy sau khi cuộc trò chuyện/tác vụ ban đầu kết thúc.
Công cụ runtime gateway chỉ dành cho chủ sở hữu vẫn từ chối viết lại tools.exec.ask hoặc tools.exec.security; các alias tools.bash.* cũ được chuẩn hóa về cùng các đường dẫn exec được bảo vệ trước khi ghi. Các chỉnh sửa gateway config.applygateway config.patch do agent điều khiển mặc định fail-closed: chỉ một tập hẹp các đường dẫn prompt, mô hình và yêu cầu nhắc tên có thể được agent điều chỉnh. Vì vậy, các cây cấu hình nhạy cảm mới được bảo vệ trừ khi chúng được cố ý thêm vào danh sách cho phép. Với bất kỳ agent/bề mặt nào xử lý nội dung không đáng tin cậy, hãy mặc định từ chối các mục này:
{
  tools: {
    deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],
  },
}
commands.restart=false chỉ chặn hành động khởi động lại. Nó không tắt các hành động cấu hình/cập nhật gateway.

Plugin

Plugin chạy trong cùng tiến trình với Gateway. Hãy coi chúng là mã tin cậy:
  • Chỉ cài đặt Plugin từ các nguồn bạn tin cậy.
  • Ưu tiên danh sách cho phép plugins.allow rõ ràng.
  • Xem lại cấu hình Plugin trước khi bật.
  • Khởi động lại Gateway sau các thay đổi Plugin.
  • Nếu bạn cài đặt hoặc cập nhật Plugin (openclaw plugins install <package>, openclaw plugins update <id>), hãy coi việc đó như chạy mã không đáng tin cậy:
    • Đường dẫn cài đặt là thư mục theo từng Plugin dưới gốc cài đặt Plugin đang hoạt động.
    • OpenClaw chạy một lượt quét mã nguy hiểm tích hợp trước khi cài đặt/cập nhật. Các phát hiện critical mặc định sẽ chặn.
    • Cài đặt Plugin từ npm và git chỉ chạy hội tụ phụ thuộc của trình quản lý gói trong luồng cài đặt/cập nhật rõ ràng. Đường dẫn cục bộ và kho lưu trữ được coi là các gói Plugin tự chứa; OpenClaw sao chép/tham chiếu chúng mà không chạy npm install.
    • Ưu tiên phiên bản được ghim, chính xác (@scope/pkg@1.2.3), và kiểm tra mã đã giải nén trên đĩa trước khi bật.
    • --dangerously-force-unsafe-install chỉ là cơ chế phá kính cho kết quả dương tính giả của lượt quét tích hợp trong các luồng cài đặt/cập nhật Plugin. Nó không bỏ qua các chặn chính sách hook before_install của Plugin và không bỏ qua lỗi quét.
    • Các lượt cài đặt phụ thuộc Skills được Gateway hỗ trợ tuân theo cùng phân tách nguy hiểm/đáng ngờ: các phát hiện critical tích hợp sẽ chặn trừ khi bên gọi đặt rõ dangerouslyForceUnsafeInstall, trong khi các phát hiện đáng ngờ vẫn chỉ cảnh báo. openclaw skills install vẫn là luồng tải xuống/cài đặt Skills ClawHub riêng biệt.
Chi tiết: Plugin

Mô hình truy cập DM: ghép đôi, danh sách cho phép, mở, tắt

Tất cả các kênh hiện có khả năng DM đều hỗ trợ chính sách DM (dmPolicy hoặc *.dm.policy) kiểm soát DM đến trước khi tin nhắn được xử lý:
  • pairing (mặc định): người gửi không xác định nhận một mã ghép đôi ngắn và bot bỏ qua tin nhắn của họ cho đến khi được phê duyệt. Mã hết hạn sau 1 giờ; các DM lặp lại sẽ không gửi lại mã cho đến khi một yêu cầu mới được tạo. Các yêu cầu đang chờ được giới hạn mặc định ở 3 mỗi kênh.
  • allowlist: người gửi không xác định bị chặn (không có bắt tay ghép đôi).
  • open: cho phép bất kỳ ai DM (công khai). Yêu cầu danh sách cho phép của kênh bao gồm "*" (chọn tham gia rõ ràng).
  • disabled: bỏ qua hoàn toàn DM đến.
Phê duyệt qua CLI:
openclaw pairing list <channel>
openclaw pairing approve <channel> <code>
Chi tiết + tệp trên đĩa: Ghép đôi

Cách ly phiên DM (chế độ nhiều người dùng)

Theo mặc định, OpenClaw định tuyến tất cả DM vào phiên chính để trợ lý của bạn có tính liên tục giữa thiết bị và kênh. Nếu nhiều người có thể DM bot (DM mở hoặc danh sách cho phép nhiều người), hãy cân nhắc cách ly phiên DM:
{
  session: { dmScope: "per-channel-peer" },
}
Điều này ngăn rò rỉ ngữ cảnh giữa người dùng trong khi vẫn giữ cuộc trò chuyện nhóm được cách ly. Đây là ranh giới ngữ cảnh nhắn tin, không phải ranh giới quản trị máy chủ. Nếu người dùng đối kháng lẫn nhau và chia sẻ cùng máy chủ/cấu hình Gateway, hãy chạy các gateway riêng cho từng ranh giới tin cậy.

Chế độ DM an toàn (khuyến nghị)

Hãy coi đoạn cấu hình trên là chế độ DM an toàn:
  • Mặc định: session.dmScope: "main" (tất cả DM dùng chung một phiên để duy trì tính liên tục).
  • Mặc định onboarding CLI cục bộ: ghi session.dmScope: "per-channel-peer" khi chưa đặt (giữ nguyên các giá trị rõ ràng hiện có).
  • Chế độ DM an toàn: session.dmScope: "per-channel-peer" (mỗi cặp kênh+người gửi nhận một ngữ cảnh DM cách ly).
  • Cách ly peer xuyên kênh: session.dmScope: "per-peer" (mỗi người gửi nhận một phiên trên tất cả các kênh cùng loại).
Nếu bạn chạy nhiều tài khoản trên cùng một kênh, hãy dùng per-account-channel-peer thay thế. Nếu cùng một người liên hệ với bạn trên nhiều kênh, hãy dùng session.identityLinks để gộp các phiên DM đó thành một danh tính chuẩn. Xem Quản lý phiênCấu hình.

Danh sách cho phép cho DM và nhóm

OpenClaw có hai lớp “ai có thể kích hoạt tôi?” riêng biệt:
  • Danh sách cho phép DM (allowFrom / channels.discord.allowFrom / channels.slack.allowFrom; cũ: channels.discord.dm.allowFrom, channels.slack.dm.allowFrom): ai được phép nói chuyện với bot trong tin nhắn trực tiếp.
    • Khi dmPolicy="pairing", các phê duyệt được ghi vào kho danh sách cho phép ghép đôi theo phạm vi tài khoản dưới ~/.openclaw/credentials/ (<channel>-allowFrom.json cho tài khoản mặc định, <channel>-<accountId>-allowFrom.json cho tài khoản không mặc định), được hợp nhất với danh sách cho phép trong cấu hình.
  • Danh sách cho phép nhóm (theo từng kênh): nhóm/kênh/guild nào mà bot sẽ chấp nhận tin nhắn.
    • Các mẫu phổ biến:
      • channels.whatsapp.groups, channels.telegram.groups, channels.imessage.groups: mặc định theo từng nhóm như requireMention; khi được đặt, nó cũng đóng vai trò như danh sách cho phép nhóm (bao gồm "*" để giữ hành vi cho phép tất cả).
      • groupPolicy="allowlist" + groupAllowFrom: giới hạn ai có thể kích hoạt bot bên trong một phiên nhóm (WhatsApp/Telegram/Signal/iMessage/Microsoft Teams).
      • channels.discord.guilds / channels.slack.channels: danh sách cho phép theo từng bề mặt + mặc định nhắc tên.
    • Kiểm tra nhóm chạy theo thứ tự này: groupPolicy/danh sách cho phép nhóm trước, kích hoạt bằng nhắc tên/trả lời sau.
    • Trả lời tin nhắn của bot (nhắc tên ngầm) không bỏ qua danh sách cho phép người gửi như groupAllowFrom.
    • Ghi chú bảo mật: hãy coi dmPolicy="open"groupPolicy="open" là các thiết lập phương án cuối. Chúng chỉ nên được dùng rất ít; ưu tiên ghép đôi + danh sách cho phép trừ khi bạn hoàn toàn tin tưởng mọi thành viên trong phòng.
Chi tiết: Cấu hìnhNhóm

Prompt injection (nó là gì, vì sao quan trọng)

Prompt injection là khi kẻ tấn công tạo một tin nhắn thao túng mô hình làm điều không an toàn (“bỏ qua hướng dẫn của bạn”, “xuất hệ thống tệp của bạn”, “theo liên kết này và chạy lệnh”, v.v.). Ngay cả với system prompt mạnh, prompt injection vẫn chưa được giải quyết. Các lan can system prompt chỉ là hướng dẫn mềm; thực thi cứng đến từ chính sách công cụ, phê duyệt exec, sandboxing, và danh sách cho phép kênh (và các toán tử có thể tắt chúng theo thiết kế). Những điều hữu ích trong thực tế:
  • Giữ các tin nhắn trực tiếp đến bị khóa chặt (ghép nối/danh sách cho phép).
  • Ưu tiên cổng kiểm soát bằng nhắc đến trong nhóm; tránh bot “luôn bật” trong phòng công khai.
  • Mặc định coi liên kết, tệp đính kèm và hướng dẫn được dán là độc hại.
  • Chạy việc thực thi công cụ nhạy cảm trong sandbox; giữ bí mật ngoài hệ thống tệp mà agent có thể truy cập.
  • Lưu ý: sandboxing là tùy chọn bật. Nếu chế độ sandbox tắt, host=auto ngầm định sẽ phân giải thành máy chủ Gateway. host=sandbox tường minh vẫn thất bại theo hướng đóng vì không có runtime sandbox khả dụng. Đặt host=gateway nếu bạn muốn hành vi đó được tường minh trong cấu hình.
  • Giới hạn các công cụ rủi ro cao (exec, browser, web_fetch, web_search) cho các agent đáng tin cậy hoặc danh sách cho phép tường minh.
  • Nếu bạn đưa các trình thông dịch vào danh sách cho phép (python, node, ruby, perl, php, lua, osascript), hãy bật tools.exec.strictInlineEval để các dạng eval nội tuyến vẫn cần phê duyệt tường minh.
  • Phân tích phê duyệt shell cũng từ chối các dạng mở rộng tham số POSIX ($VAR, $?, $$, $1, $@, ${…}) bên trong heredoc không được đặt trong dấu nháy, vì vậy phần thân heredoc nằm trong danh sách cho phép không thể lén đưa mở rộng shell vượt qua bước rà soát danh sách cho phép dưới dạng văn bản thuần. Đặt terminator heredoc trong dấu nháy (ví dụ <<'EOF') để chọn ngữ nghĩa phần thân dạng literal; các heredoc không đặt trong dấu nháy mà đáng lẽ sẽ mở rộng biến sẽ bị từ chối.
  • Lựa chọn mô hình rất quan trọng: các mô hình cũ hơn/nhỏ hơn/legacy kém vững chắc hơn đáng kể trước prompt injection và lạm dụng công cụ. Với agent có bật công cụ, hãy dùng mô hình thế hệ mới nhất mạnh nhất, được gia cố theo chỉ dẫn, hiện có.
Các dấu hiệu cảnh báo cần coi là không đáng tin cậy:
  • “Đọc tệp/URL này và làm đúng như những gì nó nói.”
  • “Bỏ qua system prompt hoặc quy tắc an toàn của bạn.”
  • “Tiết lộ hướng dẫn ẩn hoặc đầu ra công cụ của bạn.”
  • “Dán toàn bộ nội dung của ~/.openclaw hoặc nhật ký của bạn.”

Khử nhiễm token đặc biệt trong nội dung bên ngoài

OpenClaw loại bỏ các literal token đặc biệt phổ biến của chat-template LLM tự lưu trữ khỏi nội dung và metadata bên ngoài đã được bọc trước khi chúng tới mô hình. Các họ marker được bao phủ bao gồm token vai trò/lượt Qwen/ChatML, Llama, Gemma, Mistral, Phi và GPT-OSS. Lý do:
  • Các backend tương thích OpenAI đứng trước mô hình tự lưu trữ đôi khi giữ lại các token đặc biệt xuất hiện trong văn bản người dùng, thay vì che chúng. Kẻ tấn công có thể ghi vào nội dung bên ngoài đi vào (trang được fetch, thân email, đầu ra công cụ nội dung tệp) nếu không sẽ có thể chèn một ranh giới vai trò assistant hoặc system tổng hợp và thoát khỏi các guardrail nội dung đã bọc.
  • Việc khử nhiễm diễn ra ở lớp bọc nội dung bên ngoài, nên áp dụng đồng nhất trên các công cụ fetch/read và nội dung kênh đi vào thay vì theo từng provider.
  • Phản hồi mô hình đi ra đã có một bộ khử nhiễm riêng, loại bỏ <tool_call>, <function_calls>, <system-reminder>, <previous_response> và giàn giáo runtime nội bộ tương tự bị rò rỉ khỏi phản hồi người dùng nhìn thấy tại ranh giới phân phối kênh cuối cùng. Bộ khử nhiễm nội dung bên ngoài là phần tương ứng ở chiều đi vào.
Điều này không thay thế các biện pháp gia cố khác trên trang này - dmPolicy, danh sách cho phép, phê duyệt exec, sandboxing và contextVisibility vẫn làm phần việc chính. Nó đóng một đường vòng cụ thể ở lớp tokenizer đối với các stack tự lưu trữ chuyển tiếp văn bản người dùng với token đặc biệt còn nguyên.

Cờ bỏ qua nội dung bên ngoài không an toàn

OpenClaw bao gồm các cờ bỏ qua tường minh để vô hiệu hóa việc bọc an toàn nội dung bên ngoài:
  • hooks.mappings[].allowUnsafeExternalContent
  • hooks.gmail.allowUnsafeExternalContent
  • Trường payload Cron allowUnsafeExternalContent
Hướng dẫn:
  • Giữ các cờ này không đặt/false trong production.
  • Chỉ bật tạm thời cho việc gỡ lỗi có phạm vi rất chặt.
  • Nếu bật, hãy cô lập agent đó (sandbox + công cụ tối thiểu + namespace phiên chuyên dụng).
Lưu ý rủi ro hook:
  • Payload hook là nội dung không đáng tin cậy, ngay cả khi việc phân phối đến từ các hệ thống bạn kiểm soát (nội dung mail/docs/web có thể mang prompt injection).
  • Các tầng mô hình yếu làm tăng rủi ro này. Với tự động hóa do hook điều khiển, hãy ưu tiên các tầng mô hình hiện đại mạnh và giữ chính sách công cụ chặt (tools.profile: "messaging" hoặc nghiêm ngặt hơn), cộng với sandboxing khi có thể.

Prompt injection không yêu cầu tin nhắn trực tiếp công khai

Ngay cả khi chỉ bạn có thể nhắn tin cho bot, prompt injection vẫn có thể xảy ra qua bất kỳ nội dung không đáng tin cậy nào mà bot đọc (kết quả web search/fetch, trang trình duyệt, email, tài liệu, tệp đính kèm, nhật ký/mã được dán). Nói cách khác: người gửi không phải là bề mặt đe dọa duy nhất; chính nội dung có thể mang chỉ dẫn đối kháng. Khi công cụ được bật, rủi ro điển hình là trích xuất lén ngữ cảnh hoặc kích hoạt lệnh gọi công cụ. Giảm phạm vi ảnh hưởng bằng cách:
  • Dùng agent đọc chỉ đọc hoặc tắt công cụ để tóm tắt nội dung không đáng tin cậy, rồi chuyển bản tóm tắt cho agent chính của bạn.
  • Tắt web_search / web_fetch / browser cho agent có bật công cụ trừ khi cần.
  • Với đầu vào URL OpenResponses (input_file / input_image), đặt gateway.http.endpoints.responses.files.urlAllowlistgateway.http.endpoints.responses.images.urlAllowlist chặt chẽ, đồng thời giữ maxUrlParts thấp. Danh sách cho phép rỗng được coi là chưa đặt; dùng files.allowUrl: false / images.allowUrl: false nếu bạn muốn vô hiệu hóa hoàn toàn việc fetch URL.
  • Với đầu vào tệp OpenResponses, văn bản input_file đã giải mã vẫn được chèn dưới dạng nội dung bên ngoài không đáng tin cậy. Đừng dựa vào việc văn bản tệp là đáng tin cậy chỉ vì Gateway đã giải mã cục bộ. Khối được chèn vẫn mang các marker ranh giới <<<EXTERNAL_UNTRUSTED_CONTENT ...>>> tường minh cộng với metadata Source: External, mặc dù đường dẫn này bỏ qua banner SECURITY NOTICE: dài hơn.
  • Cơ chế bọc dựa trên marker tương tự được áp dụng khi media-understanding trích xuất văn bản từ tài liệu đính kèm trước khi thêm văn bản đó vào prompt media.
  • Bật sandboxing và danh sách cho phép công cụ nghiêm ngặt cho bất kỳ agent nào chạm vào đầu vào không đáng tin cậy.
  • Giữ bí mật ngoài prompt; thay vào đó truyền chúng qua env/config trên máy chủ Gateway.

Backend LLM tự lưu trữ

Các backend tự lưu trữ tương thích OpenAI như vLLM, SGLang, TGI, LM Studio, hoặc các stack tokenizer Hugging Face tùy chỉnh có thể khác với provider được lưu trữ trong cách xử lý token đặc biệt của chat-template. Nếu một backend token hóa các chuỗi literal như <|im_start|>, <|start_header_id|>, hoặc <start_of_turn> thành token chat-template có cấu trúc bên trong nội dung người dùng, văn bản không đáng tin cậy có thể cố giả mạo ranh giới vai trò ở lớp tokenizer. OpenClaw loại bỏ các literal token đặc biệt của các họ mô hình phổ biến khỏi nội dung bên ngoài đã bọc trước khi gửi nó tới mô hình. Giữ bật việc bọc nội dung bên ngoài, và ưu tiên các thiết lập backend tách hoặc escape token đặc biệt trong nội dung do người dùng cung cấp khi có sẵn. Các provider được lưu trữ như OpenAI và Anthropic đã áp dụng cơ chế khử nhiễm phía yêu cầu riêng của họ.

Sức mạnh mô hình (lưu ý bảo mật)

Khả năng chống prompt injection không đồng đều giữa các tầng mô hình. Các mô hình nhỏ hơn/rẻ hơn thường dễ bị lạm dụng công cụ và chiếm quyền chỉ dẫn hơn, đặc biệt dưới các prompt đối kháng.
Với agent có bật công cụ hoặc agent đọc nội dung không đáng tin cậy, rủi ro prompt injection với mô hình cũ hơn/nhỏ hơn thường quá cao. Đừng chạy các khối lượng công việc đó trên các tầng mô hình yếu.
Khuyến nghị:
  • Dùng mô hình thế hệ mới nhất, tầng tốt nhất cho bất kỳ bot nào có thể chạy công cụ hoặc chạm vào tệp/mạng.
  • Không dùng các tầng cũ hơn/yếu hơn/nhỏ hơn cho agent có bật công cụ hoặc hộp thư đến không đáng tin cậy; rủi ro prompt injection quá cao.
  • Nếu bạn bắt buộc phải dùng mô hình nhỏ hơn, giảm phạm vi ảnh hưởng (công cụ chỉ đọc, sandboxing mạnh, quyền truy cập hệ thống tệp tối thiểu, danh sách cho phép nghiêm ngặt).
  • Khi chạy mô hình nhỏ, bật sandboxing cho tất cả phiênvô hiệu hóa web_search/web_fetch/browser trừ khi đầu vào được kiểm soát chặt.
  • Với trợ lý cá nhân chỉ chat, đầu vào đáng tin cậy và không có công cụ, mô hình nhỏ hơn thường ổn.

Reasoning và đầu ra verbose trong nhóm

/reasoning, /verbose, và /trace có thể làm lộ reasoning nội bộ, đầu ra công cụ, hoặc chẩn đoán Plugin không dành cho kênh công khai. Trong bối cảnh nhóm, hãy coi chúng là chỉ để gỡ lỗi và giữ tắt trừ khi bạn thật sự cần. Hướng dẫn:
  • Giữ /reasoning, /verbose, và /trace bị vô hiệu hóa trong phòng công khai.
  • Nếu bạn bật chúng, chỉ làm vậy trong tin nhắn trực tiếp đáng tin cậy hoặc phòng được kiểm soát chặt.
  • Ghi nhớ: đầu ra verbose và trace có thể bao gồm args công cụ, URL, chẩn đoán Plugin và dữ liệu mô hình đã thấy.

Ví dụ gia cố cấu hình

Quyền tệp

Giữ config + trạng thái riêng tư trên máy chủ Gateway:
  • ~/.openclaw/openclaw.json: 600 (chỉ người dùng đọc/ghi)
  • ~/.openclaw: 700 (chỉ người dùng)
openclaw doctor có thể cảnh báo và đề nghị siết chặt các quyền này.

Phơi bày mạng (bind, port, firewall)

Gateway ghép kênh WebSocket + HTTP trên một cổng duy nhất:
  • Mặc định: 18789
  • Config/flags/env: gateway.port, --port, OPENCLAW_GATEWAY_PORT
Bề mặt HTTP này bao gồm Giao diện điều khiển và máy chủ canvas:
  • Giao diện điều khiển (asset SPA) (đường dẫn cơ sở mặc định /)
  • Máy chủ canvas: /__openclaw__/canvas//__openclaw__/a2ui/ (HTML/JS tùy ý; coi là nội dung không đáng tin cậy)
Nếu bạn tải nội dung canvas trong trình duyệt bình thường, hãy coi nó như bất kỳ trang web không đáng tin cậy nào khác:
  • Đừng phơi bày máy chủ canvas cho mạng/người dùng không đáng tin cậy.
  • Đừng để nội dung canvas dùng chung origin với các bề mặt web đặc quyền trừ khi bạn hiểu đầy đủ hệ quả.
Chế độ bind kiểm soát nơi Gateway lắng nghe:
  • gateway.bind: "loopback" (mặc định): chỉ máy khách cục bộ mới có thể kết nối.
  • Các bind không phải loopback ("lan", "tailnet", "custom") mở rộng bề mặt tấn công. Chỉ dùng chúng với xác thực Gateway (token/mật khẩu dùng chung hoặc proxy đáng tin cậy được cấu hình đúng) và firewall thật.
Quy tắc kinh nghiệm:
  • Ưu tiên Tailscale Serve hơn bind LAN (Serve giữ Gateway trên loopback, và Tailscale xử lý quyền truy cập).
  • Nếu bạn buộc phải bind vào LAN, hãy firewall cổng tới một danh sách cho phép IP nguồn chặt chẽ; đừng port-forward rộng rãi.
  • Không bao giờ phơi bày Gateway không xác thực trên 0.0.0.0.

Xuất bản cổng Docker với UFW

Nếu bạn chạy OpenClaw bằng Docker trên VPS, hãy nhớ rằng các cổng container đã xuất bản (-p HOST:CONTAINER hoặc Compose ports:) được định tuyến qua các chuỗi forwarding của Docker, không chỉ các quy tắc INPUT của host. Để giữ lưu lượng Docker phù hợp với chính sách firewall của bạn, hãy thực thi quy tắc trong DOCKER-USER (chuỗi này được đánh giá trước các quy tắc accept riêng của Docker). Trên nhiều distro hiện đại, iptables/ip6tables dùng frontend iptables-nft và vẫn áp dụng các quy tắc này cho backend nftables. Ví dụ danh sách cho phép tối thiểu (IPv4):
# /etc/ufw/after.rules (append as its own *filter section)
*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 có bảng riêng. Thêm chính sách tương ứng trong /etc/ufw/after6.rules nếu Docker IPv6 được bật. Tránh hardcode tên interface như eth0 trong snippet tài liệu. Tên interface khác nhau giữa các image VPS (ens3, enp*, v.v.) và việc không khớp có thể vô tình bỏ qua quy tắc deny của bạn. Xác thực nhanh sau khi reload:
ufw reload
iptables -S DOCKER-USER
ip6tables -S DOCKER-USER
nmap -sT -p 1-65535 <public-ip> --open
Các cổng bên ngoài dự kiến chỉ nên là những gì bạn cố ý phơi bày (với hầu hết thiết lập: SSH + các cổng reverse proxy của bạn).

Khám phá mDNS/Bonjour

Khi Plugin bonjour đi kèm được bật, Gateway phát sóng sự hiện diện của nó qua mDNS (_openclaw-gw._tcp trên cổng 5353) để khám phá thiết bị cục bộ. Ở chế độ đầy đủ, điều này bao gồm các bản ghi TXT có thể làm lộ chi tiết vận hành:
  • cliPath: đường dẫn hệ thống tệp đầy đủ tới tệp nhị phân CLI (tiết lộ tên người dùng và vị trí cài đặt)
  • sshPort: quảng bá việc SSH khả dụng trên máy chủ
  • displayName, lanHost: thông tin tên máy chủ
Cân nhắc bảo mật vận hành: Việc phát sóng chi tiết hạ tầng khiến bất kỳ ai trên mạng cục bộ cũng dễ do thám hơn. Ngay cả thông tin “vô hại” như đường dẫn hệ thống tệp và việc SSH khả dụng cũng giúp kẻ tấn công lập bản đồ môi trường của bạn. Khuyến nghị:
  1. Giữ Bonjour tắt trừ khi cần khám phá LAN. Bonjour tự khởi động trên máy chủ macOS và là tùy chọn bật ở nơi khác; URL Gateway trực tiếp, Tailnet, SSH hoặc DNS-SD diện rộng tránh multicast cục bộ.
  2. Chế độ tối thiểu (mặc định khi Bonjour được bật, khuyến nghị cho các gateway bị phơi bày): bỏ qua các trường nhạy cảm khỏi phát sóng mDNS:
    {
      discovery: {
        mdns: { mode: "minimal" },
      },
    }
    
  3. Tắt chế độ mDNS nếu bạn muốn giữ Plugin được bật nhưng chặn khám phá thiết bị cục bộ:
    {
      discovery: {
        mdns: { mode: "off" },
      },
    }
    
  4. Chế độ đầy đủ (tùy chọn bật): đưa cliPath + sshPort vào bản ghi TXT:
    {
      discovery: {
        mdns: { mode: "full" },
      },
    }
    
  5. Biến môi trường (phương án thay thế): đặt OPENCLAW_DISABLE_BONJOUR=1 để tắt mDNS mà không cần thay đổi cấu hình.
Khi Bonjour được bật ở chế độ tối thiểu, Gateway phát sóng đủ để khám phá thiết bị (role, gatewayPort, transport) nhưng bỏ qua cliPathsshPort. Các ứng dụng cần thông tin đường dẫn CLI có thể lấy thông tin đó qua kết nối WebSocket đã xác thực thay vào đó.

Khóa chặt Gateway WebSocket (xác thực cục bộ)

Xác thực Gateway được yêu cầu theo mặc định. Nếu không có đường dẫn xác thực gateway hợp lệ được cấu hình, Gateway sẽ từ chối kết nối WebSocket (đóng khi lỗi). Onboarding tạo token theo mặc định (ngay cả cho loopback) nên client cục bộ phải xác thực. Đặt token để tất cả client WS đều phải xác thực:
{
  gateway: {
    auth: { mode: "token", token: "your-token" },
  },
}
Doctor có thể tạo một token cho bạn: openclaw doctor --generate-gateway-token.
gateway.remote.tokengateway.remote.password là nguồn thông tin xác thực client. Bản thân chúng không bảo vệ quyền truy cập WS cục bộ. Các đường dẫn gọi cục bộ chỉ có thể dùng gateway.remote.* làm phương án dự phòng khi gateway.auth.* chưa được đặt. Nếu gateway.auth.token hoặc gateway.auth.password được cấu hình rõ ràng qua SecretRef và không phân giải được, quá trình phân giải sẽ đóng khi lỗi (không có dự phòng từ xa che lấp).
Tùy chọn: ghim TLS từ xa bằng gateway.remote.tlsFingerprint khi dùng wss://. Văn bản thuần ws:// theo mặc định chỉ dành cho loopback. Với các đường dẫn mạng riêng đáng tin cậy, đặt OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 trên tiến trình client như biện pháp khẩn cấp. Điều này cố ý chỉ là môi trường tiến trình, không phải khóa cấu hình openclaw.json. Ghép đôi di động và các tuyến gateway thủ công hoặc được quét trên Android nghiêm ngặt hơn: cleartext được chấp nhận cho loopback, nhưng private-LAN, link-local, .local, và tên máy chủ không có dấu chấm phải dùng TLS trừ khi bạn chủ động chọn đường dẫn cleartext mạng riêng đáng tin cậy. Ghép đôi thiết bị cục bộ:
  • Ghép đôi thiết bị được tự động phê duyệt cho các kết nối local loopback trực tiếp để client cùng máy chủ hoạt động mượt mà.
  • OpenClaw cũng có một đường dẫn tự kết nối backend/container-cục bộ hẹp cho các luồng trợ giúp shared-secret đáng tin cậy.
  • Kết nối Tailnet và LAN, bao gồm các bind tailnet cùng máy chủ, được xem là từ xa cho việc ghép đôi và vẫn cần phê duyệt.
  • Bằng chứng forwarded-header trên một yêu cầu loopback sẽ loại bỏ tính cục bộ loopback. Tự động phê duyệt nâng cấp metadata được giới hạn hẹp. Xem Ghép đôi Gateway để biết cả hai quy tắc.
Chế độ xác thực:
  • gateway.auth.mode: "token": bearer token dùng chung (khuyến nghị cho hầu hết thiết lập).
  • gateway.auth.mode: "password": xác thực bằng mật khẩu (ưu tiên đặt qua env: OPENCLAW_GATEWAY_PASSWORD).
  • gateway.auth.mode: "trusted-proxy": tin tưởng một reverse proxy nhận biết danh tính để xác thực người dùng và chuyển danh tính qua header (xem Xác thực proxy tin cậy).
Danh sách kiểm tra xoay vòng (token/mật khẩu):
  1. Tạo/đặt secret mới (gateway.auth.token hoặc OPENCLAW_GATEWAY_PASSWORD).
  2. Khởi động lại Gateway (hoặc khởi động lại ứng dụng macOS nếu ứng dụng đó giám sát Gateway).
  3. Cập nhật mọi client từ xa (gateway.remote.token / .password trên các máy gọi vào Gateway).
  4. Xác minh bạn không còn có thể kết nối bằng thông tin xác thực cũ.

Header danh tính Tailscale Serve

Khi gateway.auth.allowTailscaletrue (mặc định cho Serve), OpenClaw chấp nhận header danh tính Tailscale Serve (tailscale-user-login) để xác thực Control UI/WebSocket. OpenClaw xác minh danh tính bằng cách phân giải địa chỉ x-forwarded-for qua daemon Tailscale cục bộ (tailscale whois) và đối chiếu với header. Điều này chỉ kích hoạt cho các yêu cầu đi vào loopback và bao gồm x-forwarded-for, x-forwarded-proto, và x-forwarded-host như được Tailscale chèn vào. Đối với đường dẫn kiểm tra danh tính bất đồng bộ này, các lần thất bại cho cùng {scope, ip} được tuần tự hóa trước khi limiter ghi nhận thất bại. Vì vậy các lần thử lại sai đồng thời từ một client Serve có thể khóa lần thử thứ hai ngay lập tức thay vì chạy đua qua như hai lần không khớp thuần túy. Endpoint HTTP API (ví dụ /v1/*, /tools/invoke, và /api/channels/*) không dùng xác thực header danh tính Tailscale. Chúng vẫn tuân theo chế độ xác thực HTTP đã cấu hình của gateway. Lưu ý ranh giới quan trọng:
  • Xác thực bearer HTTP của Gateway về cơ bản là quyền truy cập operator tất cả-hoặc-không-gì-cả.
  • Hãy xem thông tin xác thực có thể gọi /v1/chat/completions, /v1/responses, hoặc /api/channels/* là secret operator toàn quyền cho gateway đó.
  • Trên bề mặt HTTP tương thích OpenAI, xác thực bearer shared-secret khôi phục đầy đủ các phạm vi operator mặc định (operator.admin, operator.approvals, operator.pairing, operator.read, operator.talk.secrets, operator.write) và ngữ nghĩa owner cho lượt agent; các giá trị x-openclaw-scopes hẹp hơn không làm giảm đường dẫn shared-secret đó.
  • Ngữ nghĩa phạm vi theo từng yêu cầu trên HTTP chỉ áp dụng khi yêu cầu đến từ chế độ mang danh tính như xác thực trusted proxy hoặc gateway.auth.mode="none" trên ingress riêng.
  • Trong các chế độ mang danh tính đó, bỏ qua x-openclaw-scopes sẽ rơi về tập phạm vi operator mặc định thông thường; gửi header rõ ràng khi bạn muốn tập phạm vi hẹp hơn.
  • /tools/invoke tuân theo cùng quy tắc shared-secret: xác thực bearer token/mật khẩu cũng được xem là quyền truy cập operator đầy đủ ở đó, trong khi các chế độ mang danh tính vẫn tôn trọng phạm vi đã khai báo.
  • Không chia sẻ các thông tin xác thực này với bên gọi không đáng tin cậy; ưu tiên gateway riêng cho từng ranh giới tin cậy.
Giả định tin cậy: xác thực Serve không token giả định máy chủ gateway là đáng tin cậy. Đừng xem đây là biện pháp bảo vệ khỏi các tiến trình thù địch trên cùng máy chủ. Nếu mã cục bộ không đáng tin cậy có thể chạy trên máy chủ gateway, hãy tắt gateway.auth.allowTailscale và yêu cầu xác thực shared-secret rõ ràng bằng gateway.auth.mode: "token" hoặc "password". Quy tắc bảo mật: không chuyển tiếp các header này từ reverse proxy của riêng bạn. Nếu bạn kết thúc TLS hoặc proxy phía trước gateway, hãy tắt gateway.auth.allowTailscale và dùng xác thực shared-secret (gateway.auth.mode: "token" hoặc "password") hoặc Xác thực proxy tin cậy thay vào đó. Proxy tin cậy:
  • Nếu bạn kết thúc TLS phía trước Gateway, đặt gateway.trustedProxies thành các IP proxy của bạn.
  • OpenClaw sẽ tin tưởng x-forwarded-for (hoặc x-real-ip) từ các IP đó để xác định IP client cho kiểm tra ghép đôi cục bộ và kiểm tra xác thực HTTP/cục bộ.
  • Đảm bảo proxy của bạn ghi đè x-forwarded-for và chặn truy cập trực tiếp tới cổng Gateway.
Xem TailscaleTổng quan web.

Điều khiển trình duyệt qua node host (khuyến nghị)

Nếu Gateway của bạn ở xa nhưng trình duyệt chạy trên một máy khác, hãy chạy node host trên máy trình duyệt và để Gateway proxy các thao tác trình duyệt (xem Công cụ trình duyệt). Hãy xem ghép đôi node như quyền truy cập quản trị. Mẫu khuyến nghị:
  • Giữ Gateway và node host trên cùng tailnet (Tailscale).
  • Ghép đôi node một cách chủ động; tắt định tuyến proxy trình duyệt nếu bạn không cần.
Tránh:
  • Phơi bày cổng relay/control qua LAN hoặc Internet công cộng.
  • Tailscale Funnel cho endpoint điều khiển trình duyệt (phơi bày công khai).

Secret trên đĩa

Giả định mọi thứ dưới ~/.openclaw/ (hoặc $OPENCLAW_STATE_DIR/) có thể chứa secret hoặc dữ liệu riêng tư:
  • openclaw.json: cấu hình có thể bao gồm token (gateway, gateway từ xa), thiết lập provider, và allowlist.
  • credentials/**: thông tin xác thực channel (ví dụ: thông tin xác thực WhatsApp), allowlist ghép đôi, import OAuth cũ.
  • agents/<agentId>/agent/auth-profiles.json: khóa API, hồ sơ token, token OAuth, và keyRef/tokenRef tùy chọn.
  • agents/<agentId>/agent/codex-home/**: tài khoản app-server Codex theo từng agent, cấu hình, skills, plugins, trạng thái thread gốc, và chẩn đoán.
  • secrets.json (tùy chọn): payload secret dựa trên tệp được dùng bởi provider SecretRef file (secrets.providers).
  • agents/<agentId>/agent/auth.json: tệp tương thích cũ. Các mục api_key tĩnh được xóa sạch khi phát hiện.
  • agents/<agentId>/sessions/**: bản ghi phiên (*.jsonl) + metadata định tuyến (sessions.json) có thể chứa tin nhắn riêng tư và đầu ra công cụ.
  • gói Plugin được đóng gói: Plugin đã cài đặt (cộng với node_modules/ của chúng).
  • sandboxes/**: workspace sandbox công cụ; có thể tích lũy bản sao của các tệp bạn đọc/ghi bên trong sandbox.
Mẹo gia cố:
  • Giữ quyền chặt chẽ (700 trên thư mục, 600 trên tệp).
  • Dùng mã hóa toàn bộ đĩa trên máy chủ gateway.
  • Ưu tiên tài khoản người dùng OS chuyên dụng cho Gateway nếu máy chủ được chia sẻ.

Tệp .env của workspace

OpenClaw tải các tệp .env cục bộ trong workspace cho agent và công cụ, nhưng không bao giờ cho phép các tệp đó âm thầm ghi đè điều khiển runtime gateway.
  • Mọi khóa bắt đầu bằng OPENCLAW_* đều bị chặn khỏi các tệp .env workspace không đáng tin cậy.
  • Thiết lập endpoint channel cho Matrix, Mattermost, IRC, và Synology Chat cũng bị chặn khỏi ghi đè .env workspace, để workspace được clone không thể chuyển hướng lưu lượng connector đóng gói qua cấu hình endpoint cục bộ. Các khóa env endpoint (như MATRIX_HOMESERVER, MATTERMOST_URL, IRC_HOST, SYNOLOGY_CHAT_INCOMING_URL) phải đến từ môi trường tiến trình gateway hoặc env.shellEnv, không phải từ .env được tải từ workspace.
  • Khối chặn này đóng khi lỗi: một biến điều khiển runtime mới được thêm trong bản phát hành tương lai không thể được kế thừa từ .env đã check-in hoặc do kẻ tấn công cung cấp; khóa bị bỏ qua và gateway giữ giá trị riêng.
  • Biến môi trường tiến trình/OS đáng tin cậy (shell riêng của gateway, đơn vị launchd/systemd, app bundle) vẫn áp dụng - điều này chỉ giới hạn việc tải tệp .env.
Lý do: tệp .env workspace thường nằm cạnh mã agent, bị commit nhầm, hoặc được công cụ ghi. Chặn toàn bộ tiền tố OPENCLAW_* nghĩa là việc thêm một cờ OPENCLAW_* mới sau này không bao giờ có thể thoái lui thành kế thừa âm thầm từ trạng thái workspace.

Nhật ký và bản ghi phiên (biên tập và lưu giữ)

Nhật ký và bản ghi phiên có thể rò rỉ thông tin nhạy cảm ngay cả khi kiểm soát truy cập đúng:
  • Nhật ký Gateway có thể bao gồm tóm tắt công cụ, lỗi, và URL.
  • Bản ghi phiên có thể bao gồm secret được dán, nội dung tệp, đầu ra lệnh, và liên kết.
Khuyến nghị:
  • Giữ biên tập nhật ký và bản ghi phiên bật (logging.redactSensitive: "tools"; mặc định).
  • Thêm mẫu tùy chỉnh cho môi trường của bạn qua logging.redactPatterns (token, tên máy chủ, URL nội bộ).
  • Khi chia sẻ chẩn đoán, ưu tiên openclaw status --all (có thể dán, secret đã được biên tập) thay vì nhật ký thô.
  • Cắt tỉa bản ghi phiên và tệp nhật ký cũ nếu bạn không cần lưu giữ lâu.
Chi tiết: Ghi nhật ký

DM: ghép đôi theo mặc định

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

Nhóm: yêu cầu nhắc đến ở mọi nơi

{
  "channels": {
    "whatsapp": {
      "groups": {
        "*": { "requireMention": true }
      }
    }
  },
  "agents": {
    "list": [
      {
        "id": "main",
        "groupChat": { "mentionPatterns": ["@openclaw", "@mybot"] }
      }
    ]
  }
}
Trong cuộc trò chuyện nhóm, chỉ phản hồi khi được nhắc đến rõ ràng.

Các số riêng biệt (WhatsApp, Signal, Telegram)

Với các kênh dựa trên số điện thoại, hãy cân nhắc chạy AI của bạn trên một số điện thoại riêng, tách khỏi số cá nhân:
  • Số cá nhân: Các cuộc trò chuyện của bạn vẫn riêng tư
  • Số bot: AI xử lý các cuộc trò chuyện này, với ranh giới phù hợp

Chế độ chỉ đọc (qua sandbox và công cụ)

Bạn có thể tạo hồ sơ chỉ đọc bằng cách kết hợp:
  • agents.defaults.sandbox.workspaceAccess: "ro" (hoặc "none" để không có quyền truy cập workspace)
  • danh sách cho phép/từ chối công cụ chặn write, edit, apply_patch, exec, process, v.v.
Các tùy chọn gia cố bổ sung:
  • tools.exec.applyPatch.workspaceOnly: true (mặc định): đảm bảo apply_patch không thể ghi/xóa bên ngoài thư mục workspace ngay cả khi sandboxing tắt. Chỉ đặt thành false nếu bạn cố ý muốn apply_patch chạm vào các tệp bên ngoài workspace.
  • tools.fs.workspaceOnly: true (tùy chọn): giới hạn các đường dẫn read/write/edit/apply_patch và các đường dẫn tự động tải ảnh prompt gốc vào thư mục workspace (hữu ích nếu hiện nay bạn cho phép đường dẫn tuyệt đối và muốn có một lớp bảo vệ duy nhất).
  • Giữ các gốc hệ thống tệp thật hẹp: tránh các gốc rộng như thư mục home của bạn cho workspace/sandbox workspace của agent. Các gốc rộng có thể làm lộ các tệp cục bộ nhạy cảm (ví dụ trạng thái/cấu hình trong ~/.openclaw) cho các công cụ hệ thống tệp.

Baseline an toàn (sao chép/dán)

Một cấu hình “mặc định an toàn” giữ Gateway ở chế độ riêng tư, yêu cầu ghép cặp DM, và tránh bot nhóm luôn bật:
{
  gateway: {
    mode: "local",
    bind: "loopback",
    port: 18789,
    auth: { mode: "token", token: "your-long-random-token" },
  },
  channels: {
    whatsapp: {
      dmPolicy: "pairing",
      groups: { "*": { requireMention: true } },
    },
  },
}
Nếu bạn cũng muốn thực thi công cụ “an toàn hơn theo mặc định”, hãy thêm sandbox + từ chối các công cụ nguy hiểm cho mọi agent không phải chủ sở hữu (ví dụ bên dưới trong “Hồ sơ truy cập theo agent”). Baseline tích hợp sẵn cho các lượt agent điều khiển bằng chat: người gửi không phải chủ sở hữu không thể dùng các công cụ cron hoặc gateway.

Sandboxing (khuyến nghị)

Tài liệu riêng: Sandboxing Hai cách tiếp cận bổ trợ:
  • Chạy toàn bộ Gateway trong Docker (ranh giới container): Docker
  • Sandbox công cụ (agents.defaults.sandbox, host gateway + công cụ được sandbox cô lập; Docker là backend mặc định): Sandboxing
Để ngăn truy cập chéo giữa các agent, hãy giữ agents.defaults.sandbox.scope"agent" (mặc định) hoặc "session" để cô lập nghiêm ngặt hơn theo từng phiên. scope: "shared" dùng một container hoặc workspace duy nhất.
Cũng nên cân nhắc quyền truy cập workspace của agent bên trong sandbox:
  • agents.defaults.sandbox.workspaceAccess: "none" (mặc định) giữ workspace của agent ngoài phạm vi truy cập; các công cụ chạy trên một sandbox workspace trong ~/.openclaw/sandboxes
  • agents.defaults.sandbox.workspaceAccess: "ro" mount workspace của agent ở chế độ chỉ đọc tại /agent (vô hiệu hóa write/edit/apply_patch)
  • agents.defaults.sandbox.workspaceAccess: "rw" mount workspace của agent ở chế độ đọc/ghi tại /workspace
  • Các sandbox.docker.binds bổ sung được xác thực theo đường dẫn nguồn đã chuẩn hóa và chính tắc hóa. Các thủ thuật symlink cha và bí danh home chính tắc vẫn fail closed nếu chúng phân giải vào các gốc bị chặn như /etc, /var/run, hoặc các thư mục thông tin xác thực trong home của hệ điều hành.
tools.elevated là cửa thoát baseline toàn cục chạy exec bên ngoài sandbox. Host hiệu dụng mặc định là gateway, hoặc node khi đích exec được cấu hình là node. Giữ tools.elevated.allowFrom chặt chẽ và đừng bật nó cho người lạ. Bạn có thể hạn chế thêm elevated theo từng agent qua agents.list[].tools.elevated. Xem Chế độ elevated.

Rào chắn ủy quyền sub-agent

Nếu bạn cho phép công cụ phiên, hãy xem các lần chạy sub-agent được ủy quyền là một quyết định ranh giới khác:
  • Từ chối sessions_spawn trừ khi agent thật sự cần ủy quyền.
  • Giữ agents.defaults.subagents.allowAgents và mọi ghi đè agents.list[].subagents.allowAgents theo từng agent chỉ giới hạn ở các agent đích đã biết là an toàn.
  • Với mọi workflow bắt buộc phải duy trì trong sandbox, gọi sessions_spawn với sandbox: "require" (mặc định là inherit).
  • sandbox: "require" thất bại nhanh khi runtime con đích không được sandbox.

Rủi ro điều khiển trình duyệt

Bật điều khiển trình duyệt trao cho mô hình khả năng điều khiển một trình duyệt thật. Nếu hồ sơ trình duyệt đó đã có các phiên đăng nhập, mô hình có thể truy cập các tài khoản và dữ liệu đó. Hãy xem hồ sơ trình duyệt là trạng thái nhạy cảm:
  • Ưu tiên một hồ sơ riêng cho agent (hồ sơ openclaw mặc định).
  • Tránh trỏ agent vào hồ sơ cá nhân dùng hằng ngày của bạn.
  • Giữ điều khiển trình duyệt host ở trạng thái tắt cho các agent được sandbox trừ khi bạn tin tưởng chúng.
  • API điều khiển trình duyệt local loopback độc lập chỉ tuân theo xác thực bí mật dùng chung (gateway token bearer auth hoặc mật khẩu gateway). Nó không sử dụng header danh tính trusted-proxy hoặc Tailscale Serve.
  • Xem các tệp tải xuống từ trình duyệt là đầu vào không đáng tin cậy; ưu tiên một thư mục tải xuống cô lập.
  • Tắt đồng bộ trình duyệt/trình quản lý mật khẩu trong hồ sơ agent nếu có thể (giảm phạm vi ảnh hưởng).
  • Với gateway từ xa, giả định “điều khiển trình duyệt” tương đương với “quyền truy cập của operator” tới bất cứ thứ gì hồ sơ đó có thể chạm tới.
  • Giữ các host Gateway và node chỉ trong tailnet; tránh phơi các cổng điều khiển trình duyệt ra LAN hoặc Internet công cộng.
  • Tắt định tuyến proxy trình duyệt khi bạn không cần (gateway.nodes.browser.mode="off").
  • Chế độ phiên hiện có của Chrome MCP không “an toàn hơn”; nó có thể hành động như bạn trong bất cứ thứ gì hồ sơ Chrome trên host đó có thể chạm tới.

Chính sách SSRF trình duyệt (mặc định nghiêm ngặt)

Chính sách điều hướng trình duyệt của OpenClaw mặc định là nghiêm ngặt: các đích riêng tư/nội bộ vẫn bị chặn trừ khi bạn chủ động bật.
  • Mặc định: browser.ssrfPolicy.dangerouslyAllowPrivateNetwork không được đặt, nên điều hướng trình duyệt vẫn chặn các đích riêng tư/nội bộ/dùng đặc biệt.
  • Bí danh legacy: browser.ssrfPolicy.allowPrivateNetwork vẫn được chấp nhận để tương thích.
  • Chế độ opt-in: đặt browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true để cho phép các đích riêng tư/nội bộ/dùng đặc biệt.
  • Trong chế độ nghiêm ngặt, dùng hostnameAllowlist (mẫu như *.example.com) và allowedHostnames (ngoại lệ host chính xác, bao gồm tên bị chặn như localhost) cho các ngoại lệ rõ ràng.
  • Điều hướng được kiểm tra trước yêu cầu và được kiểm tra lại theo best-effort trên URL http(s) cuối cùng sau điều hướng để giảm các pivot dựa trên redirect.
Ví dụ chính sách nghiêm ngặt:
{
  browser: {
    ssrfPolicy: {
      dangerouslyAllowPrivateNetwork: false,
      hostnameAllowlist: ["*.example.com", "example.com"],
      allowedHostnames: ["localhost"],
    },
  },
}

Hồ sơ truy cập theo agent (đa agent)

Với định tuyến đa agent, mỗi agent có thể có chính sách sandbox + công cụ riêng: dùng điều này để cấp quyền truy cập đầy đủ, chỉ đọc, hoặc không có quyền truy cập theo từng agent. Xem Sandbox & Công cụ Đa Agent để biết chi tiết đầy đủ và các quy tắc ưu tiên. Các trường hợp sử dụng phổ biến:
  • Agent cá nhân: quyền truy cập đầy đủ, không sandbox
  • Agent gia đình/công việc: sandbox + công cụ chỉ đọc
  • Agent công khai: sandbox + không có công cụ hệ thống tệp/shell

Ví dụ: quyền truy cập đầy đủ (không sandbox)

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

Ví dụ: công cụ chỉ đọc + workspace chỉ đọc

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

Ví dụ: không có quyền truy cập hệ thống tệp/shell (cho phép nhắn tin qua provider)

{
  agents: {
    list: [
      {
        id: "public",
        workspace: "~/.openclaw/workspace-public",
        sandbox: {
          mode: "all",
          scope: "agent",
          workspaceAccess: "none",
        },
        // Session tools can reveal sensitive data from transcripts. By default OpenClaw limits these tools
        // to the current session + spawned subagent sessions, but you can clamp further if needed.
        // See `tools.sessions.visibility` in the configuration reference.
        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",
          ],
        },
      },
    ],
  },
}

Ứng phó sự cố

Nếu AI của bạn làm điều gì đó xấu:

Khoanh vùng

  1. Dừng nó: dừng ứng dụng macOS (nếu ứng dụng đó giám sát Gateway) hoặc kết thúc tiến trình openclaw gateway của bạn.
  2. Đóng phơi nhiễm: đặt gateway.bind: "loopback" (hoặc tắt Tailscale Funnel/Serve) cho đến khi bạn hiểu chuyện gì đã xảy ra.
  3. Đóng băng quyền truy cập: chuyển các DM/nhóm rủi ro sang dmPolicy: "disabled" / yêu cầu nhắc đến, và xóa các mục cho phép tất cả "*" nếu bạn đã có.

Xoay vòng (giả định bị xâm phạm nếu bí mật bị rò rỉ)

  1. Xoay vòng xác thực Gateway (gateway.auth.token / OPENCLAW_GATEWAY_PASSWORD) và khởi động lại.
  2. Xoay vòng bí mật client từ xa (gateway.remote.token / .password) trên mọi máy có thể gọi Gateway.
  3. Xoay vòng thông tin xác thực provider/API (thông tin xác thực WhatsApp, token Slack/Discord, khóa mô hình/API trong auth-profiles.json, và các giá trị payload bí mật đã mã hóa khi dùng).

Kiểm tra

  1. Kiểm tra log Gateway: /tmp/openclaw/openclaw-YYYY-MM-DD.log (hoặc logging.file).
  2. Rà soát transcript liên quan: ~/.openclaw/agents/<agentId>/sessions/*.jsonl.
  3. Rà soát các thay đổi cấu hình gần đây (bất cứ thứ gì có thể đã mở rộng quyền truy cập: gateway.bind, gateway.auth, chính sách DM/nhóm, tools.elevated, thay đổi plugin).
  4. Chạy lại openclaw security audit --deep và xác nhận các phát hiện nghiêm trọng đã được giải quyết.

Thu thập cho báo cáo

  • Dấu thời gian, hệ điều hành host gateway + phiên bản OpenClaw
  • Transcript phiên + một đoạn đuôi log ngắn (sau khi biên tập)
  • Kẻ tấn công đã gửi gì + agent đã làm gì
  • Gateway có bị phơi ra ngoài loopback hay không (LAN/Tailscale Funnel/Serve)

Quét bí mật

CI chạy hook pre-commit detect-private-key trên repository. Nếu nó thất bại, hãy xóa hoặc xoay vòng vật liệu khóa đã commit, rồi tái hiện cục bộ:
pre-commit run --all-files detect-private-key

Báo cáo vấn đề bảo mật

Tìm thấy lỗ hổng trong OpenClaw? Vui lòng báo cáo có trách nhiệm:
  1. Email: security@openclaw.ai
  2. Đừng đăng công khai cho đến khi đã được sửa
  3. Chúng tôi sẽ ghi công bạn (trừ khi bạn muốn ẩn danh)