@vk.amogh/trace 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +208 -0
- package/bin/trace.js +112 -0
- package/package.json +46 -0
- package/pyproject.toml +39 -0
- package/src/trace_engine/__init__.py +8 -0
- package/src/trace_engine/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/__pycache__/cli.cpython-311.pyc +0 -0
- package/src/trace_engine/__pycache__/doctor.cpython-311.pyc +0 -0
- package/src/trace_engine/__pycache__/interactive.cpython-311.pyc +0 -0
- package/src/trace_engine/__pycache__/verify.cpython-311.pyc +0 -0
- package/src/trace_engine/ai/__init__.py +7 -0
- package/src/trace_engine/ai/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/ai/__pycache__/base.cpython-311.pyc +0 -0
- package/src/trace_engine/ai/__pycache__/ollama.cpython-311.pyc +0 -0
- package/src/trace_engine/ai/__pycache__/planner.cpython-311.pyc +0 -0
- package/src/trace_engine/ai/base.py +23 -0
- package/src/trace_engine/ai/ollama.py +50 -0
- package/src/trace_engine/ai/planner.py +40 -0
- package/src/trace_engine/apm/__init__.py +18 -0
- package/src/trace_engine/apm/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/apm/__pycache__/builder.cpython-311.pyc +0 -0
- package/src/trace_engine/apm/__pycache__/edges.cpython-311.pyc +0 -0
- package/src/trace_engine/apm/__pycache__/model.cpython-311.pyc +0 -0
- package/src/trace_engine/apm/__pycache__/nodes.cpython-311.pyc +0 -0
- package/src/trace_engine/apm/__pycache__/serialization.cpython-311.pyc +0 -0
- package/src/trace_engine/apm/builder.py +208 -0
- package/src/trace_engine/apm/edges.py +25 -0
- package/src/trace_engine/apm/model.py +107 -0
- package/src/trace_engine/apm/nodes.py +27 -0
- package/src/trace_engine/apm/serialization.py +105 -0
- package/src/trace_engine/benchmark/__init__.py +5 -0
- package/src/trace_engine/benchmark/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/benchmark/__pycache__/owasp.cpython-311.pyc +0 -0
- package/src/trace_engine/benchmark/owasp.py +183 -0
- package/src/trace_engine/cli.py +1184 -0
- package/src/trace_engine/config/__init__.py +35 -0
- package/src/trace_engine/config/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/config/__pycache__/defaults.cpython-311.pyc +0 -0
- package/src/trace_engine/config/__pycache__/loader.cpython-311.pyc +0 -0
- package/src/trace_engine/config/__pycache__/settings.cpython-311.pyc +0 -0
- package/src/trace_engine/config/defaults.py +48 -0
- package/src/trace_engine/config/loader.py +64 -0
- package/src/trace_engine/config/settings.py +72 -0
- package/src/trace_engine/doctor.py +250 -0
- package/src/trace_engine/findings/__init__.py +15 -0
- package/src/trace_engine/findings/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/findings/__pycache__/correlate.cpython-311.pyc +0 -0
- package/src/trace_engine/findings/__pycache__/model.cpython-311.pyc +0 -0
- package/src/trace_engine/findings/__pycache__/recommendations.cpython-311.pyc +0 -0
- package/src/trace_engine/findings/__pycache__/store.cpython-311.pyc +0 -0
- package/src/trace_engine/findings/correlate.py +103 -0
- package/src/trace_engine/findings/model.py +40 -0
- package/src/trace_engine/findings/recommendations.py +35 -0
- package/src/trace_engine/findings/store.py +39 -0
- package/src/trace_engine/framework/__init__.py +58 -0
- package/src/trace_engine/framework/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/base.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/csharp.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/dart.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/django.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/express.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/fastapi.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/flask.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/go.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/nextjs.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/php.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/react_router.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/ruby.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/rust.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/__pycache__/springboot.cpython-311.pyc +0 -0
- package/src/trace_engine/framework/base.py +49 -0
- package/src/trace_engine/framework/csharp.py +111 -0
- package/src/trace_engine/framework/dart.py +152 -0
- package/src/trace_engine/framework/django.py +188 -0
- package/src/trace_engine/framework/express.py +82 -0
- package/src/trace_engine/framework/fastapi.py +135 -0
- package/src/trace_engine/framework/flask.py +108 -0
- package/src/trace_engine/framework/go.py +94 -0
- package/src/trace_engine/framework/nextjs.py +200 -0
- package/src/trace_engine/framework/php.py +98 -0
- package/src/trace_engine/framework/react_router.py +331 -0
- package/src/trace_engine/framework/ruby.py +69 -0
- package/src/trace_engine/framework/rust.py +101 -0
- package/src/trace_engine/framework/springboot.py +145 -0
- package/src/trace_engine/harness/__init__.py +19 -0
- package/src/trace_engine/harness/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/harness/__pycache__/benchmark.cpython-311.pyc +0 -0
- package/src/trace_engine/harness/__pycache__/context.cpython-311.pyc +0 -0
- package/src/trace_engine/harness/__pycache__/engine.cpython-311.pyc +0 -0
- package/src/trace_engine/harness/__pycache__/patcher.cpython-311.pyc +0 -0
- package/src/trace_engine/harness/__pycache__/remediators.cpython-311.pyc +0 -0
- package/src/trace_engine/harness/benchmark.py +55 -0
- package/src/trace_engine/harness/context.py +49 -0
- package/src/trace_engine/harness/engine.py +187 -0
- package/src/trace_engine/harness/patcher.py +143 -0
- package/src/trace_engine/harness/remediators.py +307 -0
- package/src/trace_engine/ingest/__init__.py +15 -0
- package/src/trace_engine/ingest/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/ingest/__pycache__/files.cpython-311.pyc +0 -0
- package/src/trace_engine/ingest/__pycache__/hashing.cpython-311.pyc +0 -0
- package/src/trace_engine/ingest/__pycache__/ignore.cpython-311.pyc +0 -0
- package/src/trace_engine/ingest/__pycache__/repository.cpython-311.pyc +0 -0
- package/src/trace_engine/ingest/files.py +60 -0
- package/src/trace_engine/ingest/hashing.py +21 -0
- package/src/trace_engine/ingest/ignore.py +108 -0
- package/src/trace_engine/ingest/repository.py +50 -0
- package/src/trace_engine/intelligence/__init__.py +15 -0
- package/src/trace_engine/intelligence/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/__pycache__/evaluation.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/__pycache__/orchestrator.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/__pycache__/tracebench.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/evaluation.py +828 -0
- package/src/trace_engine/intelligence/laya/__init__.py +19 -0
- package/src/trace_engine/intelligence/laya/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/laya/__pycache__/prompts.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/laya/__pycache__/router.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/laya/__pycache__/schemas.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/laya/__pycache__/telemetry.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/laya/__pycache__/thresholds.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/laya/prompts.py +67 -0
- package/src/trace_engine/intelligence/laya/router.py +352 -0
- package/src/trace_engine/intelligence/laya/schemas.py +56 -0
- package/src/trace_engine/intelligence/laya/telemetry.py +48 -0
- package/src/trace_engine/intelligence/laya/thresholds.py +12 -0
- package/src/trace_engine/intelligence/orchestrator.py +130 -0
- package/src/trace_engine/intelligence/securebert/__init__.py +6 -0
- package/src/trace_engine/intelligence/securebert/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/securebert/__pycache__/cache.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/securebert/__pycache__/classifier.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/securebert/cache.py +37 -0
- package/src/trace_engine/intelligence/securebert/classifier.py +240 -0
- package/src/trace_engine/intelligence/tracebench.py +61 -0
- package/src/trace_engine/intelligence/training/__init__.py +21 -0
- package/src/trace_engine/intelligence/training/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/training/__pycache__/dataset.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/training/__pycache__/dataset_importers.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/training/__pycache__/laya_trainer.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/training/__pycache__/lora_system2.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/training/__pycache__/morefixes_pipeline.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/training/__pycache__/slicer.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/training/__pycache__/train_all.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/training/__pycache__/trainer.cpython-311.pyc +0 -0
- package/src/trace_engine/intelligence/training/dataset.py +320 -0
- package/src/trace_engine/intelligence/training/dataset_importers.py +349 -0
- package/src/trace_engine/intelligence/training/laya_trainer.py +678 -0
- package/src/trace_engine/intelligence/training/lora_system2.py +162 -0
- package/src/trace_engine/intelligence/training/morefixes_pipeline.py +463 -0
- package/src/trace_engine/intelligence/training/slicer.py +129 -0
- package/src/trace_engine/intelligence/training/train_all.py +1009 -0
- package/src/trace_engine/intelligence/training/trainer.py +321 -0
- package/src/trace_engine/interactive.py +623 -0
- package/src/trace_engine/mcp/__init__.py +6 -0
- package/src/trace_engine/mcp/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/mcp/__pycache__/config.cpython-311.pyc +0 -0
- package/src/trace_engine/mcp/__pycache__/server.cpython-311.pyc +0 -0
- package/src/trace_engine/mcp/config.py +42 -0
- package/src/trace_engine/mcp/server.py +398 -0
- package/src/trace_engine/output/__init__.py +28 -0
- package/src/trace_engine/output/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/output/__pycache__/html.cpython-311.pyc +0 -0
- package/src/trace_engine/output/__pycache__/markdown.cpython-311.pyc +0 -0
- package/src/trace_engine/output/__pycache__/sarif.cpython-311.pyc +0 -0
- package/src/trace_engine/output/__pycache__/terminal.cpython-311.pyc +0 -0
- package/src/trace_engine/output/html.py +142 -0
- package/src/trace_engine/output/markdown.py +65 -0
- package/src/trace_engine/output/sarif.py +180 -0
- package/src/trace_engine/output/terminal.py +537 -0
- package/src/trace_engine/parsing/__init__.py +26 -0
- package/src/trace_engine/parsing/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/parsing/__pycache__/calls.cpython-311.pyc +0 -0
- package/src/trace_engine/parsing/__pycache__/language.cpython-311.pyc +0 -0
- package/src/trace_engine/parsing/__pycache__/locations.cpython-311.pyc +0 -0
- package/src/trace_engine/parsing/__pycache__/parser.cpython-311.pyc +0 -0
- package/src/trace_engine/parsing/__pycache__/symbols.cpython-311.pyc +0 -0
- package/src/trace_engine/parsing/calls.py +14 -0
- package/src/trace_engine/parsing/language.py +24 -0
- package/src/trace_engine/parsing/locations.py +17 -0
- package/src/trace_engine/parsing/parser.py +465 -0
- package/src/trace_engine/parsing/symbols.py +45 -0
- package/src/trace_engine/plugin/__init__.py +157 -0
- package/src/trace_engine/plugin/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/plugin/__pycache__/evaluator.cpython-311.pyc +0 -0
- package/src/trace_engine/plugin/__pycache__/swebench_adapter.cpython-311.pyc +0 -0
- package/src/trace_engine/plugin/__pycache__/task.cpython-311.pyc +0 -0
- package/src/trace_engine/plugin/bundle/hooks.json +24 -0
- package/src/trace_engine/plugin/bundle/mcp_config.json +11 -0
- package/src/trace_engine/plugin/bundle/plugin.json +20 -0
- package/src/trace_engine/plugin/bundle/rules/security_remediation.md +40 -0
- package/src/trace_engine/plugin/bundle/skills/trace-security-harness/SKILL.md +118 -0
- package/src/trace_engine/plugin/evaluator.py +105 -0
- package/src/trace_engine/plugin/swebench_adapter.py +96 -0
- package/src/trace_engine/plugin/task.py +48 -0
- package/src/trace_engine/policy/__init__.py +5 -0
- package/src/trace_engine/policy/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/policy/__pycache__/scope.cpython-311.pyc +0 -0
- package/src/trace_engine/policy/scope.py +80 -0
- package/src/trace_engine/runtime/__init__.py +7 -0
- package/src/trace_engine/runtime/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/runtime/__pycache__/client.cpython-311.pyc +0 -0
- package/src/trace_engine/runtime/__pycache__/observations.cpython-311.pyc +0 -0
- package/src/trace_engine/runtime/__pycache__/target.cpython-311.pyc +0 -0
- package/src/trace_engine/runtime/client.py +81 -0
- package/src/trace_engine/runtime/observations.py +18 -0
- package/src/trace_engine/runtime/target.py +23 -0
- package/src/trace_engine/security/__init__.py +16 -0
- package/src/trace_engine/security/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/security/__pycache__/fusion.cpython-311.pyc +0 -0
- package/src/trace_engine/security/__pycache__/hypotheses.cpython-311.pyc +0 -0
- package/src/trace_engine/security/__pycache__/signals.cpython-311.pyc +0 -0
- package/src/trace_engine/security/__pycache__/timing.cpython-311.pyc +0 -0
- package/src/trace_engine/security/fusion.py +126 -0
- package/src/trace_engine/security/hypotheses.py +251 -0
- package/src/trace_engine/security/signals.py +28 -0
- package/src/trace_engine/security/timing.py +132 -0
- package/src/trace_engine/testpacks/__init__.py +18 -0
- package/src/trace_engine/testpacks/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/authentication.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/base.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/bfla.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/bola.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/cors.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/deserialization.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/injection.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/mass_assignment.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/path_traversal.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/registry.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/ssrf.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/__pycache__/ssti.cpython-311.pyc +0 -0
- package/src/trace_engine/testpacks/authentication.py +60 -0
- package/src/trace_engine/testpacks/base.py +63 -0
- package/src/trace_engine/testpacks/bfla.py +70 -0
- package/src/trace_engine/testpacks/bola.py +94 -0
- package/src/trace_engine/testpacks/cors.py +85 -0
- package/src/trace_engine/testpacks/deserialization.py +86 -0
- package/src/trace_engine/testpacks/injection.py +179 -0
- package/src/trace_engine/testpacks/mass_assignment.py +70 -0
- package/src/trace_engine/testpacks/path_traversal.py +117 -0
- package/src/trace_engine/testpacks/registry.py +44 -0
- package/src/trace_engine/testpacks/ssrf.py +85 -0
- package/src/trace_engine/testpacks/ssti.py +96 -0
- package/src/trace_engine/tools/__init__.py +6 -0
- package/src/trace_engine/tools/__pycache__/__init__.cpython-311.pyc +0 -0
- package/src/trace_engine/tools/__pycache__/adapters.cpython-311.pyc +0 -0
- package/src/trace_engine/tools/__pycache__/base.cpython-311.pyc +0 -0
- package/src/trace_engine/tools/__pycache__/registry.cpython-311.pyc +0 -0
- package/src/trace_engine/tools/adapters.py +111 -0
- package/src/trace_engine/tools/base.py +68 -0
- package/src/trace_engine/tools/registry.py +36 -0
- package/src/trace_engine/verify.py +156 -0
package/README.md
ADDED
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# TRACE — Threat Reconnaissance & Attack-path Correlation Engine (v2.1)
|
|
2
|
+
|
|
3
|
+
[](https://github.com/VK-Amogh/TRACE/actions/workflows/trace-gate.yml)
|
|
4
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
5
|
+
[](https://www.python.org/)
|
|
6
|
+
[](https://nodejs.org/)
|
|
7
|
+
[](https://huggingface.co/ehsanaghaei/SecureBERT)
|
|
8
|
+
|
|
9
|
+
> **Threat Reconnaissance & Attack-path Correlation Engine** — A local-first, zero-telemetry neuro-symbolic security intelligence engine, autonomous agent harness, and deterministic verification layer for AI coding agents (Claude Code, Antigravity, Cursor, Codex, OpenHands).
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 🚀 Instant Zero-Install Quickstart (NPX)
|
|
14
|
+
|
|
15
|
+
Run TRACE immediately on any machine with Node.js installed without cloning or manual configuration:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Launch interactive step-by-step security wizard
|
|
19
|
+
npx github:VK-Amogh/TRACE
|
|
20
|
+
|
|
21
|
+
# Run comprehensive vulnerability audit across all source files and AI models
|
|
22
|
+
npx github:VK-Amogh/TRACE audit .
|
|
23
|
+
|
|
24
|
+
# Interactive Architecture & "How It Works" Guide
|
|
25
|
+
npx github:VK-Amogh/TRACE how-it-works
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Or install globally via npm:
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g github:VK-Amogh/TRACE
|
|
31
|
+
trace welcome
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 🤖 AI Coding Agent Integration (Claude Code, Antigravity, Cursor)
|
|
37
|
+
|
|
38
|
+
TRACE was purpose-built to act as the **ground-truth verification oracle** for autonomous AI coding agents.
|
|
39
|
+
|
|
40
|
+
### 1-Click Skill & MCP Installation
|
|
41
|
+
Run this single command inside any repository you want your coding agent to audit and repair:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npx github:VK-Amogh/TRACE install-skill
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This immediately registers:
|
|
48
|
+
- **Claude Code Integration:** Configures `.mcp.json` and installs `.claude/skills/trace-security/`
|
|
49
|
+
- **Antigravity / Agentic IDEs:** Installs `.agents/plugins/trace-security/` with rules and skill runbooks
|
|
50
|
+
- **Cursor IDE Integration:** Generates `.cursor/mcp.json`
|
|
51
|
+
|
|
52
|
+
### Connect Directly to Claude Code CLI
|
|
53
|
+
```bash
|
|
54
|
+
claude mcp add trace -- npx -y github:VK-Amogh/TRACE mcp
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Registered Agent MCP Tools:
|
|
58
|
+
| Tool Name | Description |
|
|
59
|
+
|---|---|
|
|
60
|
+
| `trace_scan` | Full static AST + Attack-Path Model (APM) + live exploit correlation |
|
|
61
|
+
| `trace_findings` | Query correlated findings with AST code evidence and reproduction steps |
|
|
62
|
+
| `trace_explain` | Deep-dive root-cause analysis with zero-dummy-bypass remediation guidance |
|
|
63
|
+
| `trace_verify` | Live deterministic verification oracle proving whether an agent's patch fixed the flaw |
|
|
64
|
+
| `trace_harness_task` | Generate standardized benchmark tasks for the current unmitigated vulnerability |
|
|
65
|
+
| `trace_eval_patch` | Score patches produced by external agents with rollback protection |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## 🧠 Bundled Neural Intelligence Stack (SecureBERT 2.0 & Laya System 1)
|
|
70
|
+
|
|
71
|
+
TRACE does **not** rely solely on static heuristics. It incorporates a fine-tuned dual-engine neural stack bundled directly with the repository via **Git LFS**:
|
|
72
|
+
|
|
73
|
+
1. **SecureBERT 2.0 Semantic Vulnerability Classifier (`ehsanaghaei/SecureBERT` fine-tuned):**
|
|
74
|
+
- 125M parameter transformer specialized in cybersecurity AST token semantics.
|
|
75
|
+
- Accurately classifies vulnerability classes: **BOLA/IDOR, BFLA, SSRF, Injection (SQLi/Command), Broken Authentication, Mass Assignment, Path Traversal, CORS**.
|
|
76
|
+
- Offline cached token representations for instant classification.
|
|
77
|
+
|
|
78
|
+
2. **Laya System 1 Decision Engine (`convaiinnovations/laya` fine-tuned):**
|
|
79
|
+
- Dual-head priority router with ONNX Runtime sub-millisecond execution (<0.5ms per endpoint).
|
|
80
|
+
- Dynamically triages high-risk routes into `P0 (Critical Exploit Path)` down to `P3 (Informational)`.
|
|
81
|
+
|
|
82
|
+
### Zero-Setup Model Verification
|
|
83
|
+
When cloned or installed, TRACE automatically loads the bundled fine-tuned checkpoints from `.trace/models/`:
|
|
84
|
+
```bash
|
|
85
|
+
trace intelligence
|
|
86
|
+
```
|
|
87
|
+
Output:
|
|
88
|
+
```text
|
|
89
|
+
TRACE Intelligence Stack Status
|
|
90
|
+
• Laya System 1 Decision Engine: ONLINE (convaiinnovations/laya loaded on CPU)
|
|
91
|
+
• SecureBERT 2.0 Semantic Classifier: ONLINE (.trace/models/securebert-finetuned)
|
|
92
|
+
• Model Hierarchy: Deterministic -> SecureBERT -> Laya System 1 -> Local LLM
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## 🛡️ Core Architecture & Operational Guarantees
|
|
98
|
+
|
|
99
|
+
TRACE operates on three strict architectural invariants:
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
┌─────────────────────────┐
|
|
103
|
+
│ Multi-Language AST Code │ (Python, TypeScript, JavaScript, Go, Java, Kotlin, PHP)
|
|
104
|
+
└────────────┬────────────┘
|
|
105
|
+
▼
|
|
106
|
+
┌─────────────────────────┐
|
|
107
|
+
│ Attack-Path Model (APM) │ Directed graph: Endpoints ➔ Handlers ➔ Auth Gates ➔ Sinks
|
|
108
|
+
└────────────┬────────────┘
|
|
109
|
+
▼
|
|
110
|
+
┌─────────────────────────┐
|
|
111
|
+
│ Neural Intelligence │ SecureBERT 2.0 + Laya System 1 Dual-Engine Scoring
|
|
112
|
+
└────────────┬────────────┘
|
|
113
|
+
▼
|
|
114
|
+
┌─────────────────────────┐
|
|
115
|
+
│ ScopeGuard Runtime DAST │ RFC-1918 / Localhost Sandboxed Active Probing
|
|
116
|
+
└────────────┬────────────┘
|
|
117
|
+
▼
|
|
118
|
+
┌─────────────────────────┐
|
|
119
|
+
│ Ground-Truth Findings │ 100% Correlated Evidence (Zero False Positives)
|
|
120
|
+
└────────────┬────────────┘
|
|
121
|
+
▼
|
|
122
|
+
┌─────────────────────────┐
|
|
123
|
+
│ Agent Remediation Loop │ Auto-patching + Verification Oracle + SWE-bench Export
|
|
124
|
+
└─────────────────────────┘
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
1. **100% Local-First & Offline:**
|
|
128
|
+
- Operates completely on your local workstation. Zero external cloud telemetry or proprietary API dependencies.
|
|
129
|
+
2. **ScopeGuard Boundary Enforcement:**
|
|
130
|
+
- Dynamic probing is hard-isolated to localhost and authorized development containers. Cloud destinations and third-party APIs are rejected at the socket layer.
|
|
131
|
+
3. **Zero-False-Positive Guarantee:**
|
|
132
|
+
- Flaws are only promoted to `CONFIRMED` when both static AST attack paths and live runtime oracles prove exploitability.
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 💻 CLI Command Reference
|
|
137
|
+
|
|
138
|
+
### Comprehensive Audits & Testing
|
|
139
|
+
```bash
|
|
140
|
+
# Interactive guided terminal audit wizard
|
|
141
|
+
trace
|
|
142
|
+
|
|
143
|
+
# Full repository audit across all languages, test packs, and AI models
|
|
144
|
+
trace audit [PATH]
|
|
145
|
+
|
|
146
|
+
# End-to-end scan with target URL and SARIF report export
|
|
147
|
+
trace scan [PATH] --target http://127.0.0.1:18080 --format sarif -o results.sarif
|
|
148
|
+
|
|
149
|
+
# Explain a specific finding with reproduction curl commands
|
|
150
|
+
trace explain TR-BOLA-001
|
|
151
|
+
|
|
152
|
+
# Replay exact HTTP reproduction steps
|
|
153
|
+
trace replay TR-BOLA-001
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Autonomous Remediation & Benchmarking
|
|
157
|
+
```bash
|
|
158
|
+
# Run self-healing remediation loop (synthesize fix, apply patch, verify oracle)
|
|
159
|
+
trace heal [PATH]
|
|
160
|
+
|
|
161
|
+
# Verify if a developer or coding agent's code change resolved a finding
|
|
162
|
+
trace verify TR-BOLA-001
|
|
163
|
+
|
|
164
|
+
# Benchmark coding agent performance against TRACE-Bench v1.0 scorecard
|
|
165
|
+
trace bench [PATH] --model "Claude-3.7-Sonnet"
|
|
166
|
+
|
|
167
|
+
# Export benchmark instances to SWE-bench JSONL format
|
|
168
|
+
trace plugin export -o swebench_tasks.jsonl
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### System Inspection & Labs
|
|
172
|
+
```bash
|
|
173
|
+
# Environment diagnostic check (Tree-sitter, SQLite, PyTorch, Tool Adapters)
|
|
174
|
+
trace doctor
|
|
175
|
+
|
|
176
|
+
# Start reference vulnerable Vending API lab
|
|
177
|
+
trace lab start --port 18080
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 🛠️ Python Local Installation (Alternative)
|
|
183
|
+
|
|
184
|
+
If developing directly inside Python:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
git clone https://github.com/VK-Amogh/TRACE.git
|
|
188
|
+
cd TRACE
|
|
189
|
+
|
|
190
|
+
# Ensure Git LFS pulls the model checkpoints
|
|
191
|
+
git lfs pull
|
|
192
|
+
|
|
193
|
+
# Create virtual environment
|
|
194
|
+
python -m venv .venv
|
|
195
|
+
source .venv/bin/activate # Or on Windows: .venv\Scripts\activate
|
|
196
|
+
|
|
197
|
+
# Install editable package
|
|
198
|
+
pip install -e .
|
|
199
|
+
|
|
200
|
+
# Run test suite (63 unit tests)
|
|
201
|
+
pytest
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 📄 License
|
|
207
|
+
|
|
208
|
+
Apache License 2.0. See [LICENSE](LICENSE) for details.
|
package/bin/trace.js
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* TRACE — Threat Reconnaissance & Attack-path Correlation Engine
|
|
5
|
+
* Node.js & NPX launcher for TRACE Python engine.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { spawn } from 'child_process';
|
|
9
|
+
import { existsSync, mkdirSync, cpSync, writeFileSync } from 'fs';
|
|
10
|
+
import { resolve, join, dirname } from 'path';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = dirname(__filename);
|
|
15
|
+
const projectRoot = resolve(__dirname, '..');
|
|
16
|
+
const args = process.argv.slice(2);
|
|
17
|
+
|
|
18
|
+
// Handle install-skill directly in Node.js for instant zero-dependency agent skill setup
|
|
19
|
+
if (args[0] === 'install-skill' || args[0] === 'setup-agent' || args[0] === 'install-agent') {
|
|
20
|
+
const targetDir = process.cwd();
|
|
21
|
+
const bundleDir = join(projectRoot, 'src', 'trace_engine', 'plugin', 'bundle');
|
|
22
|
+
|
|
23
|
+
console.log('\n\x1b[32m\x1b[1mInstalling TRACE Autonomous Security Agent Skill & MCP Tools...\x1b[0m');
|
|
24
|
+
|
|
25
|
+
if (existsSync(bundleDir)) {
|
|
26
|
+
// 1. Antigravity plugin (.agents/plugins/trace-security)
|
|
27
|
+
const agentPluginDir = join(targetDir, '.agents', 'plugins', 'trace-security');
|
|
28
|
+
mkdirSync(agentPluginDir, { recursive: true });
|
|
29
|
+
cpSync(bundleDir, agentPluginDir, { recursive: true });
|
|
30
|
+
console.log(` \x1b[32m✓\x1b[0m Antigravity Plugin : ${agentPluginDir}`);
|
|
31
|
+
|
|
32
|
+
// 2. Direct agent skill (.agents/skills/trace-security-harness)
|
|
33
|
+
const skillSrc = join(bundleDir, 'skills', 'trace-security-harness');
|
|
34
|
+
if (existsSync(skillSrc)) {
|
|
35
|
+
const agentSkillDir = join(targetDir, '.agents', 'skills', 'trace-security-harness');
|
|
36
|
+
mkdirSync(agentSkillDir, { recursive: true });
|
|
37
|
+
cpSync(skillSrc, agentSkillDir, { recursive: true });
|
|
38
|
+
console.log(` \x1b[32m✓\x1b[0m Agent Skill : ${agentSkillDir}`);
|
|
39
|
+
|
|
40
|
+
// 3. Claude Code skill (.claude/skills/trace-security)
|
|
41
|
+
const claudeSkillDir = join(targetDir, '.claude', 'skills', 'trace-security');
|
|
42
|
+
mkdirSync(claudeSkillDir, { recursive: true });
|
|
43
|
+
cpSync(skillSrc, claudeSkillDir, { recursive: true });
|
|
44
|
+
console.log(` \x1b[32m✓\x1b[0m Claude Code Skill : ${claudeSkillDir}`);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// 4. MCP Configuration (.mcp.json and .cursor/mcp.json)
|
|
48
|
+
const isWin = process.platform === 'win32';
|
|
49
|
+
const mcpConfig = {
|
|
50
|
+
mcpServers: {
|
|
51
|
+
trace: {
|
|
52
|
+
command: isWin ? 'cmd.exe' : 'npx',
|
|
53
|
+
args: isWin
|
|
54
|
+
? ['/c', 'npx', '-y', 'github:VK-Amogh/TRACE', 'mcp']
|
|
55
|
+
: ['-y', 'github:VK-Amogh/TRACE', 'mcp'],
|
|
56
|
+
env: {
|
|
57
|
+
PYTHONUNBUFFERED: '1',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
const mcpJsonPath = join(targetDir, '.mcp.json');
|
|
63
|
+
writeFileSync(mcpJsonPath, JSON.stringify(mcpConfig, null, 2), 'utf-8');
|
|
64
|
+
console.log(` \x1b[32m✓\x1b[0m Claude Code MCP : ${mcpJsonPath}`);
|
|
65
|
+
|
|
66
|
+
const cursorMcpDir = join(targetDir, '.cursor');
|
|
67
|
+
mkdirSync(cursorMcpDir, { recursive: true });
|
|
68
|
+
writeFileSync(join(cursorMcpDir, 'mcp.json'), JSON.stringify(mcpConfig, null, 2), 'utf-8');
|
|
69
|
+
console.log(` \x1b[32m✓\x1b[0m Cursor IDE MCP : ${join(cursorMcpDir, 'mcp.json')}`);
|
|
70
|
+
|
|
71
|
+
console.log('\n\x1b[1mCapabilities Enabled for AI Coding Agents:\x1b[0m');
|
|
72
|
+
console.log(' • \x1b[32mClaude Code Integration:\x1b[0m Skills + MCP server ready');
|
|
73
|
+
console.log(' • \x1b[32mAntigravity & Agentic IDEs:\x1b[0m .agents/plugins/trace-security active');
|
|
74
|
+
console.log(' • \x1b[32mVerification Tools:\x1b[0m trace_scan, trace_findings, trace_verify, trace_harness_task');
|
|
75
|
+
console.log('\n\x1b[90mTo register in Claude Code CLI directly:\x1b[0m');
|
|
76
|
+
console.log(' \x1b[37mclaude mcp add trace -- npx github:VK-Amogh/TRACE mcp\x1b[0m\n');
|
|
77
|
+
process.exit(0);
|
|
78
|
+
} else {
|
|
79
|
+
console.error(`[TRACE] Bundle directory not found at ${bundleDir}`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Find virtual environment python or system python
|
|
85
|
+
const isWin = process.platform === 'win32';
|
|
86
|
+
const venvPython = isWin
|
|
87
|
+
? join(projectRoot, '.venv', 'Scripts', 'python.exe')
|
|
88
|
+
: join(projectRoot, '.venv', 'bin', 'python');
|
|
89
|
+
|
|
90
|
+
const pythonBin = existsSync(venvPython) ? venvPython : (isWin ? 'python' : 'python3');
|
|
91
|
+
|
|
92
|
+
const cliArgs = ['-m', 'trace_engine.cli', ...args];
|
|
93
|
+
|
|
94
|
+
const proc = spawn(pythonBin, cliArgs, {
|
|
95
|
+
cwd: process.cwd(),
|
|
96
|
+
stdio: 'inherit',
|
|
97
|
+
env: {
|
|
98
|
+
...process.env,
|
|
99
|
+
PYTHONPATH: join(projectRoot, 'src') + (process.env.PYTHONPATH ? (isWin ? ';' : ':') + process.env.PYTHONPATH : ''),
|
|
100
|
+
PYTHONIOENCODING: 'utf-8',
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
proc.on('exit', (code) => {
|
|
105
|
+
process.exit(code || 0);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
proc.on('error', (err) => {
|
|
109
|
+
console.error(`[TRACE] Failed to spawn Python process (${pythonBin}):`, err.message);
|
|
110
|
+
console.error(`Please ensure Python 3.10+ is installed and on your PATH, or run: pip install -e .`);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@vk.amogh/trace",
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "Threat Reconnaissance & Attack-path Correlation Engine — Security Verification Layer for Coding Agents with Fine-Tuned SecureBERT 2.0 & Laya AI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "bin/trace.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"trace": "./bin/trace.js",
|
|
9
|
+
"trace-sec": "./bin/trace.js",
|
|
10
|
+
"trace-security": "./bin/trace.js"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"bin",
|
|
14
|
+
"src",
|
|
15
|
+
"README.md",
|
|
16
|
+
"pyproject.toml"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/VK-Amogh/TRACE.git"
|
|
21
|
+
},
|
|
22
|
+
"bugs": {
|
|
23
|
+
"url": "https://github.com/VK-Amogh/TRACE/issues"
|
|
24
|
+
},
|
|
25
|
+
"homepage": "https://github.com/VK-Amogh/TRACE#readme",
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"security",
|
|
31
|
+
"dast",
|
|
32
|
+
"sast",
|
|
33
|
+
"attack-path",
|
|
34
|
+
"mcp",
|
|
35
|
+
"claude-code",
|
|
36
|
+
"cursor",
|
|
37
|
+
"codex",
|
|
38
|
+
"antigravity",
|
|
39
|
+
"vulnerability",
|
|
40
|
+
"securebert",
|
|
41
|
+
"laya",
|
|
42
|
+
"agent-harness"
|
|
43
|
+
],
|
|
44
|
+
"author": "Amogh (VK-Amogh)",
|
|
45
|
+
"license": "Apache-2.0"
|
|
46
|
+
}
|
package/pyproject.toml
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "trace-sec"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Threat Reconnaissance & Attack-path Correlation Engine"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
authors = [
|
|
12
|
+
{ name = "TRACE Core Team" }
|
|
13
|
+
]
|
|
14
|
+
dependencies = [
|
|
15
|
+
"typer>=0.12.0",
|
|
16
|
+
"rich>=13.7.0",
|
|
17
|
+
"pydantic>=2.7.0",
|
|
18
|
+
"pydantic-settings>=2.2.0",
|
|
19
|
+
"networkx>=3.2.0",
|
|
20
|
+
"httpx>=0.27.0",
|
|
21
|
+
"orjson>=3.9.0",
|
|
22
|
+
"tomli-w>=1.0.0",
|
|
23
|
+
"tree-sitter>=0.21.0",
|
|
24
|
+
"tree-sitter-language-pack>=0.2.0",
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
[project.scripts]
|
|
28
|
+
trace = "trace_engine.cli:app"
|
|
29
|
+
Trace = "trace_engine.cli:app"
|
|
30
|
+
|
|
31
|
+
[tool.hatch.build.targets.wheel]
|
|
32
|
+
packages = ["src/trace_engine"]
|
|
33
|
+
|
|
34
|
+
[tool.pytest.ini_options]
|
|
35
|
+
testpaths = ["tests"]
|
|
36
|
+
python_files = ["test_*.py"]
|
|
37
|
+
filterwarnings = [
|
|
38
|
+
"ignore::RuntimeWarning:laya.*",
|
|
39
|
+
]
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"""TRACE — Threat Reconnaissance & Attack-path Correlation Engine.
|
|
2
|
+
|
|
3
|
+
Local-first application security analysis and runtime validation engine.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
__version__ = "1.0.0"
|
|
7
|
+
__app_name__ = "TRACE"
|
|
8
|
+
__description__ = "Threat Reconnaissance & Attack-path Correlation Engine"
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""Base interfaces for local AI providers."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import Optional, Dict, Any
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AIProvider(ABC):
|
|
8
|
+
"""Abstract interface for local LLM engines."""
|
|
9
|
+
|
|
10
|
+
@property
|
|
11
|
+
@abstractmethod
|
|
12
|
+
def name(self) -> str:
|
|
13
|
+
pass
|
|
14
|
+
|
|
15
|
+
@abstractmethod
|
|
16
|
+
def is_available(self) -> bool:
|
|
17
|
+
"""Check if local inference engine is reachable."""
|
|
18
|
+
pass
|
|
19
|
+
|
|
20
|
+
@abstractmethod
|
|
21
|
+
def generate(self, prompt: str, system_prompt: Optional[str] = None) -> Optional[str]:
|
|
22
|
+
"""Generate a response using the local model."""
|
|
23
|
+
pass
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"""Ollama local AI provider."""
|
|
2
|
+
|
|
3
|
+
import httpx
|
|
4
|
+
from typing import Optional
|
|
5
|
+
from trace_engine.ai.base import AIProvider
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class OllamaProvider(AIProvider):
|
|
9
|
+
"""Integrates with local Ollama runtime for offline model execution."""
|
|
10
|
+
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
endpoint: str = "http://127.0.0.1:11434",
|
|
14
|
+
model: str = "qwen2.5-coder:latest",
|
|
15
|
+
temperature: float = 0.1,
|
|
16
|
+
):
|
|
17
|
+
self.endpoint = endpoint.rstrip("/")
|
|
18
|
+
self.model = model
|
|
19
|
+
self.temperature = temperature
|
|
20
|
+
|
|
21
|
+
@property
|
|
22
|
+
def name(self) -> str:
|
|
23
|
+
return f"Ollama ({self.model})"
|
|
24
|
+
|
|
25
|
+
def is_available(self) -> bool:
|
|
26
|
+
try:
|
|
27
|
+
with httpx.Client(timeout=2.0) as client:
|
|
28
|
+
res = client.get(f"{self.endpoint}/api/tags")
|
|
29
|
+
return res.status_code == 200
|
|
30
|
+
except Exception:
|
|
31
|
+
return False
|
|
32
|
+
|
|
33
|
+
def generate(self, prompt: str, system_prompt: Optional[str] = None) -> Optional[str]:
|
|
34
|
+
try:
|
|
35
|
+
payload = {
|
|
36
|
+
"model": self.model,
|
|
37
|
+
"prompt": prompt,
|
|
38
|
+
"stream": False,
|
|
39
|
+
"options": {"temperature": self.temperature},
|
|
40
|
+
}
|
|
41
|
+
if system_prompt:
|
|
42
|
+
payload["system"] = system_prompt
|
|
43
|
+
|
|
44
|
+
with httpx.Client(timeout=30.0) as client:
|
|
45
|
+
res = client.post(f"{self.endpoint}/api/generate", json=payload)
|
|
46
|
+
if res.status_code == 200:
|
|
47
|
+
return res.json().get("response")
|
|
48
|
+
except Exception:
|
|
49
|
+
pass
|
|
50
|
+
return None
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""AI and deterministic test planner for orchestrating security validation."""
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
from trace_engine.security.hypotheses import SecurityHypothesis
|
|
5
|
+
from trace_engine.ai.base import AIProvider
|
|
6
|
+
from trace_engine.ai.ollama import OllamaProvider
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class TestPlanner:
|
|
10
|
+
"""Orchestrates test selection using deterministic signals and optional local AI reasoning."""
|
|
11
|
+
|
|
12
|
+
def __init__(self, ai_provider: Optional[AIProvider] = None):
|
|
13
|
+
self.ai_provider = ai_provider or OllamaProvider()
|
|
14
|
+
|
|
15
|
+
def prioritize_hypotheses(
|
|
16
|
+
self, hypotheses: List[SecurityHypothesis]
|
|
17
|
+
) -> List[SecurityHypothesis]:
|
|
18
|
+
"""Orders hypotheses by severity prior and attack surface criticality."""
|
|
19
|
+
return sorted(hypotheses, key=lambda h: h.confidence_prior, reverse=True)
|
|
20
|
+
|
|
21
|
+
def explain_finding_with_ai(
|
|
22
|
+
self, title: str, category: str, attack_path: List[str], evidence: List[str]
|
|
23
|
+
) -> str:
|
|
24
|
+
"""Uses local AI if available to explain root cause and exploitability in plain language."""
|
|
25
|
+
if self.ai_provider and self.ai_provider.is_available():
|
|
26
|
+
prompt = (
|
|
27
|
+
f"Explain the security vulnerability '{title}' in category {category}.\n"
|
|
28
|
+
f"Attack path hops: {' -> '.join(attack_path)}\n"
|
|
29
|
+
f"Evidence: {'; '.join(evidence)}\n"
|
|
30
|
+
f"Provide a concise, 2-3 sentence technical explanation of the exploit risk and fix."
|
|
31
|
+
)
|
|
32
|
+
response = self.ai_provider.generate(prompt)
|
|
33
|
+
if response:
|
|
34
|
+
return response.strip()
|
|
35
|
+
|
|
36
|
+
# Fallback explanation
|
|
37
|
+
return (
|
|
38
|
+
f"The attack path violates security invariant {category}. "
|
|
39
|
+
f"Static code flow reaches sensitive sink without boundary enforcement."
|
|
40
|
+
)
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""Attack-Path Model (APM) module."""
|
|
2
|
+
|
|
3
|
+
from trace_engine.apm.nodes import APMNode, NodeType
|
|
4
|
+
from trace_engine.apm.edges import APMEdge, EdgeType
|
|
5
|
+
from trace_engine.apm.model import AttackPathModel
|
|
6
|
+
from trace_engine.apm.builder import APMBuilder
|
|
7
|
+
from trace_engine.apm.serialization import save_apm_sqlite, export_apm_json
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"APMNode",
|
|
11
|
+
"NodeType",
|
|
12
|
+
"APMEdge",
|
|
13
|
+
"EdgeType",
|
|
14
|
+
"AttackPathModel",
|
|
15
|
+
"APMBuilder",
|
|
16
|
+
"save_apm_sqlite",
|
|
17
|
+
"export_apm_json",
|
|
18
|
+
]
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|