Skip to content

Commit 4429ee7

Browse files
committed
docs(security): clarify disclosure policy
1 parent 90419df commit 4429ee7

1 file changed

Lines changed: 94 additions & 48 deletions

File tree

SECURITY.md

Lines changed: 94 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
# Security Policy
22

3-
If you believe you've found a security issue in OpenClaw, please report it privately.
3+
If you believe you've found a security issue in OpenClaw, report it privately first.
44

5-
## Reporting
5+
This policy does two things: it gives researchers a clear disclosure path, and it spells out the trust model maintainers use when triaging reports. OpenClaw is local-first agent infrastructure for trusted operators; it is not designed as a shared multi-tenant boundary between adversarial users on one gateway.
6+
7+
The fastest useful reports show a current, reproducible boundary bypass with demonstrated impact. Scanner output, prompt-injection-only chains, or reports that rely on hostile users sharing one trusted gateway are usually not security vulnerabilities under this model.
8+
9+
Security work is shared across a number of OpenClaw maintainers, including engineers and security researchers from organizations such as NVIDIA. See the [maintainer list](CONTRIBUTING.md#maintainers).
10+
11+
## Report a Security Issue
612

713
Report vulnerabilities directly to the repository where the issue lives:
814

@@ -15,22 +21,50 @@ Report vulnerabilities directly to the repository where the issue lives:
1521

1622
For issues that don't fit a specific repo, or if you're unsure, email **[[email protected]](mailto:[email protected])** and we'll route it.
1723

24+
For OpenClaw core issues, submit through a private [GitHub Security Advisory](https://github.com/openclaw/openclaw/security/advisories/new). Do not open a public issue or PR that discloses an unpatched vulnerability, exploit path, secret, or security-sensitive proof of concept.
25+
26+
Maintainers may close, hide, delete, or otherwise take down public issues and PRs that disclose vulnerabilities or active security issues. We will redirect those reports through the private disclosure process so the issue can be triaged and fixed without giving attackers a public playbook.
27+
1828
For full reporting instructions see our [Trust page](https://trust.openclaw.ai).
1929

20-
### Required in Reports
30+
OpenClaw does not currently run a paid bug bounty program. Please still disclose responsibly so we can fix real issues quickly. The best way to help the project right now is to send high-signal reports and, when practical, focused PRs.
31+
32+
### What We Need
2133

22-
1. **Title**
23-
2. **Severity Assessment**
24-
3. **Impact**
25-
4. **Affected Component**
26-
5. **Technical Reproduction**
27-
6. **Demonstrated Impact**
28-
7. **Environment**
29-
8. **Remediation Advice**
34+
Make the report easy to reproduce and easy to route:
3035

31-
Reports without reproduction steps, demonstrated impact, and remediation advice will be deprioritized. Given the volume of AI-generated scanner findings, we must ensure we're receiving vetted reports from researchers who understand the issues.
36+
- What you found and why you believe it is security-relevant.
37+
- The affected component, version, and commit SHA when possible.
38+
- Reproduction steps or a proof of concept against latest `main` or the latest released version.
39+
- The actual impact, including which OpenClaw trust boundary is crossed.
40+
- Any remediation advice or focused patch you can provide.
3241

33-
### Report Acceptance Gate (Triage Fast Path)
42+
Reports without reproduction steps, demonstrated impact, and remediation advice are deprioritized. We receive a high volume of AI-generated scanner findings, so we prioritize vetted reports from researchers who can show how the issue crosses an OpenClaw security boundary.
43+
44+
### What Usually Is Not a Security Bug
45+
46+
These patterns are usually not vulnerabilities by themselves:
47+
48+
- Prompt injection without a policy, auth, approval, sandbox, or tool-boundary bypass.
49+
- A trusted operator using an intentional local feature, such as local shell access or browser/script execution.
50+
- A malicious plugin after a trusted operator installs or enables it.
51+
- Multiple adversarial users sharing one Gateway host/config and expecting per-user isolation.
52+
- Scanner-only, dependency-only, or stale-path reports without a working repro and demonstrated OpenClaw impact.
53+
- Public internet exposure or risky deployment choices that the docs already recommend against.
54+
55+
If you are unsure, report privately. We would rather route a careful report than miss a real boundary issue.
56+
57+
### Duplicate Report Handling
58+
59+
- Search existing advisories before filing.
60+
- Include likely duplicate GHSA IDs in your report when applicable.
61+
- Maintainers may close lower-quality/later duplicates in favor of the earliest high-quality canonical report.
62+
63+
## Security Posture and Report Rules
64+
65+
The sections below are the normative posture maintainers use for report triage. The headings are editorial; the policy text defines the boundary.
66+
67+
### Detailed Report Acceptance Gate
3468

3569
For fastest triage, include all of the following:
3670

@@ -47,7 +81,7 @@ For fastest triage, include all of the following:
4781

4882
Reports that miss these requirements may be closed as `invalid` or `no-action`.
4983

50-
### Common False-Positive Patterns
84+
### Detailed False-Positive Patterns
5185

5286
These are frequently reported but are typically closed with no code change:
5387

@@ -78,26 +112,11 @@ These are frequently reported but are typically closed with no code change:
78112
- Reports that restate an already-fixed issue against later released versions without showing the vulnerable path still exists in the shipped tag or published artifact for that later version.
79113
- SSRF reports against the operator-managed HTTP/WebSocket proxy-routing feature whose only claim is that ordinary process-local HTTP clients (`fetch`, `node:http`, `node:https`, WebSocket clients, axios/got/node-fetch-style clients) can reach an internal, metadata, private, or otherwise sensitive destination when proxy routing is disabled, missing, or the operator-managed proxy policy allows it. For this feature, OpenClaw provides fail-closed proxy routing when enabled; the external proxy's destination policy is operator infrastructure, not an OpenClaw-controlled security boundary. See [Network proxy](https://docs.openclaw.ai/security/network-proxy).
80114

81-
### Duplicate Report Handling
82-
83-
- Search existing advisories before filing.
84-
- Include likely duplicate GHSA IDs in your report when applicable.
85-
- Maintainers may close lower-quality/later duplicates in favor of the earliest high-quality canonical report.
86-
87-
## Security & Trust
88-
89-
**Jamieson O'Reilly** ([@theonejvo](https://twitter.com/theonejvo)) is Security & Trust at OpenClaw. Jamieson is the founder of [Dvuln](https://dvuln.com) and brings extensive experience in offensive security, penetration testing, and security program development.
90-
91-
## Bug Bounties
92-
93-
OpenClaw is a labor of love. There is no bug bounty program and no budget for paid reports. Please still disclose responsibly so we can fix issues quickly.
94-
The best way to help the project right now is by sending PRs.
95-
96-
## Maintainers: GHSA Updates via CLI
115+
### Maintainer GHSA Updates via CLI
97116

98117
When patching a GHSA via `gh api`, include `X-GitHub-Api-Version: 2022-11-28` (or newer). Without it, some fields (notably CVSS) may not persist even if the request returns 200.
99118

100-
## Operator Trust Model (Important)
119+
### Operator Trust Model
101120

102121
OpenClaw does **not** model one gateway as a multi-tenant, adversarial user boundary.
103122

@@ -122,15 +141,15 @@ OpenClaw does **not** model one gateway as a multi-tenant, adversarial user boun
122141
- Implicit exec calls (no explicit host in the tool call) follow the same behavior.
123142
- This is expected in OpenClaw's one-user trusted-operator model. If you need isolation, enable sandbox mode (`non-main`/`all`) and keep strict tool policy.
124143

125-
## Trusted Plugin Concept (Core)
144+
### Trusted Plugins
126145

127146
Plugins/extensions are part of OpenClaw's trusted computing base for a gateway.
128147

129148
- Installing or enabling a plugin grants it the same trust level as local code running on that gateway host.
130149
- Plugin behavior such as reading env/files or running host commands is expected inside this trust boundary.
131150
- Security reports must show a boundary bypass (for example unauthenticated plugin load, allowlist/policy bypass, or sandbox/path-safety bypass), not only malicious behavior from a trusted-installed plugin.
132151

133-
## Out of Scope
152+
### Out of Scope
134153

135154
- Public Internet Exposure
136155
- Using OpenClaw in ways that the docs recommend not to
@@ -156,7 +175,7 @@ Plugins/extensions are part of OpenClaw's trusted computing base for a gateway.
156175
- Reports whose only claim is that a platform-provided upload destination URL is untrusted (for example Microsoft Teams `fileConsent/invoke` `uploadInfo.uploadUrl`) without proving attacker control in an authenticated production flow.
157176
- SSRF reports limited to the operator-managed HTTP/WebSocket proxy-routing feature where the demonstrated mitigation is to enable/configure `proxy.enabled` with a filtering `proxy.proxyUrl`/`OPENCLAW_PROXY_URL`, or where impact depends on a permissive/misconfigured operator proxy. This only covers normal process-local HTTP(S)/WebSocket egress (`fetch`, Node HTTP(S), and similar JavaScript clients); non-HTTP egress and other features are assessed separately. See [Network proxy](https://docs.openclaw.ai/security/network-proxy).
158177

159-
## Deployment Assumptions
178+
### Deployment Assumptions
160179

161180
OpenClaw security guidance assumes:
162181

@@ -166,7 +185,7 @@ OpenClaw security guidance assumes:
166185
- Authenticated Gateway callers are treated as trusted operators. Session identifiers (for example `sessionKey`) are routing controls, not per-user authorization boundaries.
167186
- Multiple gateway instances can run on one machine, but the recommended model is clean per-user isolation (prefer one host/VPS per user).
168187

169-
## One-User Trust Model (Personal Assistant)
188+
### One-User Trust Model
170189

171190
OpenClaw's security model is "personal assistant" (one trusted operator, potentially many agents), not "shared multi-tenant bus."
172191

@@ -178,7 +197,7 @@ OpenClaw's security model is "personal assistant" (one trusted operator, potenti
178197
- For company-shared setups, use a dedicated machine/VM/container and dedicated accounts; avoid mixing personal data on that runtime.
179198
- If that host/browser profile is logged into personal accounts (for example Apple/Google/personal password manager), you have collapsed the boundary and increased personal-data exposure risk.
180199

181-
## Context Visibility and Allowlists
200+
### Context Visibility and Allowlists
182201

183202
OpenClaw distinguishes:
184203

@@ -196,15 +215,15 @@ Reports that only show supplemental-context visibility differences are typically
196215

197216
Hardening roadmap may add explicit visibility modes (for example `all`, `allowlist`, `allowlist_quote`) so operators can opt into stricter context filtering with predictable tradeoffs.
198217

199-
## Agent and Model Assumptions
218+
### Agent and Model Assumptions
200219

201220
- The model/agent is **not** a trusted principal. Assume prompt/content injection can manipulate behavior.
202221
- Security boundaries come from host/config trust, auth, tool policy, sandboxing, and exec approvals.
203222
- Prompt injection by itself is not a vulnerability report unless it crosses one of those boundaries.
204223
- Hook/webhook-driven payloads should be treated as untrusted content; keep unsafe bypass flags disabled unless doing tightly scoped debugging (`hooks.gmail.allowUnsafeExternalContent`, `hooks.mappings[].allowUnsafeExternalContent`).
205224
- Weak model tiers are generally easier to prompt-inject. For tool-enabled or hook-driven agents, prefer strong modern model tiers and strict tool policy (for example `tools.profile: "messaging"` or stricter), plus sandboxing where possible.
206225

207-
## Gateway and Node trust concept
226+
### Gateway and Node Trust Concept
208227

209228
OpenClaw separates routing from execution, but both remain inside the same operator trust boundary:
210229

@@ -215,7 +234,7 @@ OpenClaw separates routing from execution, but both remain inside the same opera
215234
- Differences in command-risk warning heuristics between exec surfaces (`gateway`, `node`, `sandbox`) do not, by themselves, constitute a security-boundary bypass.
216235
- For untrusted-user isolation, split by trust boundary: separate gateways and separate OS users/hosts per boundary.
217236

218-
## Workspace Memory Trust Boundary
237+
### Workspace Memory Trust Boundary
219238

220239
`MEMORY.md` and `memory/*.md` are plain workspace files and are treated as trusted local operator state.
221240

@@ -224,15 +243,15 @@ OpenClaw separates routing from execution, but both remain inside the same opera
224243
- Example report pattern considered out of scope: "attacker writes malicious content into `memory/*.md`, then `memory_search` returns it."
225244
- If you need isolation between mutually untrusted users, split by OS user or host and run separate gateways.
226245

227-
## Plugin Trust Boundary
246+
### Plugin Trust Boundary
228247

229248
Plugins/extensions are loaded **in-process** with the Gateway and are treated as trusted code.
230249

231250
- Plugins can execute with the same OS privileges as the OpenClaw process.
232251
- Runtime helpers (for example `runtime.system.runCommandWithTimeout`) are convenience APIs, not a sandbox boundary.
233252
- Only install plugins you trust, and prefer `plugins.allow` to pin explicit trusted plugin ids.
234253

235-
## Temp Folder Boundary (Media/Sandbox)
254+
### Temp Folder Boundary
236255

237256
OpenClaw uses a dedicated temp root for local media handoff and sandbox-adjacent temp artifacts:
238257

@@ -249,27 +268,27 @@ Security boundary notes:
249268
- SDK temp helpers: `src/plugin-sdk/temp-path.ts`
250269
- messaging/channel tmp guardrail: `scripts/check-no-random-messaging-tmp.mjs`
251270

252-
## Operational Guidance
271+
### Operational Guidance
253272

254273
For threat model + hardening guidance (including `openclaw security audit --deep` and `--fix`), see:
255274

256275
- `https://docs.openclaw.ai/gateway/security`
257276

258-
### Tool filesystem hardening
277+
#### Tool Filesystem Hardening
259278

260279
- `tools.exec.applyPatch.workspaceOnly: true` (recommended): keeps `apply_patch` writes/deletes within the configured workspace directory.
261280
- `tools.fs.workspaceOnly: true` (optional): restricts `read`/`write`/`edit`/`apply_patch` paths and native prompt image auto-load paths to the workspace directory.
262281
- Avoid setting `tools.exec.applyPatch.workspaceOnly: false` unless you fully trust who can trigger tool execution.
263282

264-
### Sub-agent delegation hardening
283+
#### Sub-Agent Delegation Hardening
265284

266285
- Keep `sessions_spawn` denied unless you explicitly need delegated runs.
267286
- Keep `agents.list[].subagents.allowAgents` narrow, and only include agents with sandbox settings you trust.
268287
- When delegation must stay sandboxed, call `sessions_spawn` with `sandbox: "require"` (default is `inherit`).
269288
- `sandbox: "require"` rejects the spawn unless the target child runtime is sandboxed.
270289
- This prevents a less-restricted session from delegating work into an unsandboxed child by mistake.
271290

272-
### Web Interface Safety
291+
#### Web Interface Safety
273292

274293
OpenClaw's web interface (Gateway Control UI + HTTP endpoints) is intended for **local use only**.
275294

@@ -321,12 +340,39 @@ docker run --read-only --cap-drop=ALL \
321340

322341
## Security Scanning
323342

324-
This project uses `detect-secrets` for automated secret detection in CI/CD.
325-
See `.detect-secrets.cfg` for configuration and `.secrets.baseline` for the baseline.
343+
OpenClaw uses several security and release-validation layers. No single scanner is treated as the boundary.
344+
345+
### Secret Detection
326346

327-
Run locally:
347+
OpenClaw uses `detect-secrets` with a checked-in baseline and local exclusion notes (`.secrets.baseline`, `.detect-secrets.cfg`). Secret-resolution behavior is also covered by the dedicated secrets test surface.
348+
349+
Run the baseline scan locally:
328350

329351
```bash
330352
pip install detect-secrets==1.5.0
331353
detect-secrets scan --baseline .secrets.baseline
332354
```
355+
356+
### Static Analysis
357+
358+
CI runs CodeQL across core TypeScript, GitHub Actions, Android, macOS, and high-risk runtime boundaries using `.github/workflows/codeql*.yml` and `.github/codeql/*.yml`.
359+
360+
OpenGrep provides a high-precision Semgrep-compatible layer. PRs run a changed-path scan; maintainers can run a full repository scan when needed. The rulepack lives under `security/opengrep/`, with `.semgrepignore` as the shared exclusion file.
361+
362+
Run the local OpenGrep wrapper after installing `opengrep`:
363+
364+
```bash
365+
scripts/run-opengrep.sh --changed --sarif --error
366+
pnpm check:opengrep-rule-metadata
367+
```
368+
369+
### E2E and Live Validation
370+
371+
Security-relevant behavior is also covered by runtime validation, not only static scanning:
372+
373+
- `pnpm test:e2e` for repo E2E coverage.
374+
- `pnpm test:live` for live provider/runtime coverage.
375+
- `pnpm test:docker:all` for Docker-packaged runtime scenarios.
376+
- Package acceptance and scheduled live/E2E workflows for release-path validation.
377+
378+
These lanes exercise packaged installs, gateway/runtime behavior, live model/provider paths, Docker scenarios, and platform smoke tests. They complement scanners by proving the security-sensitive flows still behave correctly in real runtime environments.

0 commit comments

Comments
 (0)