mirror of
https://github.com/norandom/OpenUltraSAST.git
synced 2026-10-16 03:49:26 +00:00
feat(pre-push-safety-net): export the enumerated operation inventory (M1b 10.4)
A taint answer reports traced flows, so an absent row means either that the operation is not present or that no traced path reached it. Change comparison needs that distinction to say a change introduced an operation, and reachability is deliberately bounded, so the two can never be separated from flow rows alone. That is why the veto guarding the confusion is permanently true on any real Express application, and why it could be neither discharged nor safely removed. The taint query now exports one row per operation it enumerated in scope, plus a completion marker. The marker is what makes an empty inventory meaningful: without it a scope that was never enumerated and a scope holding no such operation are indistinguishable. Comparison separates three outcomes on a changed line: the operation is present in the base without a traced flow, which is a reachability statement and not novelty; the operation is absent from an enumerated base, which establishes that the change introduced it; or the base scope was never enumerated, which stays explicitly unresolved. A malformed inventory row is not an empty inventory. The arbiter now skips any row carrying a kind, so an inventory row cannot be normalized into a flow with an empty source that names no attacker input. Verified against the real engine on an authored two-revision JavaScript control: the operation is enumerated on both sides, the base carries it with zero traced flows, the zero-operation marker appears for an empty scope, and answers and findings are unchanged. No new sink inference, alias resolver or second source IR. 1,354 tests passed, nine skipped. Rollout stays NO-GO. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]> Claude-Session: https://claude.ai/code/session_01EmM1j46qgKMh3zqD1QMwEo
This commit is contained in:
co-authored by
Claude Opus 5
parent
86980d8aa0
commit
c73efd2bde
@@ -0,0 +1,86 @@
|
||||
{
|
||||
"schema_version": 1,
|
||||
"experiment": "operation-inventory-engine-smoke-v1",
|
||||
"milestone": "M1b task 10.4",
|
||||
"purpose": "Verify on the real engine that the taint query emits the enumerated operation inventory separately from traced flows, and that adding it does not disturb answers or the arbiter.",
|
||||
"provenance": {
|
||||
"engine": "joern-4.0.625",
|
||||
"engine_runtime": "7213365694f836758cb5fe2b05504cbbb735b8c2f0dea5d5dd19546a1f5fd43d",
|
||||
"facts": "32edb6e1a78f1afb08ac4248cd436be16663e0d90dc1b3aaf948f2ce49a5a8f0",
|
||||
"queries": "9e1f00272daec14cf9a4632a763fba9e5e629bf6a851f3fff81e60d665734932",
|
||||
"policy": "a641f6d1241702b4290574dd70e825176fbf0f8b03517d92f4051bac1b59dc92",
|
||||
"core": "5de41aaa2e7b8706fae265b7ba1a0aad724395ee05cb2bf99edcd8391b5aa48f",
|
||||
"semantics": "b08156ca261c602c6626fa10546d3ae926bdfa11324a1a2d5dcbce5ca0bd70f4"
|
||||
},
|
||||
"source": {
|
||||
"path": "app/api.js",
|
||||
"base_change": "const safe = \"fixed\" -> req.body.value",
|
||||
"note": "authored two-revision control, not a security claim"
|
||||
},
|
||||
"observations": [
|
||||
{
|
||||
"side": "head",
|
||||
"question": {
|
||||
"path": "app/api.js",
|
||||
"function": "handler",
|
||||
"family": "injection"
|
||||
},
|
||||
"status": "unresolved",
|
||||
"reason": "change_context_incomplete",
|
||||
"flow_rows": 1,
|
||||
"inventory_operations": [
|
||||
"eval(safe) at app/api.js:5"
|
||||
],
|
||||
"inventory_complete_marker": {
|
||||
"kind": "operation_inventory_complete",
|
||||
"operations": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"side": "head",
|
||||
"question": {
|
||||
"path": "app/api.js",
|
||||
"function": "<module>",
|
||||
"family": "injection"
|
||||
},
|
||||
"status": "unresolved",
|
||||
"reason": "change_context_incomplete",
|
||||
"flow_rows": 0,
|
||||
"inventory_operations": [],
|
||||
"inventory_complete_marker": {
|
||||
"kind": "operation_inventory_complete",
|
||||
"operations": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"side": "base",
|
||||
"question": {
|
||||
"path": "app/api.js",
|
||||
"function": "handler",
|
||||
"family": "injection"
|
||||
},
|
||||
"status": "completed",
|
||||
"reason": "query_answered_and_arbitrated",
|
||||
"flow_rows": 0,
|
||||
"inventory_operations": [
|
||||
"eval(safe) at app/api.js:5"
|
||||
],
|
||||
"inventory_complete_marker": {
|
||||
"kind": "operation_inventory_complete",
|
||||
"operations": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"One authored two-revision JavaScript control; no detection, precision, recall or latency claim.",
|
||||
"Exercises inventory emission and answer integrity, not the changed-line novelty branch."
|
||||
],
|
||||
"findings_by_side": {
|
||||
"head": 1,
|
||||
"base": 0
|
||||
},
|
||||
"degradations_by_side": {
|
||||
"head": [],
|
||||
"base": []
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user