overmind-mcp
Version:
Orchestrateur universel agents IA multi-modeles via MCP. Inclut le protocole 'Custom-Nickname' pour identifier vos agents avec des surnoms originaux (The Chaos Prophet, Shadow Sniper, etc.), l'isolation mΓ©moire (Private Memory Context) et le support pour
352 lines (288 loc) β’ 14.9 kB
Markdown
# π‘οΈ PLAN SΓCURITΓ OVERMIND β GuΓ©rison ComplΓ¨te
> **Date** : 28 Mai 2026
> **Auteur** : Sniper Analyste Financier (via audit Discord)
> **Relecteur** : sley_73350 (validation en cours)
> **Version** : 1.0 β Brouillon pour validation
## π ΓTAT DES LIEUX β Diagnostic Critique
### Surface d'attaque actuelle
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TRANSPORT β PROTOCOLE β POINT D'ENTRΓE β AUTH? β PORT β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ£
β STDIO β JSON-RPC 2.0 β stdin β stdout β β β N/A β
β HTTP Stream β JSON-RPC 2.0 β POST /mcp β β β 3099 β
β HTTP Stream β SSE β POST /mcp (stream) β β β 3099 β
β HTTP Stream β REST β GET /health β β β 3099 β
β HTTPS (SSL) β JSON-RPC 2.0 β POST /mcp β β β 3099 β
β HTTPS (SSL) β SSE β POST /mcp (stream) β β β 3099 β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π CONSTAT : TOUS les endpoints sont OUVERTS β 0 authentification cΓ΄tΓ© serveur
```
### 14 Outils MCP exposΓ©s sans protection
```
# β TOOL β RISQUE
ββββΌββββββββββββββββββββββββββΌββββββββββ
01 β run_agent β π΄ CRITIQUE
02 β run_agents_parallel β π΄ CRITIQUE
03 β create_agent β π ΓLEVΓ
04 β delete_agent β π ΓLEVΓ
05 β update_agent_config β π΄ CRITIQUE
06 β list_agents β π‘ MOYEN
07 β get_agent_configs β π΄ CRITIQUE (fuites clΓ©s API)
08 β create_prompt β π‘ MOYEN
09 β edit_prompt β π‘ MOYEN
10 β memory_search β π‘ MOYEN
11 β memory_store β π‘ MOYEN
12 β memory_runs β π’ FAIBLE
13 β config_example β π’ FAIBLE
14 β agent_control β π΄ CRITIQUE (kill process)
```
### Modules bibliothΓ¨que β Couverture Bearer
```
MODULE β TYPE β ENVOIE BEARER β REΓOIT/VERIFY β STATUS
βββββββββββββββββββββββββΌββββββββββΌββββββββββββββββΌββββββββββββββββΌβββββββ
overmind-client.ts β Client β β
OUI β N/A β β
OK
cli.ts (serveur) β Serveur β N/A β β NON β π΄ GAP
server.ts (FastMCP) β Serveur β N/A β β NON β π΄ GAP
run_agent.ts β Tool β N/A β β NON β π΄ GAP
run_agents_parallel.ts β Tool β N/A β β NON β π΄ GAP
create_agent.ts β Tool β N/A β β NON β π΄ GAP
manage_agents.ts β Tool β N/A β β NON β π΄ GAP
memory_store.ts β Tool β N/A β β NON β π΄ GAP
memory_search.ts β Tool β N/A β β NON β π΄ GAP
agent_control.ts β Tool β N/A β β NON β π΄ GAP
config.ts β Config β N/A β β NON β π‘
processRegistry.ts β Runtime β N/A β β NON β π΄ GAP
```
## ποΈ ARCHITECTURE CIBLE β AprΓ¨s GuΓ©rison
```
π MIDDLEWARE AUTH ACTIF π
ββββββββββββ Bearer ββββββββββββββββ ββββββββββββββ
β Client β βββββββββββΆ β FastMCP βββββΆβ 14 Tools β
β (TS/JS) β Header β β v4.0.1 β β MCP β
β β β β
CHECK β β β (protΓ©gΓ©s)β
ββββββββββββ ββββββββ¬ββββββββ ββββββββββββββ
β
ββββββββββββββ΄βββββββββββββ
β Transports sΓ©curisΓ©s β
βββββββββββββββββββββββββββ€
β stdio (pipe local) β
β httpStream (port 3099) β
β endpoint: /mcp β
β β
Bearer: REQUIRED β
β stateless: true β
β SSL: ACTIF β
βββββββββββββββββββββββββββ
```
## π PLAN D'IMPLΓMENTATION β 5 Phases
### PHASE 1 β Middleware Serveur Bearer (PRIORITΓ MAX)
**Objectif** : Bloquer tout accès non authentifié sur HTTP/RPC
**Fichier cible** : `src/cli.ts` + `src/server.ts`
**TΓ’ches** :
- [ ] CrΓ©er `src/lib/bearerMiddleware.ts`
- Fonction `verifyBearer(request): boolean`
- Lecture `OVERMIND_AUTH` depuis `.env`
- Comparaison via `crypto.timingSafeEqual()` (anti timing attack)
- Retourner 401 + message JSON si token absent/invalide
- [ ] Injecter le middleware dans FastMCP httpStream
- Hook AVANT `server.start()`
- Exempter UNIQUEMENT `GET /health` (monitoring)
- Bloquer tout le reste si token absent
- [ ] Logger chaque accès (audit trail)
- IP source, timestamp, tool appelΓ©, rΓ©sultat auth
**Code de rΓ©fΓ©rence** :
```typescript
// src/lib/bearerMiddleware.ts
import crypto from 'crypto';
export function verifyBearer(authHeader: string | undefined): boolean {
const expected = process.env.OVERMIND_AUTH;
if (!expected) {
console.warn('[AUTH] β οΈ OVERMIND_AUTH non dΓ©fini β accΓ¨s refusΓ© par dΓ©faut');
return false;
}
if (!authHeader?.startsWith('Bearer ')) return false;
const token = authHeader.slice(7);
const expectedBuf = Buffer.from(expected);
const tokenBuf = Buffer.from(token);
if (tokenBuf.length !== expectedBuf.length) return false;
return crypto.timingSafeEqual(tokenBuf, expectedBuf);
}
```
**Validation** :
- [ ] Tester sans token β 401
- [ ] Tester avec mauvais token β 401
- [ ] Tester avec bon token β 200
- [ ] GET /health sans token β 200 (exemptΓ©)
---
### PHASE 2 β IntΓ©gration dans tous les modules de la bibliothΓ¨que
**Objectif** : Chaque module serveur vΓ©rifie le Bearer
**Fichiers cibles** :
- `src/cli.ts` (serveur principal)
- `src/server.ts` (FastMCP)
- Chaque tool MCP (run_agent, memory_store, etc.)
**TΓ’ches** :
- [ ] Importer `verifyBearer` dans chaque point d'entrΓ©e serveur
- [ ] Ajouter un wrapper `withAuth(toolHandler)` qui :
1. Extrait le header Authorization du contexte MCP
2. VΓ©rifie via `verifyBearer()`
3. Si Γ©chec β retourne erreur MCP avec code d'auth
4. Si succΓ¨s β exΓ©cute le tool normalement
- [ ] Valider que les 14 tools sont couverts
**Code de rΓ©fΓ©rence** :
```typescript
// src/lib/withAuth.ts
import { verifyBearer } from './bearerMiddleware';
export function withAuth(handler: Function) {
return async (args: any, context: any) => {
const authHeader = context?.request?.headers?.authorization;
if (!verifyBearer(authHeader)) {
throw new Error('[AUTH] β AccΓ¨s refusΓ© β Bearer token invalide');
}
return handler(args, context);
};
}
```
### PHASE 3 β Propagation aux configs agents (.mcp.json)
**Objectif** : Chaque agent injecte le Bearer dans ses appels
**TΓ’ches** :
- [ ] VΓ©rifier que `overmind-client.ts` envoie bien le Bearer β
(dΓ©jΓ fait)
- [ ] Mettre Γ jour les templates `.mcp.json` des agents
- Ajouter `Authorization: Bearer ${OVERMIND_AUTH}` dans les headers
- [ ] Scripts externes β utiliser `OVERMIND_AUTH` depuis `.env`
- [ ] Documenter la variable dans le README Overmind
**Exemple .mcp.json** :
```json
{
"mcpServers": {
"overmind": {
"url": "http://localhost:3099/mcp",
"headers": {
"Authorization": "Bearer ${OVERMIND_AUTH}"
}
}
}
}
```
### PHASE 4 β SSL/TLS + Durcissement RΓ©seau
**Objectif** : Chiffrer les communications + rΓ©duire la surface
**TΓ’ches** :
- [ ] Activer SSL sur le port 3099 (HTTPS)
- GΓ©nΓ©rer certificat auto-signΓ© ou Let's Encrypt
- Configurer dans FastMCP httpStream
- [ ] Restreindre le bind Γ `localhost` uniquement (sauf besoin externe)
- [ ] Ajouter rate-limiting sur les endpoints
- Max 100 req/min par IP
- Ban temporaire après 5 échecs d'auth consécutifs
- [ ] CORS restrictif (si besoin)
- [ ] Firewall : bloquer le port 3099 Γ l'extΓ©rieur sauf reverse proxy
### PHASE 5 β Audit Trail & Monitoring
**Objectif** : Traçabilité complète des accès
**TΓ’ches** :
- [ ] Logger chaque requΓͺte MCP :
- Timestamp ISO 8601
- IP source
- Tool appelΓ©
- RΓ©sultat auth (success/fail)
- Agent demandeur
- [ ] Stocker les logs dans PostgreSQL (table `audit_log`)
```sql
CREATE TABLE audit_log (
id SERIAL PRIMARY KEY,
timestamp TIMESTAMPTZ DEFAULT NOW(),
ip VARCHAR(45),
tool VARCHAR(100),
agent VARCHAR(100),
auth_result BOOLEAN,
details JSONB
);
```
- [ ] Alertes Discord automatiques :
- 3 Γ©checs d'auth consΓ©cutifs β alerte embed
- Tool critique appelΓ© β notification
- [ ] Dashboard simple (endpoint `/audit/stats`)
## π§ͺ PLAN DE TEST β Validation par Phase
### Tests Phase 1 (Middleware)
```
TEST β DESCRIPTION β RΓSULTAT ATTENDU
ββββββΌβββββββββββββββββββββββββββββββββΌββββββββββββββββββ
T1.1 β curl POST /mcp sans header β 401 Unauthorized
T1.2 β curl POST /mcp mauvais token β 401 Unauthorized
T1.3 β curl POST /mcp bon token β 200 OK
T1.4 β curl GET /health sans token β 200 OK (exemptΓ©)
T1.5 β curl GET /health mauvais token β 200 OK (exemptΓ©)
T1.6 β Token vide β 401 Unauthorized
T1.7 β OVERMIND_AUTH non dΓ©fini β 500 / 403
```
### Tests Phase 2 (Couverture modules)
```
TEST β DESCRIPTION β RΓSULTAT ATTENDU
ββββββΌββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββ
T2.1 β Appeler run_agent sans Bearer β Erreur MCP auth
T2.2 β Appeler run_agent avec Bearer β ExΓ©cution normale
T2.3 β Appeler memory_search sans Bearer β Erreur MCP auth
T2.4 β Appeler agent_control sans Bearer β Erreur MCP auth
T2.5 β VΓ©rifier les 14 tools couverts β 14/14 β
```
### Tests Phase 3 (Propagation)
```
TEST β DESCRIPTION β RΓSULTAT ATTENDU
ββββββΌβββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββ
T3.1 β Agent Claude appelle overmind sans Bearer β Connexion refusΓ©e
T3.2 β Agent Kilo appelle overmind avec Bearer β Connexion OK
T3.3 β Script externe sans OVERMIND_AUTH β Γchec auth
T3.4 β Script externe avec OVERMIND_AUTH β SuccΓ¨s
```
### Tests Phase 4 (SSL + Durcissement)
```
TEST β DESCRIPTION β RΓSULTAT ATTENDU
ββββββΌβββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββ
T4.1 β AccΓ¨s HTTP (non SSL) β Connexion refusΓ©e
T4.2 β AccΓ¨s HTTPS avec cert valide β 200 OK
T4.3 β Rate limit : 100+ req/min β 429 Too Many
T4.4 β 5 Γ©checs auth consΓ©cutifs β Ban temporaire
T4.5 β Bind localhost uniquement β Pas d'accΓ¨s externe
```
### Tests Phase 5 (Audit)
```
TEST β DESCRIPTION β RΓSULTAT ATTENDU
ββββββΌβββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββ
T5.1 β Appel tool β vΓ©rifier log PostgreSQL β EntrΓ©e prΓ©sente
T5.2 β Γchec auth β vΓ©rifier log β EntrΓ©e avec auth_result=false
T5.3 β 3 Γ©checs consΓ©cutifs β alerte Discord β Embed envoyΓ©
T5.4 β GET /audit/stats β JSON statistiques
```
## π PRIORISATION & EFFORT
```
PHASE β PRIORITΓ β EFFORT β IMPACT β DΓPENDANCE
βββββββΌββββββββββββββΌββββββββββββΌβββββββββββββΌββββββββββββ
1 β π΄ CRITIQUE β π‘ Moyen β π’ MAX β Aucune
2 β π ΓLEVΓ β π‘ Moyen β π’ ΓLEVΓ β Phase 1
3 β π‘ MOYEN β π’ Faible β π‘ MOYEN β Phase 1
4 β π‘ MOYEN β π΄ ΓLEVΓ β π’ ΓLEVΓ β Phase 1
5 β π’ FAIBLE β π‘ Moyen β π‘ MOYEN β Phase 1+2
```
**Recommandation** : Phase 1 immΓ©diate β Phase 2 le mΓͺme jour β Phase 3 le lendemain β Phase 4-5 dans la semaine
## π LIVRABLES
1. `src/lib/bearerMiddleware.ts` β Middleware de vΓ©rification Bearer
2. `src/lib/withAuth.ts` β Wrapper pour les handlers MCP
3. `.env` β Ajout de `OVERMIND_AUTH=<token_sΓ©curisΓ©>`
4. `audit_log` table PostgreSQL β TraΓ§abilitΓ©
5. Documentation mise Γ jour β README + SECURITY.md
## β οΈ POINTS D'ATTENTION (Sley Γ vΓ©rifier)
- Le Bearer middleware doit-il Γͺtre dans `cli.ts` OU dans un hook FastMCP ?
- FastMCP v4.0.1 supporte-t-il un middleware natif ou faut-il un workaround Express ?
- STDIO doit-il aussi Γͺtre protΓ©gΓ© ou est-il trusted par design (local pipe) ?
- Le token doit-il Γͺtre rotatif ou statique ?
- Faut-il un système de scopes (admin vs lecture seule) ?
*π Document en attente de validation par sley_73350*