Open-source iterative threat modeling powered by LLMs - STRIDE + MAESTRO frameworks with DREAD scoring
Project description
Paranoid
Open-source, self-hosted, iterative threat modeling powered by LLMs.
Paranoid takes system descriptions (text, diagrams, or code via MCP) and produces comprehensive STRIDE + MAESTRO threat models through an LLM-powered pipeline with deterministic fallback. Configure 1–15 automated iteration passes, then review threats in a human-in-the-loop approve/reject cycle.
Features
- Zero Infrastructure: SQLite + sqlite-vec. One command to run:
docker compose up[coming soon] - Multi-Provider LLM: Anthropic, OpenAI, or Ollama (fully local/air-gapped)
- Dual Framework Support: STRIDE (traditional) + MAESTRO (AI/ML) auto-detected or run in parallel
- DREAD Risk Scoring: Automatic risk assessment with 5 dimensions (0-50 scale) for severity classification
- Structured Input Templates: Tagged templates for component descriptions with assumption enforcement in the prompts
- Iterative Refinement: 1–15 configurable iteration passes with gap analysis
- Deterministic Fallback: Rule engine ensures known threats aren't missed[Coming Soon]
- MCP Integration: Pull code context from any MCP server (context-link, etc.)[Coming Soon]
- Export Formats: JSON (simple/full), SARIF (GitHub Security integration)
- CI/CD Ready: CLI + GitHub Action with SARIF upload for automated threat detection
Quick Start
Step 1: Install
Choose the method that works best for you:
PyPI (Recommended):
pip install paranoid-cli
paranoid --version
Docker [Coming Soon]:
docker pull theastiv/paranoid:latest
docker run --rm \
-v $(pwd):/workspace \
-e ANTHROPIC_API_KEY=sk-ant-xxx \
theastiv/paranoid:latest \
paranoid run /workspace/system.md
Standalone Binary (No Python Required):
Download the pre-built binary for your platform from GitHub Releases:
| Platform | Binary |
|---|---|
| Linux x86_64 | paranoid-linux-x64 |
| macOS ARM64 (Apple Silicon) | paranoid-macos-arm64 |
| Windows x64 | paranoid-windows-x64.exe |
# Linux/macOS
chmod +x paranoid-linux-x64
./paranoid-linux-x64 --help
From Source (Development):
git clone https://github.com/theAstiv/paranoid
cd paranoid
pip install -e .
Step 2: Configure
Option A: Interactive Wizard (Recommended)
paranoid config init
# Follow prompts to configure:
# - LLM Provider (Anthropic/OpenAI/Ollama)
# - API Key
# - Model name
# - Default iterations
paranoid config show
Option B: Environment Variables
cp .env.example .env
Edit .env and add your provider configuration:
# Anthropic (Recommended)
ANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxx
DEFAULT_PROVIDER=anthropic
DEFAULT_MODEL=claude-sonnet-4-20250514
# OR OpenAI
OPENAI_API_KEY=sk-xxxxxxxxx
DEFAULT_PROVIDER=openai
DEFAULT_MODEL=gpt-4-turbo
# OR Ollama (fully local, no API key)
OLLAMA_BASE_URL=http://localhost:11434
DEFAULT_PROVIDER=ollama
DEFAULT_MODEL=llama3
Step 3: Run Your First Threat Model
# Run with an example
paranoid run examples/stride-example-api-gateway.md
# With your own system description
paranoid run my-system.md
# See all options
paranoid run --help
Expected Output:
Configuration:
Provider: anthropic
Model: claude-sonnet-4-20250514
Iterations: 3
Framework: STRIDE
[>] summarize: Generating system summary...
[OK] summarize: Summary generated: 196 chars
[>] extract_assets: Identifying assets and entities...
[OK] extract_assets: Identified 14 assets/entities
[>] extract_flows: Extracting data flows and trust boundaries...
[OK] extract_flows: Identified 12 flows, 6 boundaries
[>] generate_threats [iter 1]: Generating threats (iteration 1/3)...
[OK] generate_threats [iter 1]: Generated 10 threats
...
[OK] complete: Pipeline complete: 2 iterations, 17 threats
================================================================================
THREAT MODEL COMPLETE
================================================================================
Total Threats: 17
Iterations: 2
Duration: 115.0 seconds
Output: stride-example-api-gateway_threats.json
Expected Runtime:
- Claude Sonnet: ~30-60 seconds (3 iterations)
- GPT-4: ~45-90 seconds (3 iterations)
- Ollama (local): 2-5 minutes (depends on hardware)
CLI Reference
Running Threat Models
# Basic usage (auto-detects framework from input)
paranoid run system.md
# Structured templates (auto-detects STRIDE vs MAESTRO)
paranoid run examples/stride-example-api-gateway.md
paranoid run examples/maestro-example-rag-chatbot.md
# JSON output (simple format - lightweight, ~2-3 KB)
paranoid run system.md --output threats.json
# JSON output (full format - complete models + DREAD + events, ~45 KB)
paranoid run system.md --format full -o complete.json
# SARIF export for GitHub Security integration
paranoid run system.md --format sarif -o threats.sarif
# Force dual framework (STRIDE + MAESTRO in parallel)
paranoid run system.md --maestro
# Override iteration count (1-15)
paranoid run system.md --iterations 7
# Override framework auto-detection
paranoid run system.md --framework MAESTRO
# Quiet mode (suppress real-time output, show only summary)
paranoid run system.md --quiet
# Verbose mode (show detailed event data with complete models)
paranoid run system.md --verbose
Configuration Management
# Interactive setup wizard
paranoid config init
# Reconfigure (overwrite existing config)
paranoid config init --force
# Display current configuration
paranoid config show
# Config file location: ~/.paranoid/config.json
Version Info
# Show version, Python version, dependencies, and current configuration
paranoid version
Output Formats
JSON Simple (default, ~2-3 KB)
Lightweight threat summaries for CI/CD dashboards and quick reviews.
{
"execution": {
"total_threats": 17,
"iterations_completed": 2,
"duration_seconds": 115.0
},
"threats": [
{
"name": "JWT Token Forgery",
"category": "Spoofing",
"target": "API Gateway",
"impact": "Complete authentication bypass",
"likelihood": "Medium",
"mitigation_count": 3
}
]
}
JSON Full (~45 KB)
Complete Pydantic models with DREAD scores and full pipeline event audit trail. Suitable for detailed analysis, archival, and integration with other tools.
paranoid run system.md --format full -o complete.json
SARIF (GitHub Security Integration)
SARIF 2.1.0 format for GitHub Security tab, GitLab, VS Code, and Azure DevOps:
paranoid run system.md --format sarif -o threats.sarif
GitHub Actions Integration:
name: Threat Model
on: [push, pull_request]
jobs:
threat-model:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run threat modeling
run: |
pip install paranoid-cli
paranoid run system.md --format sarif -o threats.sarif
env:
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
- name: Upload to GitHub Security
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: threats.sarif
Structured Input Templates
Paranoid supports rich XML-tagged templates for better context and assumption enforcement. See Input-template.md for the full template reference and examples/ for working examples.
STRIDE Template (traditional systems): Component description with technology stack, interfaces, data handling, and 6 structured assumption sections.
MAESTRO Template (AI/ML systems): Extended component description with mission alignment, agent profile, and 9 structured assumption sections.
Model Configuration
Use Claude Sonnet (or newer) for reliable structured output generation.
| Model | Status | Notes |
|---|---|---|
claude-sonnet-4-20250514 |
Recommended | Validated end-to-end, reliable for production |
claude-haiku-4-5-20251001 |
Not recommended | Fails with JSON parsing errors on complex outputs |
| GPT-4 Turbo | Supported | Works well, slightly slower |
| Ollama (Llama 3 70B+) | Supported | Fully local, no external API calls |
Architecture
- Backend: FastAPI + SQLite + sqlite-vec
- Frontend: Planned (v1.0 is CLI-only)
- LLM Providers: Anthropic / OpenAI / Ollama (protocol-based, swappable)
- Pipeline: Plain async functions (no LangChain, no LangGraph)
- Embeddings: Local via fastembed (ONNX, BAAI/bge-small-en-v1.5)
- Models: Pydantic v2 for all data validation
- Frameworks: STRIDE (traditional) + MAESTRO (AI/ML security)
Python API:
from backend.pipeline.runner import run_pipeline_for_model
from backend.providers.anthropic import AnthropicProvider
from backend.models.enums import Framework
provider = AnthropicProvider(api_key="your-key")
async for event in run_pipeline_for_model(
model_id="web-app-001",
description="E-commerce web application...",
framework=Framework.STRIDE,
provider=provider,
max_iterations=3,
):
print(f"[{event.step}] {event.message}")
Testing
# Run unit/integration tests (no API key required)
pytest tests/ -v
# Run pipeline integration test (requires API key)
python test_pipeline.py
# Validate structured input parser (no API key required)
python examples/test_structured_input.py
# Lint
ruff check backend/ cli/
ruff format backend/ cli/
Validated Results (2026-03-24):
- Parser validation: PASSING (no API key required)
- STRIDE pipeline: PASSING (15-25 threats)
- STRIDE+MAESTRO dual framework: PASSING (24 threats, 213s, 2 iterations)
- Assumption enforcement: VALIDATED
- Gap-driven iteration stopping: VALIDATED
Troubleshooting
Authentication errors:
- Check your API key is correct in
.envor~/.paranoid/config.json - For Anthropic, ensure billing is set up and key starts with
sk-ant-api03-
Module not found:
pip install -e . # or: pip install paranoid-cli
Ollama connection refused:
ollama serve # start Ollama first, then run paranoid
macOS binary "developer cannot be verified":
xattr -d com.apple.quarantine paranoid-macos-arm64
Windows "Windows protected your PC": Click "More info" then "Run anyway", or add an exception in Windows Defender.
Platform Support
| Platform | PyPI | Docker | Binary |
|---|---|---|---|
| Ubuntu 20.04+ | Yes | Yes | Yes |
| Debian 11+ | Yes | Yes | Yes |
| RHEL 8+ | Yes | Yes | Yes |
| macOS 11+ (Intel) | Yes | Yes | No |
| macOS 11+ (ARM64) | Yes | Yes | Yes |
| Windows 10+ | Yes | Yes | Yes |
| WSL2 | Yes | Yes | Yes |
Documentation
- CHANGELOG.md — Release history
- Input-template.md — Structured input template reference
- examples/ — Working STRIDE and MAESTRO examples
- RELEASE.md — Maintainer release checklist
Developer docs:
- .claude/rules/CLAUDE.md — Project structure and conventions
- .claude/rules/RULES.md — Coding standards
- .claude/rules/tech-decision-rationale.md — Architecture decisions
Development Status
v1.0.1 — CLI production-ready, available on PyPI and as standalone binaries.
Completed: Core pipeline (8 nodes, iteration logic, SSE, dual framework), LLM providers (Anthropic/OpenAI/Ollama), STRIDE + MAESTRO prompts, structured input templates, JSON + SARIF export, DREAD scoring, CLI with config wizard, packaging and release automation.
Future (v2.0+): RAG retrieval integration, deterministic rule engine, MCP client, REST API routes, frontend (Svelte UI).
License
Apache 2.0
Project details
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 paranoid_cli-1.1.0.tar.gz.
File metadata
- Download URL: paranoid_cli-1.1.0.tar.gz
- Upload date:
- Size: 94.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4cf2b7db9ade152fd2a786ca52ed0a00ea23113b9816081cb382cce183428b60
|
|
| MD5 |
e0d0c167f882cfbe89c3fafbe91e1315
|
|
| BLAKE2b-256 |
23734ce09b3726c66b11a899cda63dbdce02e277109c89e84fed57703f6fd900
|
Provenance
The following attestation bundles were made for paranoid_cli-1.1.0.tar.gz:
Publisher:
release.yml on theAstiv/paranoid
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paranoid_cli-1.1.0.tar.gz -
Subject digest:
4cf2b7db9ade152fd2a786ca52ed0a00ea23113b9816081cb382cce183428b60 - Sigstore transparency entry: 1192039287
- Sigstore integration time:
-
Permalink:
theAstiv/paranoid@5695cc4b37fc275b733d1e507f52c19ec6847306 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/theAstiv
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5695cc4b37fc275b733d1e507f52c19ec6847306 -
Trigger Event:
push
-
Statement type:
File details
Details for the file paranoid_cli-1.1.0-py3-none-any.whl.
File metadata
- Download URL: paranoid_cli-1.1.0-py3-none-any.whl
- Upload date:
- Size: 93.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
565503e1ccd067084e83f9771d76eab6b01ad057debf81661112125dda5d774e
|
|
| MD5 |
88e30661dbf4d20063e90d7b37f28e5b
|
|
| BLAKE2b-256 |
837f798e8d4d257e283fb94c4ee8135f10f2fd18ba021094b6212cdbc6d18571
|
Provenance
The following attestation bundles were made for paranoid_cli-1.1.0-py3-none-any.whl:
Publisher:
release.yml on theAstiv/paranoid
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
paranoid_cli-1.1.0-py3-none-any.whl -
Subject digest:
565503e1ccd067084e83f9771d76eab6b01ad057debf81661112125dda5d774e - Sigstore transparency entry: 1192039288
- Sigstore integration time:
-
Permalink:
theAstiv/paranoid@5695cc4b37fc275b733d1e507f52c19ec6847306 -
Branch / Tag:
refs/tags/v1.1.0 - Owner: https://github.com/theAstiv
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@5695cc4b37fc275b733d1e507f52c19ec6847306 -
Trigger Event:
push
-
Statement type: