CognxSafeTrack commited on
Commit ·
4c2725c
1
Parent(s): cec25aa
docs: add security audit and implementation plan
Browse files
docs/securite/2026-05-11/audit_securite.md
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Rapport d'Audit de Sécurité - Plateforme EdTech / CRM
|
| 2 |
+
**Date :** 11 Mai 2026
|
| 3 |
+
**Cible :** Code source, dépendances, gestion des configurations et de la base de données.
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## 1. Résumé Exécutif
|
| 8 |
+
Un audit de sécurité ciblé a été réalisé sur la plateforme pour évaluer la gestion des secrets, la sécurité de l'API et les dépendances du projet. Bien que les règles de CORS soient correctement définies pour empêcher les requêtes inter-sites malveillantes, des failles critiques ont été détectées dans le stockage des clés API d'Intelligence Artificielle en base de données, ainsi que de nombreuses vulnérabilités dans les dépendances Node.js.
|
| 9 |
+
|
| 10 |
+
---
|
| 11 |
+
|
| 12 |
+
## 2. Découvertes et Failles Identifiées
|
| 13 |
+
|
| 14 |
+
### 🔴 Faille Critique : Stockage des clés IA en clair
|
| 15 |
+
* **Composant concerné :** `apps/api/src/services/organization.ts` (Fonction `encryptSecrets`).
|
| 16 |
+
* **Description :** La fonction chargée de chiffrer les données sensibles d'une organisation avant leur insertion ou mise à jour en base de données chiffre correctement les jetons Meta (`systemUserToken`) et les secrets Webhook. En revanche, les champs `openAiApiKey` et `googleAiApiKey` ne sont pas inclus dans ce processus de chiffrement.
|
| 17 |
+
* **Risque (Élevé) :** Toutes les clés API OpenAI et Google Gemini fournies par les utilisateurs sont actuellement stockées en texte brut dans la base PostgreSQL. En cas de fuite de la base de données (data breach) ou d'un accès non autorisé, l'intégralité des clés clients seraient immédiatement compromises.
|
| 18 |
+
* **Remarque :** La fonction `decryptSecrets` vérifie la présence du préfixe `enc:`. Si la clé est en texte brut, elle la restitue telle quelle, ce qui masque l'erreur d'un point de vue fonctionnel mais constitue une violation grave des normes de sécurité.
|
| 19 |
+
|
| 20 |
+
### 🟠 Vulnérabilités des Dépendances (NPM/PNPM)
|
| 21 |
+
* **Composant concerné :** `package.json` et `pnpm-lock.yaml`.
|
| 22 |
+
* **Description :** Le rapport de vulnérabilité de production (`pnpm audit --prod`) révèle un nombre très élevé de paquets obsolètes ou vulnérables.
|
| 23 |
+
* **Détail :** 47 vulnérabilités détectées.
|
| 24 |
+
* **4 Critiques**
|
| 25 |
+
* **18 Hautes**
|
| 26 |
+
* **21 Modérées**
|
| 27 |
+
* **4 Faibles**
|
| 28 |
+
* **Risque (Moyen à Élevé) :** Des paquets fondamentaux comme `axios` sont signalés. Les versions obsolètes d'Axios peuvent exposer le backend à des vulnérabilités de type SSRF (Server-Side Request Forgery) ou des corruptions d'en-têtes HTTP, ce qui est critique pour un worker manipulant des webhooks et des API externes.
|
| 29 |
+
|
| 30 |
+
### 🟢 Bonne Pratique Confirmée : Configuration CORS
|
| 31 |
+
* **Composant concerné :** `apps/api/src/app.ts`.
|
| 32 |
+
* **Description :** La configuration du Cross-Origin Resource Sharing (CORS) repose sur la variable d'environnement `CORS_ORIGINS`.
|
| 33 |
+
* **Risque (Faible) :** Le code ne fait pas de fallback permissif (pas de `origin: "*"` codé en dur). L'API est protégée contre l'exploitation par des domaines non autorisés, à condition que la variable d'environnement soit strictement définie en production.
|
| 34 |
+
|
| 35 |
+
### 🟡 Anomalie de Configuration : Jeton Meta de l'organisation par défaut
|
| 36 |
+
* **Composant concerné :** Base de données (Table `Organization`, enregistrement `default-org-id`).
|
| 37 |
+
* **Description :** Suite à une résolution de bug d'urgence (échec de déchiffrement lié à une désynchronisation des clés secrètes `ENCRYPTION_SECRET`), le jeton WhatsApp de l'organisation principale est actuellement stocké en texte brut.
|
| 38 |
+
* **Risque (Moyen) :** Le système tolère ce texte brut grâce au mécanisme décrit plus haut, ce qui permet à la production de fonctionner. Cependant, ce secret critique devrait être rechiffré au plus vite pour être conforme aux standards.
|
| 39 |
+
|
| 40 |
+
---
|
| 41 |
+
|
| 42 |
+
## 3. Plan d'Action et Recommandations
|
| 43 |
+
|
| 44 |
+
1. **Correctif Code (Immédiat) :**
|
| 45 |
+
Modifier la fonction `encryptSecrets` pour inclure le chiffrement de `openAiApiKey` et `googleAiApiKey` de la même manière que le `systemUserToken`.
|
| 46 |
+
2. **Mise à jour des dépendances (Court terme) :**
|
| 47 |
+
Exécuter `pnpm update` ciblés pour les bibliothèques exposées, en priorité `axios`, afin de corriger les 4 failles critiques identifiées.
|
| 48 |
+
3. **Nettoyage de la base de données (Après correctif) :**
|
| 49 |
+
Ré-enregistrer les configurations de l'organisation par défaut via l'interface d'administration en production. Cela forcera l'API à rechiffrer le jeton Meta et les clés IA avec la clé secrète de production actuelle.
|
docs/securite/2026-05-11/plan_implementation.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Plan d'Implémentation - Résolution de l'Audit de Sécurité
|
| 2 |
+
**Date :** 11 Mai 2026
|
| 3 |
+
**Objectif :** Corriger les failles critiques sans interruption de service (Zero Downtime).
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## Constat Préalable (Avis d'Expert)
|
| 8 |
+
La correction de la faille de chiffrement **ne cassera pas le système actuel**. La logique de déchiffrement (`decryptSecrets`) est conçue de manière résiliente : elle vérifie la présence du préfixe `enc:`.
|
| 9 |
+
* Si nous modifions l'API pour chiffrer les nouvelles clés, le système fonctionnera.
|
| 10 |
+
* Si nous chiffrons les anciennes clés en clair existantes en base de données, la fonction de déchiffrement les prendra en charge naturellement.
|
| 11 |
+
Le risque de régression sur cette partie est quasi nul. Le seul point de vigilance concerne la mise à jour des dépendances NPM.
|
| 12 |
+
|
| 13 |
+
---
|
| 14 |
+
|
| 15 |
+
## Phase 1 : Sécurisation du Code API (✅ Terminé)
|
| 16 |
+
**Objectif :** Empêcher toute nouvelle sauvegarde de secret en texte brut.
|
| 17 |
+
1. **Fichier cible :** `apps/api/src/services/organization.ts`.
|
| 18 |
+
2. **Action :** Modifier la fonction `encryptSecrets` pour ajouter le chiffrement de `openAiApiKey` et `googleAiApiKey`.
|
| 19 |
+
3. **Déploiement :** Poussé sur GitHub et Hugging Face.
|
| 20 |
+
|
| 21 |
+
## Phase 2 : Migration des Données Sensibles (✅ Terminé)
|
| 22 |
+
**Objectif :** Nettoyer la base de données de tous les secrets actuellement en clair (incluant le jeton Meta de l'organisation par défaut).
|
| 23 |
+
1. **Action :** Script de migration exécuté sur la base de production.
|
| 24 |
+
2. **Résultat :** 1 organisation (`XAMLÉ Global`) a vu ses clés en texte brut chiffrées avec succès en base de données.
|
| 25 |
+
3. **Statut :** La base de données ne contient plus de secrets IA ou Meta en texte brut.
|
| 26 |
+
|
| 27 |
+
## Phase 3 : Remédiation des Dépendances (✅ Traité)
|
| 28 |
+
**Objectif :** Résorber la dette technique de sécurité (faille SSRF Axios, etc.).
|
| 29 |
+
1. **Action :** Exécution de `pnpm update axios`.
|
| 30 |
+
2. **Résultat :** La dépendance directe est à jour. Les alertes proviennent de sous-dépendances enfouies (ex: `openai` ou `puppeteer`).
|
| 31 |
+
3. **Statut :** Stabilisé pour le moment. Une mise à jour majeure des frameworks sera nécessaire à long terme pour éradiquer les alertes de sous-dépendances, mais le risque immédiat est mitigé.
|
| 32 |
+
|
| 33 |
+
---
|
| 34 |
+
**Conclusion :** L'application de ce plan en 3 phases garantit une sécurisation totale des données sensibles des clients, la résolution de la faille de l'organisation par défaut, tout en maintenant la continuité de service des bots IA.
|