Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
f69bdb7
fix(openclaw): contextualize managed audit findings
chengjiew Jul 9, 2026
61b4c2e
test(openclaw): cover secure loopback audit config
chengjiew Jul 9, 2026
f48b03a
fix(openclaw): keep remote insecure auth findings active
chengjiew Jul 9, 2026
9578a1e
test(openclaw): verify audit suppression contract
chengjiew Jul 9, 2026
0986ad0
test(openclaw): keep audit harness linear
chengjiew Jul 9, 2026
c0f0208
fix(openclaw): keep remote device auth warnings active
chengjiew Jul 9, 2026
6d13451
fix(openclaw): harden audit suppression contract
chengjiew Jul 9, 2026
73d21e8
test(openclaw): cover remote audit findings
chengjiew Jul 9, 2026
340085b
test(openclaw): complete real audit matrix
apurvvkumaria Jul 9, 2026
843ab80
fix(openclaw): keep remote-bind audit findings active
apurvvkumaria Jul 9, 2026
6ba1e2d
docs(security): clarify remote dashboard audit scope
apurvvkumaria Jul 9, 2026
81f75cd
fix(openclaw): align remote bind audit lifecycle
chengjiew Jul 9, 2026
1b5f2ac
refactor(onboard): keep registration entrypoint neutral
chengjiew Jul 9, 2026
742fc16
fix(openclaw): prepare remote dashboard posture
chengjiew Jul 9, 2026
16e8a32
test(openclaw): keep remote lifecycle checks linear
chengjiew Jul 9, 2026
ef1d379
fix(onboard): require remote bind contract
chengjiew Jul 9, 2026
5123111
fix(onboard): persist verified remote bind state
chengjiew Jul 9, 2026
90e8cce
fix(openclaw): verify remote dashboard bind contract
prekshivyas Jul 10, 2026
61ab1ba
Merge remote-tracking branch 'origin/main' into fix/6024_openclaw_sec…
prekshivyas Jul 10, 2026
e37befe
test(openclaw): include remote bind metadata in mocks
prekshivyas Jul 10, 2026
0b67c10
Merge branch 'main' into fix/6024_openclaw_security_audit
prekshivyas Jul 10, 2026
16b671d
ci: provision ripgrep for advisor tool shards
prekshivyas Jul 10, 2026
721946a
fix(onboard): require final-stage remote dashboard bind proof
prekshivyas Jul 10, 2026
505b6c6
fix(onboard): reject remote bind config overwrites
prekshivyas Jul 10, 2026
9843ecc
docs(troubleshooting): split remote bind guidance lines
prekshivyas Jul 10, 2026
2c86279
Merge remote-tracking branch 'upstream/main' into HEAD
prekshivyas Jul 10, 2026
07771a9
test(sandbox): budget MCP status subprocess suite
prekshivyas Jul 10, 2026
e86fd8c
test(e2e): wait for dashboard remote bind proof
prekshivyas Jul 10, 2026
cc57a96
test(e2e): keep dashboard proof wait linear
prekshivyas Jul 10, 2026
8967b47
test(e2e): accept dashboard connect background proof
prekshivyas Jul 10, 2026
b7ac87e
test(e2e): document dashboard remote bind parity
prekshivyas Jul 10, 2026
ff15660
test(e2e): accept dashboard forward proof on stderr
prekshivyas Jul 10, 2026
f44b5ec
fix(onboard): fail closed on remote bind rewrites
prekshivyas Jul 10, 2026
63ae5a2
fix(onboard): fail closed on remote bind config rewrites
prekshivyas Jul 10, 2026
4568f0b
Merge remote-tracking branch 'upstream/main' into HEAD
prekshivyas Jul 10, 2026
9e01332
Merge remote-tracking branch 'upstream/fix/6024_openclaw_security_aud…
prekshivyas Jul 10, 2026
5bccefc
Merge remote-tracking branch 'upstream/main' into fix/6024_openclaw_s…
prekshivyas Jul 10, 2026
fa3d143
fix(security): harden remote bind and auth provenance
prekshivyas Jul 10, 2026
24006e1
fix(security): require exact managed proxy patch
prekshivyas Jul 10, 2026
81982b9
Merge branch 'main' into fix/6024_openclaw_security_audit
cjagwani Jul 10, 2026
e1e9e04
fix(security): verify remote forward state
prekshivyas Jul 10, 2026
9286e81
fix(security): reject custom remote dashboard builds
prekshivyas Jul 10, 2026
5505720
Merge remote-tracking branch 'upstream/main' into fix/6024_openclaw_s…
prekshivyas Jul 10, 2026
701fe7d
fix(security): harden remote dashboard bind contracts
prekshivyas Jul 10, 2026
eda1c70
Merge remote-tracking branch 'upstream/main' into fix/6024_openclaw_s…
prekshivyas Jul 10, 2026
932d3ba
test(security): make remote bind evidence explicit
prekshivyas Jul 10, 2026
ca35daf
Merge remote-tracking branch 'upstream/main' into fix/6024_openclaw_s…
prekshivyas Jul 10, 2026
bcd744e
Merge remote-tracking branch 'upstream/main' into fix/6024_openclaw_s…
prekshivyas Jul 10, 2026
f3d0334
refactor(onboard): keep dashboard contract isolated
prekshivyas Jul 11, 2026
2e59b3d
test(onboard): cover remote bind restart edges
prekshivyas Jul 11, 2026
bdc36f0
Merge branch 'main' into fix/6024_openclaw_security_audit
cv Jul 11, 2026
d0c1866
fix(onboard): refresh dashboard bind trust digest
cv Jul 11, 2026
7c7f47c
fix(connect): restore loopback dashboard forwarding
cv Jul 11, 2026
20ec7ef
merge(main): sync current release target
cv Jul 11, 2026
d1aef53
fix(connect): preserve WSL dashboard forwarding
cv Jul 11, 2026
277ef58
merge(main): sync current release target
cv Jul 11, 2026
59e89de
fix(security): preserve WSL dashboard audit findings
cv Jul 11, 2026
2bd260c
merge(main): sync current release target
cv Jul 11, 2026
94b7128
fix(onboard): keep legacy Dockerfiles compatible
cv Jul 11, 2026
6eb0794
Merge branch 'main' into fix/6024_openclaw_security_audit
cv Jul 11, 2026
fa3d7d0
Merge branch 'main' into fix/6024_openclaw_security_audit
cv Jul 11, 2026
baba0bd
fix(connect): honor requested dashboard bind
cv Jul 11, 2026
95b9d34
test(connect): keep remote recovery setup linear
cv Jul 11, 2026
31edc93
merge(main): sync current release target
cv Jul 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 17 additions & 3 deletions docs/security/best-practices.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -643,10 +643,10 @@ Device authentication requires each connecting device to go through a pairing fl

