docs: deep production audit 2026-05-07 (cross-repo) - #6
Conversation
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
CI note: the three This PR adds a single file (
The audit report itself flags the Generated by Claude Code |
Summary
Adds
DEEP-AUDIT-REPORT-2026-05-07.md— cross-repo deep audit. Same file committed toclaude/create-main-branch-audit-SsbNGin all 7 repos.sigops-agent-specific P0 / P1
SecurityPolicyis dead code on the hot path.src/executor.rsinvokesSysCommand::new(...)directly forsigops.restart,sigops.http,sigops.notify_slack,sigops.condition,sigops.wait— bypassing the whitelist, deny-list, timeout, and..-traversal checks defined insrc/security.rs. The 24 hardening tests pass but no production caller wirespolicy.run(). CLAUDE.md HARD RULE 3 ("No shell injection — all commands go through the whitelist") is therefore not enforced.sigops.restartaccepts attacker-controlledcmd.input["method"]with no allow-list. A malicious server can setmethodto any binary on PATH; service-name sanitization protects only the second arg.src/health.rsbinds0.0.0.0:9100(public on every NIC) and doesn't parse the request line — every TCP connect returns agent metadata regardless of method/path. Information disclosure.--no-healthandSIGOPS_HEALTH_PORTbutConfighas neither field; port hardcoded inmain.rs.tracing::warn!(body = %body)insrc/heartbeat.rserror paths logs full server response body — may leak rotated-token JSON on error responses.SIGOPS_SERVER_URL,SIGOPS_API_KEY,SIGOPS_POLL_INTERVAL,SIGOPS_HEALTH_PORT,SIGOPS_NO_HEALTH,SIGOPS_LOG_LEVEL) don't match clap (API_TOKEN,HEARTBEAT_INTERVAL, etc.) — operators following README will fail to configure.Config::api_tokendefaults to empty string — agent will start with no auth.tokens.maybe_rotateaccepts arbitrary server-issued tokens; defaultTokenStore::newdoesn't persist → rotation lost on restart.sigops.notify_slackskipsvalidate_urlforwebhookUrl.executor::execute_waituses blockingstd::thread::sleepinside tokio runtime — up to 3600s blocks calling thread.sigops.waitoutlives shutdown).Test plan
policy.run()and addmethodallow-list forsigops.restart(P0 — single PR closes the largest open security gap in the ecosystem)127.0.0.1--no-health/--health-porttoConfig; sync README env-var names with clapDraft for visibility only — no code changes.
Generated by Claude Code