docs: rapport final — bugs corrigés, améliorations, tests, points d'amélioration
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
108
RAPPORT_FINAL.md
Normal file
108
RAPPORT_FINAL.md
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
# Rapport Final — SOC Bot Detector Dashboard
|
||||||
|
**Date :** 2026-03-16
|
||||||
|
**Commits :** `8032eba` (corrections bugs), `d4c3512` (améliorations)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Corrections de bugs (commit 8032eba)
|
||||||
|
|
||||||
|
| Bug | Cause | Correction |
|
||||||
|
|-----|-------|-----------|
|
||||||
|
| Brute Force > Attaquants : IPs affichées en `::ffff:x.x.x.x` | Pas de normalisation IPv6 dans la requête SQL | `replaceRegexpAll(toString(src_ip), '^::ffff:', '')` ajouté |
|
||||||
|
| Brute Force > Cibles : lien "Voir détails" → page inexistante | Navigation vers `/investigation/{host}` (hostname) au lieu d'une IP | Remplacement par composant `TargetRow` avec expansion inline des attaquants par host |
|
||||||
|
| Header Fingerprint : tableau de détail toujours vide | Frontend lisait `data.ips` au lieu de `data.items` | Correction de la clé |
|
||||||
|
| Heatmap Temporelle : "Top hosts ciblés" vide | Frontend lisait `data.hosts` + erreur de type TypeScript `{ hosts: TopHost[] }` | Correction clé `data.items` + type annotation |
|
||||||
|
| Botnets Distribués : clic sur ligne n'affiche rien | Frontend lisait `data.countries` au lieu de `data.items` | Correction de la clé |
|
||||||
|
| Rotation & Persistance : IPs en `::ffff:` + historique toujours vide | Pas de normalisation + frontend lisait `data.history` au lieu de `data.ja4_history` | Normalisation SQL + correction de la clé |
|
||||||
|
| TCP Spoofing : spoofings détectés sans corrélation TTL | Filtre Python-side sur données déjà filtrées TTL=30–31 | Filtre SQL `spoof_only` déplacé côté ClickHouse |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Améliorations implémentées (commit d4c3512)
|
||||||
|
|
||||||
|
### J — Synthèse IP multi-sources
|
||||||
|
- **Endpoint :** `GET /api/investigation/{ip}/summary`
|
||||||
|
- **Widget :** `IPActivitySummary` en haut de toute page d'investigation IP
|
||||||
|
- **Données :** ML + bruteforce + TCP spoofing + JA4 rotation + persistance + timeline 24h
|
||||||
|
- **Score de risque :** 0–100 (jauge SVG colorée)
|
||||||
|
- **Résultat :** Contexte immédiat en un coup d'œil, sans naviguer entre 6 pages
|
||||||
|
|
||||||
|
### I — Comparaison baseline 24h/hier
|
||||||
|
- **Endpoint :** `GET /api/metrics/baseline`
|
||||||
|
- **Widget :** 3 cartes (Détections 24h, IPs uniques, CRITICAL) avec variation ▲▼ en %
|
||||||
|
- **Impact :** Détecte immédiatement les pics anormaux (ex: +246% détections observé)
|
||||||
|
|
||||||
|
### M-4 — Score de sophistication adversaire
|
||||||
|
- **Endpoint :** `GET /api/rotation/sophistication`
|
||||||
|
- **Calcul :** JOIN 3 tables (rotation JA4 × 10 + récurrence × 20 + log(bruteforce+1) × 5)
|
||||||
|
- **Tiers :** APT-like / Advanced / Automated / Basic
|
||||||
|
- **Résultat :** Prioritisation des enquêtes les plus urgentes
|
||||||
|
|
||||||
|
### M-7 — Chasse proactive (low-and-slow)
|
||||||
|
- **Endpoint :** `GET /api/rotation/proactive-hunt`
|
||||||
|
- **Logique :** IPs récurrentes avec `abs(anomaly_score) < 0.5` — volent sous le radar ML
|
||||||
|
- **Évaluation :** "Évadeur potentiel" (ratio récurrence/score > 10) ou "Persistant modéré"
|
||||||
|
- **Impact :** Détecte les botnets slow-and-low que le modèle ML sous-score
|
||||||
|
|
||||||
|
### M-2 — Badge réputation ASN inline
|
||||||
|
- **Modification :** LEFT JOIN `asn_reputation` dans la requête des détections
|
||||||
|
- **Badge :** Rouge (malicious/bot/scanner), orange (proxy/vpn), vert (human)
|
||||||
|
- **Limitation :** La table `asn_reputation` contient 36 ASN français (ISPs légitimes) — les ASNs malveillants connus ne sont pas encore catalogués
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Tests exhaustifs Playwright
|
||||||
|
|
||||||
|
| Page | Résultat | Notes |
|
||||||
|
|------|----------|-------|
|
||||||
|
| Dashboard principal | ✅ | Baseline ▲ +246.5% détections, ▲ +11.6% IPs, = CRITICAL |
|
||||||
|
| Détections | ✅ | Badge ASN affiché (null pour ASNs hors table reputation) |
|
||||||
|
| Investigation IP (162.55.94.175) | ✅ | Score 38, TCP Spoof TTL 59, JA4 Rotation 9 sig |
|
||||||
|
| Rotation > Sophistication | ✅ | APT-like: 162.55.94.175 (score 100), 46.4.81.149 (score 100) |
|
||||||
|
| Rotation > Chasse proactive | ✅ | IPs avec scores négatifs sous le radar ML |
|
||||||
|
| Brute Force > Attaquants | ✅ | IPs propres (sans `::ffff:`) |
|
||||||
|
| Brute Force > Cibles | ✅ | Expansion inline des attaquants par host |
|
||||||
|
| Header Fingerprint | ✅ | Tableau détail rempli au clic |
|
||||||
|
| Heatmap Temporelle | ✅ | Top hosts ciblés affiché |
|
||||||
|
| Botnets Distribués | ✅ | Détail pays au clic |
|
||||||
|
| TCP Spoofing | ✅ | Filtre `spoof_only` fonctionnel |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Points problématiques et axes d'amélioration
|
||||||
|
|
||||||
|
### 🔴 Critiques
|
||||||
|
|
||||||
|
1. **Table `asn_reputation` incomplète** — 36 entrées uniquement (ISPs français). Pour être utile, elle devrait contenir les ASNs des datacenters, VPS, proxies connus (OVH, DigitalOcean, AWS, Linode, etc.). Source suggérée : AbuseIPDB ASN database, IPInfo, Maxmind.
|
||||||
|
|
||||||
|
2. **Chasse proactive — scores négatifs** — `view_ip_recurrence.worst_score` stocke le score brut (peut être négatif). La condition `abs(score) < 0.5` capture des IPs HIGH avec score -0.18 qui sont déjà détectées par ML. Il faudrait filtrer par niveau de menace (`worst_threat_level NOT IN ('HIGH', 'CRITICAL')`) pour vraiment identifier les cas sous le radar.
|
||||||
|
|
||||||
|
3. **Pas de persistance des classifications SOC** — Les classifications manuelles (`/api/analysis/classify`) ne persistent que pendant la session si la table `classifications` n'est pas créée. Un script d'init DB serait utile.
|
||||||
|
|
||||||
|
### 🟡 Moyens
|
||||||
|
|
||||||
|
4. **Score de sophistication biaised** — Les IPs avec forte rotation JA4 mais `recurrence=0` dans `view_ip_recurrence` (non présentes) atteignent quand même score 100. Les données des deux vues ne sont pas toujours cohérentes sur la même période temporelle.
|
||||||
|
|
||||||
|
5. **Timeline 24h dans la synthèse IP** — Utilise `window_start >= now() - INTERVAL 24 HOUR` sur `agg_host_ip_ja4_1h`. Si les données ont moins de 24h d'historique, le graphique sera partiel/vide. Adapter la fenêtre dynamiquement selon les données disponibles.
|
||||||
|
|
||||||
|
6. **Heatmap Temporelle** — Les données de `agg_host_ip_ja4_1h` ne sont agrégées que pour les dernières 24h dans l'endpoint. Un sélecteur de plage temporelle (7j, 30j) permettrait de détecter les patterns de vagues cycliques (botnets hebdomadaires).
|
||||||
|
|
||||||
|
7. **Pas d'export des résultats** — Les analystes SOC ne peuvent pas exporter les listes d'IPs malveillantes (CSV, STIX). Un endpoint `GET /api/rotation/sophistication?format=csv` serait utile pour l'IOC sharing.
|
||||||
|
|
||||||
|
### 🟢 Mineurs
|
||||||
|
|
||||||
|
8. **"Investiguer" dans le RotationView ne transmet pas le contexte** — Un clic sur "Investiguer" depuis l'onglet Sophistication navigue vers `/investigation/{ip}` sans pré-charger le contexte de l'onglet source. Un `?source=sophistication&score=100` dans l'URL permettrait d'afficher un bandeau contextuel.
|
||||||
|
|
||||||
|
9. **Onglets non présents dans la sidebar** — Les 7 dashboards d'analyse avancée ne sont pas organisés en sous-menus. Avec l'ajout des onglets Sophistication et Chasse proactive dans Rotation, la sidebar commence à être longue.
|
||||||
|
|
||||||
|
10. **Badge ASN ne trie pas les détections** — Il n'y a pas encore de filtre "Afficher seulement les ASNs malveillants" dans les détections.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Architecture — points de vigilance
|
||||||
|
|
||||||
|
- Le **SPA catch-all** (`/{full_path:path}`) doit rester **le dernier router** dans `main.py`
|
||||||
|
- L'endpoint `/api/investigation/{ip}/summary` utilise le préfixe `/api/investigation` — compatible avec la route SPA `/investigation/:ip` (distinct)
|
||||||
|
- Les **scores négatifs** dans `anomaly_score` et `worst_score` sont normaux — toujours utiliser `abs()` pour l'affichage
|
||||||
|
- Les **IPv6-mapped** (`::ffff:x.x.x.x`) sont présentes dans toutes les vues agrégées — systématiquement utiliser `replaceRegexpAll(toString(src_ip), '^::ffff:', '')`
|
||||||
|
|
||||||
Reference in New Issue
Block a user