mirror of
https://github.com/ruvnet/ruflo.git
synced 2026-09-14 14:01:28 +08:00
a6dd4ab3d5
* feat(security): #2149 ADR-131 P1 — ToolOutputGuardrail + OWASP 2026 mapping Closes the OWASP ASI01 (Agent Goal Hijacking) gap identified in the 2026-05-26 dream cycle. Adds a pure, synchronous, pattern-based screener for content crossing the agent's content boundary (MCP tool results, memory reads, external API responses) before it enters reasoning. Design (full rationale in ADR-131): - Eight built-in pattern categories: instruction-override, embedded-system (ChatML / Llama [INST] / <system>), exfiltration, role-hijack, jailbreak, hidden-unicode (bidi + zero-width), tool-spoofing, truncation - Default policy: critical→reject, high→redact, medium→flag, low→allow - Pure-function shape — safe to invoke in every tool result / memory read - 32KB content scans in 0.1ms locally (target: <1ms p99) Scope: - P1 (this PR): class + tests + exports + ADR + OWASP matrix + CI smoke - P2-P5 (follow-on): MCP dispatch, memory read, swarm Raft payload, per-tool policy + telemetry — tracked in ADR-131 Validation: - 24/24 vitest tests pass (9ms) - 11/11 smoke checks against built dist/index.js - Tested against the four canonical ASI01 attack shapes - CI guard `tool-output-guardrail-smoke` wired into v3-ci.yml OWASP Top 10 for Agentic Applications 2026 control matrix added: v3/docs/security/owasp-agents-2026-mapping.md — flags ASI01/06/09/10 as highest-priority remaining gaps. Co-Authored-By: RuFlo <ruv@ruv.net> * fix(plugins/ruflo-core/hooks): #2155 — wrap 3 unwrapped .sh hooks in /bin/bash -c Three hooks (PreToolUse:Bash, PreToolUse:Write|Edit|MultiEdit, Stop) invoked scripts/ruflo-hook.sh directly without an outer shell wrapper. On Windows, Claude Code's hook executor spawned the .sh path, Node read the shebang, attempted to exec /bin/bash (absent on Windows), and exited with code 126 — surfacing as PostToolUse:Bash/PreToolUse:Bash/Stop hook errors in every user session. Wrapped each invocation in /bin/bash -c '... || true' to match the existing pattern of the four other hooks in the same file. The || true fallback now executes inside the bash subshell rather than relying on the .sh body being readable. Validated as still working on POSIX. Co-Authored-By: RuFlo <ruv@ruv.net>