AI Agent Security System - 7-layer defense against prompt injection, data exfiltration, and AI-specific attacks
Project description
ZugaShield
7-layer security system for AI agents
Stop prompt injection, data exfiltration, and AI-specific attacks — in under 15ms.
65% of organizations deploying AI agents have no security defense layer. ZugaShield is a production-tested, open-source library that protects your AI agents with:
- Zero dependencies — works out of the box, no C extensions
- < 15ms overhead — compiled regex fast path, async throughout
- 150+ signatures — curated threat catalog, updated regularly
- MCP-aware — scans tool definitions for hidden injection payloads
- 7 defense layers — defense in depth, not a single point of failure
Quick Start
pip install zugashield
import asyncio
from zugashield import ZugaShield
async def main():
shield = ZugaShield()
# Check user input for prompt injection
decision = await shield.check_prompt("Ignore all previous instructions")
print(decision.is_blocked) # True
print(decision.verdict) # ShieldVerdict.BLOCK
# Check LLM output for data leakage
decision = await shield.check_output("Your API key: sk-live-abc123...")
print(decision.is_blocked) # True
# Check a tool call before execution
decision = await shield.check_tool_call(
"web_request", {"url": "http://169.254.169.254/metadata"}
)
print(decision.is_blocked) # True (SSRF blocked)
asyncio.run(main())
Architecture
ZugaShield uses layered defense — every input and output passes through multiple independent detection engines. If one layer misses an attack, the next one catches it.
┌─────────────────────────────────────────────────────────────┐
│ ZugaShield │
├─────────────────────────────────────────────────────────────┤
│ Layer 1: Perimeter HTTP validation, size limits │
│ Layer 2: Prompt Armor 10 injection detection methods │
│ Layer 3: Tool Guard SSRF, command injection, paths │
│ Layer 4: Memory Sentinel Memory poisoning, RAG scanning │
│ Layer 5: Exfiltration Guard DLP, secrets, PII, canaries │
│ Layer 6: Anomaly Detector Behavioral baselines, chains │
│ Layer 7: Wallet Fortress Transaction limits, mixers │
├─────────────────────────────────────────────────────────────┤
│ Cross-layer: MCP tool scanning, LLM judge, multimodal │
└─────────────────────────────────────────────────────────────┘
What It Detects
| Attack | How | Layer |
|---|---|---|
| Direct prompt injection | Compiled regex + 150+ catalog signatures | 2 |
| Indirect injection | Spotlighting + content analysis | 2 |
| Unicode smuggling | Homoglyph + invisible character detection | 2 |
| Encoding evasion | Nested base64 / hex / ROT13 decoding | 2 |
| Context window flooding | Repetition + token count analysis | 2 |
| Few-shot poisoning | Role label density analysis | 2 |
| GlitchMiner tokens | Shannon entropy per word | 2 |
| Document embedding | CSS hiding patterns (font-size:0, display:none) | 2 |
| ASCII art bypass | Entropy analysis + special char density | 2 |
| Multi-turn crescendo | Session escalation tracking | 2 |
| SSRF / command injection | URL + command pattern matching | 3 |
| Path traversal | Sensitive path + symlink detection | 3 |
| Memory poisoning | Write + read path validation | 4 |
| RAG document injection | Pre-ingestion imperative detection | 4 |
| Secret / PII leakage | 70+ secret patterns + PII regex | 5 |
| Canary token leaks | Session-specific honeypot tokens | 5 |
| DNS exfiltration | Subdomain depth / entropy analysis | 5 |
| Image-based injection | EXIF + alt-text + OCR scanning | Multi |
| MCP tool poisoning | Tool definition injection scan | Cross |
| Behavioral anomaly | Cross-layer event correlation | 6 |
| Crypto wallet attacks | Address + amount + function validation | 7 |
MCP Server
ZugaShield ships with an MCP server so Claude, GPT, and other AI platforms can call it as a tool:
pip install zugashield[mcp]
Add to your MCP config (claude_desktop_config.json or similar):
{
"mcpServers": {
"zugashield": {
"command": "zugashield-mcp"
}
}
}
9 tools available:
| Tool | Description |
|---|---|
scan_input |
Check user messages for prompt injection |
scan_output |
Check LLM responses for data leakage |
scan_tool_call |
Validate tool parameters before execution |
scan_tool_definitions |
Scan tool schemas for hidden payloads |
scan_memory |
Check memory writes for poisoning |
scan_document |
Pre-ingestion RAG document scanning |
get_threat_report |
Get current threat statistics |
get_config |
View active configuration |
update_config |
Toggle layers and settings at runtime |
FastAPI Integration
pip install zugashield[fastapi]
from fastapi import FastAPI
from zugashield import ZugaShield
from zugashield.integrations.fastapi import create_shield_router
shield = ZugaShield()
app = FastAPI()
app.include_router(create_shield_router(lambda: shield), prefix="/api/shield")
This gives you a live dashboard with these endpoints:
| Endpoint | Description |
|---|---|
GET /api/shield/status |
Shield health + layer statistics |
GET /api/shield/audit |
Recent security events |
GET /api/shield/config |
Active configuration |
GET /api/shield/catalog/stats |
Threat signature statistics |
Human-in-the-Loop
Plug in your own approval flow (Slack, email, custom UI) for high-risk decisions:
from zugashield.integrations.approval import ApprovalProvider
from zugashield import set_approval_provider
class SlackApproval(ApprovalProvider):
async def request_approval(self, decision, context=None):
# Post to Slack channel, wait for thumbs-up
return True # or False to deny
async def notify(self, decision, context=None):
# Send alert for blocked actions
pass
set_approval_provider(SlackApproval())
Configuration
All settings via environment variables — no config files needed:
| Variable | Default | Description |
|---|---|---|
ZUGASHIELD_ENABLED |
true |
Master on/off toggle |
ZUGASHIELD_STRICT_MODE |
false |
Block on medium-confidence threats |
ZUGASHIELD_PROMPT_ARMOR_ENABLED |
true |
Prompt injection defense |
ZUGASHIELD_TOOL_GUARD_ENABLED |
true |
Tool call validation |
ZUGASHIELD_MEMORY_SENTINEL_ENABLED |
true |
Memory write/read scanning |
ZUGASHIELD_EXFILTRATION_GUARD_ENABLED |
true |
Output DLP |
ZUGASHIELD_WALLET_FORTRESS_ENABLED |
true |
Crypto transaction checks |
ZUGASHIELD_LLM_JUDGE_ENABLED |
false |
LLM deep analysis (requires anthropic) |
ZUGASHIELD_SENSITIVE_PATHS |
.ssh,.env,... |
Comma-separated sensitive paths |
Optional Extras
pip install zugashield[fastapi] # Dashboard + API endpoints
pip install zugashield[multimodal] # Image scanning (Pillow)
pip install zugashield[llm-judge] # LLM deep analysis (Anthropic)
pip install zugashield[mcp] # MCP server
pip install zugashield[all] # Everything above
pip install zugashield[dev] # Development (pytest, ruff)
Contributing
See CONTRIBUTING.md for development setup and guidelines.
Security
Found a vulnerability? See SECURITY.md for responsible disclosure.
License
MIT — see LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file zugashield-1.0.1.tar.gz.
File metadata
- Download URL: zugashield-1.0.1.tar.gz
- Upload date:
- Size: 85.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73cf71740839b5e2953aa9db3c2e7e5ce82ee3edba08896007ce00eb61d0137d
|
|
| MD5 |
d2adc1e5938828fa4a01144562507876
|
|
| BLAKE2b-256 |
660dd5f47f05661c42c6cd4350f0ce265c283fdb6550f0488acb83f6e0f077bb
|
File details
Details for the file zugashield-1.0.1-py3-none-any.whl.
File metadata
- Download URL: zugashield-1.0.1-py3-none-any.whl
- Upload date:
- Size: 92.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
47edce8f7ffe431f495d4213851edb0c873c9b9a397546f116d235632f07efbf
|
|
| MD5 |
c5721e6b07e360b1d3ae7d9a15f4c7db
|
|
| BLAKE2b-256 |
b3c34f2c8131b893428003a64bd209e7895f6ccd46ec11190929066bb37a439c
|