Security model

August 20, 2026 · View on GitHub

Objective

RiskProof reduces the risk of cross-tool data exfiltration: an agent ingests untrusted or private content, and later sends sensitive data to an external destination, where each individual call looked harmless.

Decision model

RiskProof returns a deterministic decision:

DecisionDSH mappingMeaning
allow{ kind: 'allow' }no rule matched, or the flow is safe
require_approval{ kind: 'ask', reason }a suspicious-but-unconfirmed pattern
deny{ kind: 'deny', reason }a confirmed dangerous pattern

Merging with other plugins is strictly monotonic: allow < ask < deny. RiskProof never turns another plugin's deny into allow.

Rules (v0.2, balanced preset)

Rule idTriggerDefault
cloud_metadata_link_localexternal action targets a cloud metadata / link-local hostdeny
blocked_destinationrecognized destination matches blockedDomainsdeny
catastrophic_system_operationhigh-confidence disk wipe, root/home recursive deletion, or fork bombdeny
credential_external_actionSECRET / API_KEY taint in an external actiondeny
credential_network_commandnetwork-capable command carries SECRET / API_KEY taintdeny
credential_access_after_untrustedcredential access follows external ingestiondeny
sensitive_data_external_actionsensitive taint in an external action with an external destinationdeny
sensitive_path_readprivate read names a built-in or configured credential pathask
sensitive_path_mutationlocal mutation names a built-in or configured credential pathdeny
remote_script_executionremote content is piped directly to an interpreterdeny
untrusted_code_executionuntrusted taint in code executiondeny
untrusted_local_mutationuntrusted taint is persisted to local stateask
destructive_operationrecoverable but destructive command patternask
private_data_exfiltration_chainordered EIT → PAT observed, sensitive data in an external actiondeny
suspicious_disclosure_chainordered EIT → PAT observed, external action without confirmed sensitive dataask
untrusted_private_accessprivate access after untrusted ingestionask
unlisted_external_destinationexternal destination is outside a configured non-empty allowlistask
unknown_tooltool could not be classifiedask

All rules are deterministic and explainable. No rule uses an LLM. permissive and strict change configurable rows, while hard invariants remain deny; see configuration.md.

Capabilities

Tools are classified into six capabilities (see toolchain.md). The three EXTERNAL_INGESTION, PRIVATE_ACCESS, EXTERNAL_ACTION form the attack-chain model; LOCAL_MUTATION, CODE_EXECUTION, CREDENTIAL_ACCESS cover additional risky behavior.

Classification is heuristic and conservative: a false positive only adds scrutiny, never grants capability. Explicit operator overrides always win.

Taint

Taint labels describe what security attribute data carries; provenance describes where it came from. Taint is additive — a tool output cannot remove a label (trusted declassification is future work).

Failure handling

ClassBehavior
Security decision failurefail closed (deny) — a throwing tools/pre-execute listener denies the call
Proof/telemetry failurecontained — proof storage errors are logged and do not block execution
Invalid configplugin fails to load (Schemastery validation)
Plugin programming bugcontained by the harness; the tool pipeline reports an error result

Known limitations

  • Provenance is substring-based. Summaries, translations, Base64/compression/encryption, and invisible model reasoning are not tracked. RiskProof tracks supported observable data flows.
  • Taint is pattern-based, not semantic DLP.
  • Command checks are high-confidence regex heuristics, not a complete Bash, PowerShell, or interpreter parser. Encoded, fragmented, aliased, or dynamically constructed commands may not match.
  • Destination checks inspect recognized sink fields. They do not resolve DNS, intercept process traffic, or observe network calls hidden inside an opaque tool.
  • Sensitive-path checks inspect recognized path fields. They do not replace filesystem permissions and intentionally exclude common template files.
  • State is per-session, in-memory. It does not span processes, machines, or sessions.
  • Proofs are decision evidence, not proof that a real-world side effect happened.
  • Optional proof JSONL is an operator-managed audit log. It is redacted and created with private permissions, but its directory, rotation, retention, and host access remain deployment responsibilities.
  • The plugin trusts the harness process. It is not a boundary against a compromised process or an equally-privileged loaded plugin.

Out of scope (v0.2)

OS sandbox, process-level network proxy/firewall, DNS/SSRF firewall, credential vault, tool-result rewriting, semantic DLP, LLM judge/approval, general-purpose permission-rule files, web dashboard, distributed provenance graph, multi-machine ledger, cross-session provenance, full shell parser, malware scanner, and plugin-installation scanner.