
Découvrir les services IA exposés
Plateforme de découverte à l'échelle d'Internet et de tests de sécurité pour l'infrastructure d'agents IA exposée.
AIMap découvre, identifie et teste la sécurité des endpoints IA exposés publiquement — serveurs MCP, instances Ollama, proxys vLLM/LiteLLM, chaînes LangServe, applications Gradio, nœuds ComfyUI, et plus encore. Pensez à Shodan, mais spécialement conçu pour la surface d'attaque des agents IA.
Développé par Bishop Fox.
Avertissement Cet outil est destiné uniquement aux tests d'intrusion autorisés et à la recherche en sécurité. Vous devez utiliser AIMap uniquement contre des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de test. L'accès non autorisé à des systèmes informatiques est illégal. Bishop Fox décline toute responsabilité et n'est pas responsable de tout usage abusif ou dommage causé par cet outil. Utilisez-le de manière responsable.
┌─────────────┐ ┌──────────────┐ ┌───────────┐
│ React SPA │────▶│ FastAPI │────▶│ MongoDB │
│ (Vite) │ WS │ Backend │ │ │
└─────────────┘ └──────┬───────┘ └───────────┘
│
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Shodan │ │ Nuclei │ │ Redis │
│ API │ │ Scanner │ │ Streams │
└──────────┘ └──────────┘ └──────────┘
Backend — Python/FastAPI avec MongoDB asynchrone (Motor), Redis Streams pour la diffusion des journaux d'attaque, et un moteur de découverte qui orchestre le pipeline : requêtes Shodan → vérifications de disponibilité httpx → scans de modèles Nuclei → enrichissement.
Frontend — React 18 + TypeScript + Tailwind CSS + shadcn/ui. Comprend un globe 3D (globe.gl), la diffusion des attaques en temps réel via WebSocket, et une interface de recherche de type Shodan.
Scanning — 5 modèles Nuclei YAML personnalisés pour la détection de serveurs MCP, l'énumération d'outils MCP, la détection d'API compatibles OpenAI, la détection de LangServe et les tests de fuite de prompt.
Chaque endpoint reçoit un score de risque de 0 à 10 calculé à partir de :
# Clone
git clone [email protected]:BishopFox/aimap.git
cd aimap
# Configure
cp .env.example .env
# Edit .env — at minimum set SHODAN_API_KEY
# Launch
docker compose up --build
Cela démarre 4 services :
Ouvrez http://localhost pour accéder à l'interface.
# Backend
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000
# Frontend (separate terminal)
cd frontend
npm install
npm run dev # starts on http://localhost:5173
Assurez-vous que MongoDB s'exécute localement sur le port 27017. Redis est optionnel — le backend bascule sur des tampons en mémoire lorsque Redis est indisponible.
Créez un fichier .env à la racine du projet :
# Required
SHODAN_API_KEY=your_shodan_api_key
# Optional — Censys as an additional discovery source
CENSYS_API_ID=
CENSYS_API_SECRET=
# Optional — enables AI-powered attack analysis
ANTHROPIC_API_KEY=
# MongoDB (defaults work for local dev)
MONGODB_URI=mongodb://localhost:27017
MONGODB_DB=aimap
# Redis (defaults work for local dev; optional)
REDIS_URL=redis://localhost:6379/0
# CORS (default allows all origins)
CORS_ORIGINS=*
# Modal serverless (dispatches scans/attacks to Modal containers)
MODAL_ENABLED=false
# Clerk auth — see below
CLERK_ISSUER=
AIMap utilise Clerk pour l'authentification. Pour l'activer :
# .env (project root)
CLERK_ISSUER=https://your-app.clerk.accounts.dev
# frontend/.env.local
VITE_CLERK_PUBLISHABLE_KEY=pk_test_...
Pour désactiver l'authentification (développement local, démos) : laissez CLERK_ISSUER vide ou non défini. Le backend acceptera toutes les requêtes avec une identité utilisateur local synthétique.
ollama, mcp_protocol, vllm) ou saisissez une requête Shodan personnaliséenet:<cidr>)Utilisez la barre de recherche avec la syntaxe de requête de type Shodan :
protocol:mcp # MCP servers
auth:none # No authentication
risk:critical # Risk score >= 9.0
risk:high # Risk score 7.0 – 8.9
risk:medium # Risk score 4.0 – 6.9
risk:low # Risk score 1.0 – 3.9
tool:query_db # Endpoints exposing a specific tool
country:US # By country code
port:11434 # By port number
org:"Amazon AWS" # By hosting organization (quote multi-word values)
has:system_prompt # Endpoints with leaked system prompts
Combinez librement les filtres :
protocol:mcp auth:none country:US # Unauthenticated MCP servers in the US
risk:critical tool:exec_code # Critical endpoints with code execution tools
protocol:ollama port:11434 # Ollama on default port
Tout texte qui ne correspond pas à un motif key:value est traité comme une recherche en texte libre dans tous les champs indexés.
La page d'accueil présente un globe 3D interactif affichant tous les endpoints découverts :
Modèles personnalisés dans le répertoire templates/ :
Tous les endpoints sont préfixés par /api/.
aimap/
├── backend/
│ ├── app/
│ │ ├── main.py # FastAPI app, lifespan, CORS, routers
│ │ ├── config.py # Pydantic settings from env
│ │ ├── auth.py # Clerk JWT verification (bypass when CLERK_ISSUER empty)
│ │ ├── database.py # Async MongoDB (Motor) connection
│ │ ├── limiter.py # SlowAPI rate limiting
│ │ ├── routes/
│ │ │ ├── endpoints.py # CRUD + search + globe + enrichment
│ │ │ ├── scans.py # Scan lifecycle + execution + WebSocket
│ │ │ └── attack.py # Attack dispatch + Redis Streams + WebSocket
│ │ ├── discovery/
│ │ │ ├── orchestrator.py # Scan pipeline: Shodan → httpx → Nuclei → ingest
│ │ │ ├── shodan_adapter.py # 32 curated Shodan queries + result normalization
│ │ │ ├── nuclei_runner.py # Nuclei subprocess runner + finding parser
│ │ │ └── base.py # SourceAdapter abstract base
│ │ └── services/
│ │ ├── attack_mcp.py # MCP protocol attack engine
│ │ ├── attack_ollama.py # Ollama attack engine
│ │ ├── attack_openclaw.py # OpenClaw/Clawdbot attack engine
│ │ ├── enrichment.py # Shodan/Nuclei enrichment + risk scoring
│ │ ├── live_probe.py # HTTP probing for model/tool enumeration
│ │ ├── search.py # Shodan-style query parser → MongoDB filters
│ │ ├── redis_client.py # Async Redis singleton with fallback
│ │ └── concurrency.py # Semaphore + Redis-based slot limiting
│ ├── Dockerfile
│ └── requirements.txt
├── frontend/
│ ├── src/
│ │ ├── App.tsx # Routes + Clerk auth wrapper
│ │ ├── pages/
│ │ │ ├── Marketing.tsx # Public landing page with 3D globe
│ │ │ ├── Landing.tsx # Authenticated dashboard with globe
│ │ │ ├── Search.tsx # Endpoint search with query syntax
│ │ │ ├── Explore.tsx # Browse/filter all endpoints
│ │ │ ├── AgentDetail.tsx # Single endpoint deep-dive
│ │ │ ├── TestAgent.tsx # Attack test launcher
│ │ │ ├── Scans.tsx # Scan management
│ │ │ └── Ranges.tsx # CIDR range management
│ │ ├── components/
│ │ │ ├── GlobeVisualization.tsx # globe.gl 3D globe + legend
│ │ │ ├── Layout.tsx # App shell (sidebar + navbar)
│ │ │ └── ui/ # shadcn/ui components
│ │ ├── hooks/useApi.ts # SWR hooks for all API endpoints
│ │ └── lib/api-client.ts # Fetch wrapper with Clerk token injection
│ ├── Dockerfile
│ ├── nginx.conf
│ └── tailwind.config.js
├── templates/ # Nuclei YAML templates
├── docs/ # GitHub Pages static site
├── docker-compose.yml
├── .env.example
└── README.md
La plateforme applique des limites de concurrence globales pour prévenir les abus :
Avec Docker Compose, ces limites sont appliquées via des compteurs Redis (inter-conteneurs). En mode développement local, elles basculent sur asyncio.Semaphore (mono-processus).
Pour les charges de scan importantes, les scans et les attaques peuvent être envoyés vers des conteneurs Modal :
MODAL_ENABLED=true
Lorsque cette option est activée, POST /scans/{id}/run et POST /attack appelleront modal.Function.from_name("aimap", "run_scan_task") / run_attack_task au lieu de s'exécuter localement. Un retour à l'exécution locale est effectué si l'envoi vers Modal échoue.
Licence MIT. Voir LICENSE pour plus de détails.
Ce projet est maintenu par Bishop Fox.
| Protocole | Méthode de détection | Requêtes Shodan |
|---|
| MCP (Model Context Protocol) | Transport SSE, JSON-RPC, chemins /mcp/sse | 4 requêtes |
| Ollama | Port par défaut 11434, empreinte produit | 3 requêtes |
| vLLM / LiteLLM / LocalAI | Endpoints /v1/models, /v1/chat/completions | 4 requêtes |
| LangServe / LangChain | Endpoints Playground, marqueurs langserve | 2 requêtes |
| OpenClaw / Clawdbot | Tableau de bord de contrôle, port 18789 | 3 requêtes |
| Open WebUI / LibreChat | Détection basée sur le titre | 2 requêtes |
| Gradio | Titre, filigrane du pied de page, hash du favicon | 3 requêtes |
| Streamlit | Titre, hash du favicon | 2 requêtes |
| ComfyUI / Stable Diffusion | Titre, détection basée sur le port | 4 requêtes |
| HuggingFace TGI | Marqueurs HTML | 1 requête |
| Inférence générique | Chemins /api/generate, /api/tags | 2 requêtes |
| Facteur | Impact sur le score |
|---|
| Aucune authentification | +4.0 |
| Statut d'authentification inconnu | +1.0 |
| 10+ outils exposés | +2.0 |
| 5+ outils exposés | +1.0 |
Outil à risque critique (p. ex. exec_code, run_shell) | +1.0 chacun |
Outil à risque élevé (p. ex. query_db, file_read) | +0.5 chacun |
CORS ouvert (*) | +1.0 |
| Absence de TLS | +0.5 |
| Prompt système divulgué | +0.5 |
| Modèles exposés | +1.0 |
| Modèle non censuré détecté | +2.0 |
| Inscription ouverte (aucune invitation requise) | +1.5 |
| Combinaison dangereuse (p. ex. aucune authentification + outil d'exécution de code) | +1.0 chacun |
| Modèle | Objectif |
|---|
mcp-server-detect.yaml | Détecte les serveurs MCP via le transport SSE et la réponse de capacités JSON-RPC |
mcp-tool-enum.yaml | Énumère les outils exposés par les serveurs MCP (noms, descriptions, schémas d'entrée) |
openai-compat-detect.yaml | Détecte les endpoints compatibles OpenAI via /v1/models |
langserve-detect.yaml | Détecte les déploiements LangServe avec un playground exposé |
prompt-leak.yaml | Tente l'extraction du prompt système via des techniques d'injection courantes |
| Méthode | Chemin | Description |
|---|
GET | /health | Contrôle de santé |
GET | /endpoints | Liste les endpoints (paginés, filtrables) |
POST | /endpoints/search | Recherche avancée avec syntaxe de requête |
GET | /endpoints/globe | Données géographiques pour le globe 3D |
GET | /endpoints/stats | Statistiques agrégées |
GET | /endpoints/{id} | Détail d'un endpoint |
POST | /endpoints/{id}/enrich | Déclenche l'enrichissement d'un endpoint |
POST | /endpoints/enrich-all | Enrichissement par lots |
GET | /scans | Liste les scans |
POST | /scans | Crée un scan |
POST | /scans/{id}/run | Exécute un scan |
GET | /scans/query-presets | Requêtes Shodan prédéfinies disponibles |
WS | /scans/{id}/progress | Progression du scan en direct |
POST | /attack | Lance un test d'attaque |
WS | /attack/{id}/stream | Flux de journaux d'attaque en direct |
GET | /attack/{id}/status | Statut de l'attaque |