A zero-trust engine for
AI-operated security research.
AegisForge lets an LLM drive authorized security tooling through the Model Context Protocol — while every byte returned from the network, a scraped page, or a tool is treated as untrusted data, never as instructions.
Prompt injection as a data-flow problem
Most "AI + security tool" demos hand an agent a shell and hope the system prompt holds. AegisForge structurally prevents the untrusted surface — the target, the scraped content, the tool output — from ever steering the model.
No shell, ever
Every external binary runs via a tokenized argument vector — never sh -c or cmd /c — with an absolute-path requirement and a cleared environment.
SSRF-safe by default
Only bare IP addresses are accepted as targets (no DNS resolution), with loopback, multicast, and RFC-1918/4193 private ranges blocked unless explicitly relaxed.
Sanitize, then envelope
Every tool output is stripped of control characters, checked against an injection-phrase blocklist, and wrapped in a labeled <tool_output_data> tag.
Sandboxed execution
Tool binaries are designed to run inside ephemeral, read-only, capability-dropped Podman/Docker containers rather than directly on the host.
Architecture at a glance
Four layers, one direction of trust: the further right, the less the system trusts what it's holding.
| Layer | Tech | Role |
|---|---|---|
| UI | React 18, Zustand/Immer, Tailwind | Terminal panel, AI reasoning trace viewer, security dashboard |
| Desktop shell | Tauri v2 (Rust) | Native window, IPC bridge, state management, safe binary execution |
| MCP server | Rust (rmcp) | Exposes tools to Claude over stdio/SSE JSON-RPC |
| Defense layer | DataSanitizer | Strips control chars, blocks injection phrases, wraps output in a labeled envelope |
| Sandbox | Podman / Docker | --read-only --cap-drop=ALL ephemeral containers, isolated network |
scan_ports — authorized TCP reconnaissance
The first tool exposed over MCP, and the reference implementation every future tool follows.
- Accepts a bare IPv4/IPv6 address — no hostnames, preventing SSRF via DNS
- Probes up to 100 ports per request to bound resource usage
- Rejects loopback and multicast targets before any network activity
- Returns open/closed status plus a best-effort service hint per port
- Every result is JSON-serialized, then passed through
DataSanitizer::wrap_output()before reaching Claude
Roadmap
web_scrape_tool (fetch_page) — the first consumer of the sanitizer against genuinely adversarial inputToolPlugin implementations beyond recon