| Aspect | Detail |
|---|---|
| Default | Enabled. The gateway requires device pairing for all connections. |
| What you can change | Set `NEMOCLAW_DISABLE_DEVICE_AUTH=1` as a Docker build argument to disable device authentication. This is a build-time setting baked into `openclaw.json` and verified by hash at startup. |
| Default | Enabled for loopback dashboards. NemoClaw disables device authentication for non-loopback `CHAT_UI_URL` values and when `NEMOCLAW_DISABLE_DEVICE_AUTH=1`. |
| What you can change | Use a loopback `CHAT_UI_URL` to retain device authentication. Set `NEMOCLAW_DISABLE_DEVICE_AUTH=1` only as a deliberate build-time opt-out. The setting is baked into `openclaw.json` and verified by hash at startup. |
| Risk if relaxed | Disabling device auth allows any device on the network to connect to the gateway without proving identity. This is dangerous when combined with LAN-bind changes or cloudflared tunnels in remote deployments, resulting in an unauthenticated, publicly reachable dashboard. |
| Recommendation | Keep device auth enabled (the default). Only disable it for headless or development environments where no untrusted devices can reach the gateway. |
| Recommendation | Prefer loopback access or SSH port forwarding so device authentication stays enabled. If a browser-only remote dashboard requires the compatibility setting, use HTTPS and restrict who can reach the dashboard. |

### Gateway Bind Address

Expand Down Expand Up @@ -683,6 +683,20 @@ The `allowInsecureAuth` setting controls whether the gateway permits non-HTTPS a
| Risk if relaxed | Allowing insecure auth over HTTPS defeats the purpose of TLS, because authentication tokens transit in cleartext. |
| Recommendation | Use `https://` for any deployment accessible beyond `localhost`. The default local URL (`http://127.0.0.1:18789`) correctly allows insecure auth for local development. |

OpenClaw's security audit keeps NemoClaw-managed `allowInsecureAuth` and `dangerouslyDisableDeviceAuth` findings visible as accepted findings instead of counting them as unexplained active findings.
The generated configuration uses exact audit check IDs and flag details, records why each setting is present, and leaves the original severity and remediation under `suppressedFindings` in JSON output.
The audit also reports that suppressions are active so you can review the accepted risk.
These suppressions change audit reporting only.
They do not make either flag safe, weaken enforcement, or suppress unrelated findings.

Review the accepted findings and their recorded reasons:

```bash
openclaw security audit --json | jq '.suppressedFindings'
```

Remove the underlying risky condition when dashboard compatibility no longer requires it.

### Auto-Pair Client Allowlist

