ClawSecCheck v1.4.0
Multi-agent privilege separation. The trifecta check (A1) flattens the whole setup into one
capability surface, so it can't tell a monolithic agent (one agent holds all three legs) from a
properly separated fleet where no single agent does β and it fails the separated fleet anyway. Two
new checks close that blind spot. Grounded against the real OpenClaw schema
(docs/research/multiagent-privilege-separation.md): config expresses the fact of multi-agent
topology but not the delegation graph, per-agent tool allowlists, or inter-agent data-handling β
so per-agent analysis is attestation-driven, and the runtime parts stay honestly out of scope.
Added
- B45 β per-agent privilege separation (trifecta decomposition). Reads the attested agent roster
(newagents: [{name, tools}]block in the--attestself-report;--asktemplate updated) and
classifies each agent's trifecta legs itself. WARN when a single agent holds all three legs
(separation absent); PASS when none does (necessary condition met β explicitly not a safety
guarantee); UNKNOWN without a roster.ATTESTEDconfidence, advisory (unscored) β like B43/B44, the
verdict rests on a self-report the static config can't corroborate, so it never moves the grade. - B46 β multi-agent trifecta exposure. Config-only, scored: spawnable subagents + the global
trifecta active + no exec approval gate β WARN. Capped at WARN so it can never introduce a new FAIL
on a real config; a deliberate light nudge layered on A1, not a duplicate. - New attestation parser
attest.attested_agents()(tolerant, mirrorsattested_paths());agents
block added totemplate()/_questions, additive under the sameclawseccheck-attest/1schema
(older attestations stay valid).
Notes
- Zero false-positive FAILs held: without
--attestB45 is UNKNOWN everywhere (no new FAIL by
construction), and B46 is capped at WARN. Verified across the real-schema fixture corpus β
home_safeunchanged (A/91, 0 FAIL),home_vulnFAIL baseline unchanged (8 FAILs), no spurious
B46 WARN. - Deferred to 1.5.0 (needs an attestation
delegationblock): cross-agent confused-deputy reassembly
(RISK-11) and the inter-agent data-handling tier (structured-return wall / text-filter sieve /
raw passthrough). The Β§4 grounding doc records why the runtime trust property stays UNKNOWN.