mirror of
https://github.com/tiennm99/goclaw.git
synced 2026-10-18 12:14:24 +00:00
fix(security): harden upstream critical surfaces (#32)
* fix(security): harden upstream critical surfaces Refs #30 * fix(security): close pre-landing review gaps Refs #30 * fix(security): close official release blockers
This commit is contained in:
1 parent
2a48e62c6b
commit
532ff91d8e
59 files changed
+2194
-397
No files matched your search
@@ -32,6 +32,15 @@ Or in WebSocket `connect`:
|
||||
|
||||
The gateway token is compared using **constant-time comparison** (`crypto/subtle.ConstantTimeCompare`) in both HTTP and WebSocket auth paths to prevent timing attacks. The comparison reveals no information about where the provided token first differs from the expected token.
|
||||
|
||||
Externally reachable deployments must configure a gateway token. If `gateway.token` / `GOCLAW_GATEWAY_TOKEN` is empty while the gateway binds to `0.0.0.0`, `::`, or a non-loopback address, startup fails before the health endpoint reports ready.
|
||||
|
||||
Empty-token compatibility is only for local development:
|
||||
|
||||
- bind `GOCLAW_HOST` to loopback (`127.0.0.1`, `localhost`, or `::1`), or
|
||||
- set `GOCLAW_ALLOW_INSECURE_NO_AUTH=1` explicitly.
|
||||
|
||||
The explicit opt-in applies to both HTTP and WebSocket. Do not use it on shared hosts, Docker ports exposed outside the machine, or production deployments.
|
||||
|
||||
---
|
||||
|
||||
## 2. API Keys
|
||||
@@ -100,7 +109,7 @@ GoClaw tries authentication methods in this priority order:
|
||||
1. **Gateway token** (exact match via constant-time comparison) → `RoleAdmin` or `RoleOwner` for configured owner IDs
|
||||
2. **API key** (SHA-256 hash lookup in `api_keys` table) → role from scopes
|
||||
3. **Browser pairing** (sender ID must be paired with "browser" device type) → `RoleOperator` (HTTP only; requires `X-GoClaw-Sender-Id` header)
|
||||
4. **No auth configured** (backward compatibility: if no gateway token is set) → full-access dev mode
|
||||
4. **No auth configured and local/dev mode explicitly allowed** → full-access dev mode
|
||||
5. **No valid auth found** → `401 Unauthorized`
|
||||
|
||||
### HTTP Request Flow
|
||||
@@ -116,13 +125,15 @@ flowchart TD
|
||||
G -->|Yes| H[Derive role from scopes]
|
||||
G -->|No| I{Gateway token configured?}
|
||||
I -->|Yes| J[401 Unauthorized]
|
||||
I -->|No| K[Full-access backward compat]
|
||||
I -->|No| K{Local/dev fallback allowed?}
|
||||
K -->|No| J
|
||||
K -->|Yes| O[Full-access backward compat]
|
||||
C -->|Check paired device| L{Device paired?}
|
||||
L -->|Yes| M[RoleOperator]
|
||||
L -->|No| J
|
||||
E --> N[Authenticate request]
|
||||
H --> N
|
||||
K --> N
|
||||
O --> N
|
||||
M --> N
|
||||
```
|
||||
|
||||
@@ -164,7 +175,7 @@ On successful API key authentication, `last_used_at` is updated asynchronously (
|
||||
|
||||
### Backward Compatibility
|
||||
|
||||
If no gateway token is configured (`gateway.token` is empty in `config.json`), unauthenticated requests run in backward-compatibility full-access mode. This enables self-hosted deployments without strict authentication. Once a gateway token is configured, all requests must authenticate or use browser pairing.
|
||||
If no gateway token is configured (`gateway.token` is empty in `config.json`), unauthenticated requests run in backward-compatibility full-access mode only for loopback local development or when `GOCLAW_ALLOW_INSECURE_NO_AUTH=1` is set. Once a gateway token is configured, all requests must authenticate or use browser pairing.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in new issue
Block a user