The auto-pair watcher automatically approves device pairing requests from recognized clients, so you do not need to manually approve the Control UI.
Expand Down
28 changes: 28 additions & 0 deletions scripts/generate-openclaw-config.mts
Original file line number Diff line number Diff line change
Expand Up @@ -1192,6 +1192,31 @@ export function buildConfig(env: Env = process.env): JsonObject {
const isRemote = !isLoopback(parsed.hostname || "");
const disableDeviceAuth = env.NEMOCLAW_DISABLE_DEVICE_AUTH === "1" || isRemote;
const allowInsecure = parsed.scheme === "http";
const securityAuditSuppressions: JsonObject[] = [];
if (allowInsecure) {
const reason =
"NemoClaw derives this setting from an HTTP CHAT_UI_URL; use HTTPS for non-loopback dashboards.";
securityAuditSuppressions.push(
{ checkId: "gateway.control_ui.insecure_auth", reason },
{
checkId: "config.insecure_or_dangerous_flags",
detailIncludes: "gateway.controlUi.allowInsecureAuth=true",
reason,
},
);
}
if (disableDeviceAuth) {
const reason =
"NemoClaw enables this compatibility setting for non-loopback or explicitly opted-out dashboards; use loopback access to retain device authentication.";
securityAuditSuppressions.push(
{ checkId: "gateway.control_ui.device_auth_disabled", reason },
{
checkId: "config.insecure_or_dangerous_flags",
detailIncludes: "gateway.controlUi.dangerouslyDisableDeviceAuth=true",
reason,
},
);
}

const providerModels: JsonObject[] = [
{
Expand Down Expand Up @@ -1311,6 +1336,9 @@ export function buildConfig(env: Env = process.env): JsonObject {
channels: { defaults: {} },
tools: openclawTools,
update: { checkOnStart: false },
...(securityAuditSuppressions.length > 0
? { security: { audit: { suppressions: securityAuditSuppressions } } }
: {}),
plugins,
gateway: {
mode: "local",
Expand Down
65 changes: 65 additions & 0 deletions test/generate-openclaw-config-security-audit.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0

import { describe, expect, it } from "vitest";

import { buildConfig } from "../scripts/generate-openclaw-config.mts";

const BASE_ENV: Record<string, string> = {
NEMOCLAW_MODEL: "test-model",
NEMOCLAW_PROVIDER_KEY: "test-provider",
NEMOCLAW_PRIMARY_MODEL_REF: "test-ref",
NEMOCLAW_INFERENCE_BASE_URL: "http://localhost:8080",
NEMOCLAW_INFERENCE_API: "openai",
};

function buildSecurityAuditConfig(chatUiUrl: string): any {
return buildConfig({ ...BASE_ENV, CHAT_UI_URL: chatUiUrl });
}

describe("generate-openclaw-config.mts: managed security audit findings", () => {
it("explains NemoClaw-managed insecure auth findings (#6024)", () => {
const config = buildSecurityAuditConfig("http://127.0.0.1:18789");
expect(config.security.audit.suppressions).toEqual([
{
checkId: "gateway.control_ui.insecure_auth",
reason:
"NemoClaw derives this setting from an HTTP CHAT_UI_URL; use HTTPS for non-loopback dashboards.",
},
{
checkId: "config.insecure_or_dangerous_flags",
detailIncludes: "gateway.controlUi.allowInsecureAuth=true",
reason:
"NemoClaw derives this setting from an HTTP CHAT_UI_URL; use HTTPS for non-loopback dashboards.",
},
]);
});

it("explains NemoClaw-managed device auth findings (#6024)", () => {
const config = buildSecurityAuditConfig("https://nemoclaw0-xxx.brevlab.com:18789");
expect(config.security.audit.suppressions).toEqual([
{
checkId: "gateway.control_ui.device_auth_disabled",
reason:
"NemoClaw enables this compatibility setting for non-loopback or explicitly opted-out dashboards; use loopback access to retain device authentication.",
},
{
checkId: "config.insecure_or_dangerous_flags",
detailIncludes: "gateway.controlUi.dangerouslyDisableDeviceAuth=true",
reason:
"NemoClaw enables this compatibility setting for non-loopback or explicitly opted-out dashboards; use loopback access to retain device authentication.",
},
]);
});

it("explains both managed flags for a non-loopback HTTP dashboard (#6024)", () => {
const config = buildSecurityAuditConfig("http://remote.example:18789");
expect(config.security.audit.suppressions).toHaveLength(4);
expect(config.security.audit.suppressions.map((entry: any) => entry.checkId)).toEqual([
"gateway.control_ui.insecure_auth",
"config.insecure_or_dangerous_flags",
"gateway.control_ui.device_auth_disabled",
"config.insecure_or_dangerous_flags",
]);
});
});
Loading