simdiff turns a proposed action into a structured effect delta that a policy can decide on. It is a building block, not a complete defense. Understand these properties before relying on it.
- A canonical description of an action's effect (value moves, authority grants, data access, egress), so your policy decides over the effect, not the request.
- Fail-closed classification: anything an adapter cannot fully account for
goes into
unknownand makesdelta.fully_classifiedFalse. Treat that as block / escalate.
fully_classifiedis not a safety verdict. It means "the effect was understood", not "the action is safe". A fully-classified delta can be a destructive delete or an exfiltration. The allow/block decision is yours.- It is not a sandbox. The
filesystemandsqladapters execute the action to observe its effect:filesystemruns the supplied callable against a copied directory. The copy only protects the original directory — the callable can still touch absolute paths, the network, or anything else the process can.sqlruns the statement inside a savepoint and rolls back row changes. Side effects (triggers,load_extension, files written by extensions) are not undone.- Mitigation: run simdiff inside your own isolation (container, VM, seccomp, unprivileged user) whenever the action is untrusted.
shell/httpinterpret the request; they do not simulate. They are conservative and fail closed on anything unmodelled, so they tend to produce many false positives on real workloads — that is the intended trade-off, but it is not zero-false-positive in practice.- The
shelladapter drops flags it does not model. Flags that take a value and invert operands (cp -t DIR/mv -t DIR) are detected and fail closed. Other value-taking flags (mkdir -m MODE,touch -r REF) are dropped, which can add a spurious operand to the delta (a false positive, never a hidden effect). - The
shelladapter trustsexistingas ground truth. ADELETE/mv-source on a path you did not list inexistingis treated as a no-op (the file is assumed not to exist), so it produces no delta and staysfully_classified. Ifexistingis incomplete relative to the real filesystem, a real deletion can be invisible. Mitigation: populateexistingfrom the actual sandbox listing, not a guess. solanaonly inspects accounts you pass inwatch. Effects on accounts you did not enumerate are invisible. An emptywatchfails closed (it certifies nothing), but a non-empty-but-incompletewatchdoes not — list every account the transaction can touch. Pre- and post-state come from two RPC calls and may be a slot apart.
Open a GitHub issue, or for sensitive reports use the repository's private vulnerability reporting. Please include a minimal reproduction.