diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 379c752..32c4734 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -302,6 +302,12 @@ function InvestigateRoute() {
return ;
}
+/** Redirige /investigation/ip/:ip → /investigation/:ip */
+function IpInvestigationRedirect() {
+ const { ip } = useParams<{ ip: string }>();
+ return ;
+}
+
function BulkClassificationRoute() {
const navigate = useNavigate();
const [searchParams] = useSearchParams();
@@ -373,6 +379,7 @@ function MainContent({ counts: _counts }: { counts: AlertCounts | null }) {
} />
} />
} />
+ } />
} />
} />
} />
diff --git a/frontend/src/components/ui/tooltips.ts b/frontend/src/components/ui/tooltips.ts
index 2af8216..afb6fb5 100644
--- a/frontend/src/components/ui/tooltips.ts
+++ b/frontend/src/components/ui/tooltips.ts
@@ -282,4 +282,120 @@ export const TIPS = {
'Niveau de menace composite :\n' +
'· CRITICAL > 70 % · HIGH 45–70 %\n' +
'· MEDIUM 25–45 % · LOW < 25 %',
+
+ // ── Nouveau ──────────────────────────────────────────────────────────────────
+
+ risk_score_inv:
+ 'Score de risque composite [0–100] calculé à partir de multiples sources :\n' +
+ 'détections ML, TCP spoofing, brute force, persistance,\n' +
+ 'réputation IP, géolocalisation, fingerprint JA4.',
+
+ browser_score:
+ 'Score de légitimité navigateur [0–100].\n' +
+ 'Basé sur la cohérence TLS/JA4, User-Agent, Client Hints.\n' +
+ '100 = navigateur parfaitement légitime · 0 = outil scriptant.',
+
+ spoofing_score:
+ 'Score de spoofing [0–100] : probabilité que le UA déclaré\n' +
+ 'ne corresponde pas au client réel.\n' +
+ 'Basé sur UA/CH mismatch, SNI mismatch, JA4 rareté, rotation.',
+
+ ja4_rare_pct:
+ 'Pourcentage de requêtes utilisant un JA4 fingerprint rare.\n' +
+ 'Un JA4 rare (vu par < 0,1 % du trafic) peut indiquer\n' +
+ 'un outil custom, un bot ou un scanner.',
+
+ ja4_rotation:
+ 'Rotation JA4 : le client change fréquemment de fingerprint TLS.\n' +
+ 'Signal fort de bot rotatif ou d\'évasion de détection.\n' +
+ '> 3 JA4 distincts par heure = rotation anormale.',
+
+ ua_rotation:
+ 'Rotation de User-Agent : le client change fréquemment d\'identité navigateur.\n' +
+ 'Technique utilisée par les bots pour éviter la détection.\n' +
+ '> 3 UA distincts / heure = rotation suspecte.',
+
+ persistence:
+ 'Persistance : l\'IP est réapparue sur plusieurs fenêtres temporelles.\n' +
+ 'Une IP persistante est plus susceptible d\'être un bot opérationnel\n' +
+ 'qu\'une attaque ponctuelle.',
+
+ credential_stuffing:
+ 'Credential Stuffing : test automatisé de couples login/mot de passe\n' +
+ 'issus de bases de données volées.\n' +
+ 'Caractérisé par de nombreux paramètres distincts sur les mêmes endpoints.',
+
+ enumeration:
+ 'Énumération : exploration automatique de ressources ou d\'identifiants\n' +
+ '(comptes, IDs, chemins). Diffère du brute force\n' +
+ 'car vise la découverte plutôt que l\'authentification.',
+
+ params_combos:
+ 'Nombre de combinaisons de paramètres uniques envoyées.\n' +
+ 'Valeur haute → outil automatisé testant des payloads variés\n' +
+ '(fuzzing, credential stuffing, énumération).',
+
+ confiance:
+ 'Niveau de confiance de la détection [0–100 %].\n' +
+ 'Basé sur le nombre de signaux concordants.\n' +
+ '> 80 % = très fiable · < 40 % = signal faible.',
+
+ botnet_global:
+ 'Botnet Global : IPs réparties dans > 10 pays distincts.\n' +
+ 'Caractéristique d\'un réseau de machines compromises (botnet) distribué mondialement.',
+
+ botnet_regional:
+ 'Botnet Régional : IPs concentrées dans 3–10 pays.\n' +
+ 'Peut indiquer un réseau de proxies régionaux ou une campagne ciblée.',
+
+ botnet_concentrated:
+ 'Botnet Concentré : IPs majoritairement dans 1–2 pays.\n' +
+ 'Peut être un datacenter, un VPN ou un opérateur malveillant local.',
+
+ hash_cluster:
+ 'Cluster d\'empreinte headers : groupe d\'IPs partageant\n' +
+ 'exactement le même profil de headers HTTP.\n' +
+ 'IPs dans le même cluster utilisent probablement le même outil/bot.',
+
+ sec_fetch_dest:
+ 'Sec-Fetch-Dest : destination de la requête selon le navigateur.\n' +
+ 'Valeurs : document, image, script, font, xhr…\n' +
+ 'Absent = client non-navigateur (bot, curl, outil HTTP).',
+
+ sec_fetch_site:
+ 'Sec-Fetch-Site : origine de la requête par rapport au contexte.\n' +
+ 'Valeurs : same-origin, cross-site, none.\n' +
+ 'Absent = client non-navigateur (bot, curl, outil HTTP).',
+
+ tendance:
+ 'Tendance sur les dernières 24h par rapport à la période précédente.\n' +
+ '↑ +X% = augmentation du volume de détections.\n' +
+ '↓ -X% = diminution.',
+
+ subnet_cidr:
+ 'Sous-réseau CIDR /24 : plage de 256 adresses IP contiguës.\n' +
+ 'Plusieurs IPs malveillantes dans le même /24 suggèrent\n' +
+ 'un datacenter, un opérateur ou un réseau compromis.',
+
+ total_detections_stat:
+ 'Nombre total d\'événements de détection enregistrés\n' +
+ 'par le moteur ML dans la fenêtre d\'analyse.',
+
+ unique_ips_stat:
+ 'Nombre d\'adresses IP distinctes ayant généré des détections\n' +
+ 'dans la fenêtre d\'analyse.',
+
+ ja4_distinct:
+ 'Nombre de fingerprints JA4 distincts utilisés par cette IP.\n' +
+ '> 3 = rotation de fingerprint TLS (signal de bot évasif).',
+
+ baseline_ja4:
+ 'JA4 légitimes (baseline) : fingerprints TLS observés chez\n' +
+ 'des navigateurs légitimes confirmés (Chrome, Firefox, Safari…).\n' +
+ 'Comparez le JA4 de l\'IP avec cette baseline pour évaluer le risque.',
+
+ correlation_node:
+ 'Nœud de corrélation : entité reliée à l\'IP analysée.\n' +
+ 'Les connexions (arêtes) représentent des relations directes\n' +
+ '(même subnet, même ASN, même JA4, même host cible).',
};