33800 Docs

← Retour

Confrontation Audit -- connectors-api

Date : 15/02/2026 Status : IMPLEMENTEE Auditeur confrontation : Claude Opus 4.6 Methode : Lecture integrale des 3 rapports d'audit independants, puis verification dans le code source des points de desaccord ou d'ambiguite.


Resume executif

Metrique Nombre
Findings CONFIRMES (2-3 passes concordantes) 14
Findings UNIQUES (1 seule passe) 8
Faux positifs elimines 0
Contradictions resolues 4

Repartition des findings confirmes par severite :

Severite definitive Nombre
BUG CERTAIN 7
BUG PROBABLE 4
RISQUE THEORIQUE 3

Findings CONFIRMES (2-3 passes concordantes)

C-01 : Signature JWT non verifiee (HMAC)


C-02 : Endpoints admin/sensibles sans authentification

Endpoint Confirme par Risque
DELETE /api/connectors/:id P1 + P2 + P3 Suppression arbitraire
POST /api/connectors/:id/token P1 + P2 + P3 Le plus critique : injection de token systeme
POST /api/connectors/:id/provision-type P1 + P2 + P3 Modification config
GET /api/connectors/:id/schema P1 + P3 Information disclosure
GET /api/connectors/:id/openapi P1 + P3 Information disclosure
GET /api/audit/logs/:id P1 + P2 + P3 Lecture logs sans controle
GET /api/connectors/:id/logs P1 + P2 + P3 Lecture logs sans controle
POST /api/connectors P2 Creation sans auth (mais utilise getUserFromRequest sans throw)
PUT /api/endpoints/:id P2 + P3 Modification endpoint (utilise getUserFromRequest sans throw)
DELETE /api/endpoints/:id P2 + P3 Suppression endpoint (utilise getUserFromRequest sans throw)
GET /api/audit/logs P2 Listing tous les logs
GET /api/connectors/:id/endpoints P3 Lecture endpoints

Precision importante : Certains endpoints (comme POST /api/connectors, PUT /api/endpoints/:id, DELETE /api/endpoints/:id) appellent getUserFromRequest() mais ne font PAS de throw ou return 401 si le resultat est null. Ils continuent l'execution avec userId = null. Ce sont donc des endpoints "partiellement" sans auth -- ils lisent l'identite mais ne l'exigent pas.


C-03 : /api/fetch accessible sans authentification applicative


C-04 : wireguard.ts utilise une API Supabase inexistante


C-05 : Execution de code JavaScript arbitraire via new Function() (actions Transform)


C-06 : Injection de commande SSH dans setupAutoKey via publicKey


C-07 : OAuth state non valide contre CSRF


C-08 : SSH host key verification desactivee


C-09 : IPs hardcodees dans le code applicatif


C-10 : NODE_TLS_REJECT_UNAUTHORIZED=0 en production


C-11 : Sel fixe pour la derivation de cle de chiffrement SSH


C-12 : getUserFromRequest (sync) ne supporte pas les API keys


C-13 : Webhook routine sans protection anti-replay


C-14 : Audit.log() appele avec des proprietes snake_case au lieu de camelCase


Findings UNIQUES (1 seule passe)

U-01 : Override d'en-tetes auth par le client dans /api/fetch


U-02 : SSH upload heredoc -- escapedContent calcule mais jamais utilise


U-03 : SSH injection via cwd parameter


U-04 : SSH injection via remotePath


U-05 : convertToOpenSSH placeholder non fonctionnel


U-06 : Versions incoherentes entre package.json, /health, et Swagger


U-07 : /api/fetch/upload accessible sans authentification


U-08 : getCredential OAuth sans verification de propriete (IDOR)


Contradictions resolues

Contradiction 1 : Severite de l'execution de code arbitraire (actions Transform)

Contradiction 2 : Injection SSH setupAutoKey -- certitude

Contradiction 3 : SSH upload heredoc -- lien avec finding #14 de Pass 1

Contradiction 4 : Nombre d'endpoints sans auth


Faux positifs elimines

Aucun faux positif n'a ete identifie dans les 3 rapports. Tous les findings ont ete verifies dans le code source et correspondent a des problemes reels, meme si leur severite varie.

Le finding de Pass 2 concernant la condition de course sur les API keys (F-09) est un RISQUE THEORIQUE reel mais a impact negligeable (depasser une limite de 10 cles). Ce n'est pas un faux positif, mais il ne merite pas de correction urgente.


Top 10 actions prioritaires

# Action Finding Effort Impact
1 Implementer la verification HMAC du JWT avec SUPABASE_JWT_SECRET C-01 30 min Elimine l'usurpation d'identite
2 Ajouter getAuthFromRequest() + reject si null sur tous les endpoints admin (DELETE connectors, POST token, audit logs, etc.) C-02 1-2h Elimine l'acces non authentifie aux operations sensibles
3 Exiger l'authentification sur /api/fetch et /api/fetch/upload C-03, U-07 10 min Empeche l'utilisation anonyme des tokens systeme
4 Supprimer NODE_TLS_REJECT_UNAUTHORIZED=0 de conf.prod.gouroubleu.yml C-10 5 min Restaure la verification TLS pour les APIs externes
5 Corriger les appels audit.log() dans index.ts : remplacer snake_case par camelCase et retirer le 2eme argument request C-14 30 min Restaure la tracabilite des operations endpoints
6 Echapper cwd, remotePath et publicKey dans ssh.ts avant injection shell C-06, U-03, U-04 30 min Elimine 3 vecteurs d'injection de commande SSH
7 Corriger le heredoc upload : utiliser escapedContent au lieu de fileContent, ou passer en base64 U-02 15 min Elimine l'injection via contenu de fichier
8 Sandboxer les actions Transform (isolated-vm ou worker Bun) ou les restreindre aux admins C-05 2-4h Elimine le RCE via new Function()
9 Remplacer getUserFromRequest par getAuthFromRequest sur les endpoints qui l'utilisent (POST connectors, PUT/DELETE endpoints, POST rediscover) C-12 30 min Support API keys + enforcement auth
10 Nettoyer wireguard.ts : supprimer le fichier si vpn-profiles.ts est le remplacement, ou reecrire avec le bon wrapper C-04 1h Elimine le code mort et la confusion

Annexe : Matrice de couverture des 3 passes

Domaine Pass 1 Pass 2 Pass 3
JWT / Auth Excellente Excellente Excellente
Endpoints sans auth Bonne Exhaustive Bonne
SSH injections publicKey publicKey cwd, remotePath, publicKey, heredoc
WireGuard API casse Oui Oui Oui
Flux de donnees fetch.ts Basique En profondeur (headers override) Basique
Actions Transform / RCE Oui Oui Non
OAuth state Oui Oui Non
Audit.log() appels incorrects Non Non Oui
Versions incoherentes Non Non Oui
convertToOpenSSH placeholder Non Non Oui
TLS global desactive Oui Non Oui
Chiffrement sel fixe Oui Note Oui

Conclusion : Les 3 passes sont complementaires. Pass 1 a la meilleure couverture de surface. Pass 2 a la meilleure profondeur sur les flux d'auth et de donnees. Pass 3 a identifie les bugs d'integration les plus subtils (audit.log snake_case, heredoc variable inutilisee, injections SSH cwd/remotePath). La confrontation des 3 passes permet une confiance elevee sur les findings confirmes et a identifie 8 findings uniques qui auraient ete manques avec une seule passe.