diff --git a/docs/THESIS_HTTP_Traffic_Detection.md b/docs/THESIS_HTTP_Traffic_Detection.md index 0ee60c5..f636fdf 100644 --- a/docs/THESIS_HTTP_Traffic_Detection.md +++ b/docs/THESIS_HTTP_Traffic_Detection.md @@ -415,6 +415,7 @@ XGBoost ([Chen & Guestrin, 2016](https://arxiv.org/abs/1603.02754)) est un algor **Limites des approches supervisées** : - **Concept drift** : un modèle entraîné sur des bots de 2024 peut être aveugle aux nouvelles techniques de 2025 - **Rareté des étiquettes** : annoter manuellement des millions de sessions HTTP est coûteux et sujet à erreur +- **Bruit des étiquettes** : les labels fournis par les analystes SOC contiennent des erreurs systématiques (faux positifs mal corrigés, biais de confirmation). Ces étiquettes bruitées empoisonnent le modèle supervisé — un problème bien documenté par [Northcutt et al., 2021 (Cleanlab)](https://arxiv.org/abs/1911.00068) qui montre que les jeux de données réels contiennent 8 à 20 % de labels incorrects. Pour mitiger ce risque, notre pipeline intègre un filtre Cleanlab avant l'entraînement XGBoost (détail §3.8). - **Biais de jeu de données** : les modèles entraînés sur des données de laboratoire (CICIDS2017, NSL-KDD) généralisent mal au trafic en production, comme le souligne le benchmark MAWIFlow 2025 (Schraven et al. [Référence à vérifier / Identifier le vrai papier]) - **Attaque par évasion adversariale** : un attaquant ayant accès ou connaissance du modèle peut crafting des sessions qui maximisent le score de légitimité @@ -580,10 +581,28 @@ où σ est la fonction sigmoïde : σ(z) = 1 / (1 + e^{-z}) Les poids w1–w4 sont appris, permettant au système de calibrer automatiquement l'importance relative de chaque voix en fonction du type de trafic en production. En dessous de 1 000 étiquettes, le système revient aux poids fixes : `(eif: 0.50, ae: 0.30, xgb: 0.20)`. **Calendrier de retraining** : -- XGBoost : hebdomadaire sur les étiquettes accumulées +- XGBoost : hebdomadaire sur les étiquettes accumulées, après filtrage Cleanlab des labels SOC bruyants (voir ci-dessous) - EIF : toutes les 24 heures - AE : continu avec arrêt précoce sur la loss de validation +**Filtrage des labels SOC bruyants (Cleanlab)** : + +Avant chaque entraînement XGBoost, les labels fournis par les analystes SOC sont filtrés via [Cleanlab](https://cleanlab.ai/) ([Northcutt et al., 2021](https://arxiv.org/abs/1911.00068)). Ce framework de *confident learning* identifie les exemples dont l'étiquette est probablement erronée en comparant les prédictions out-of-fold d'un modèle aux labels observés. + +```python +# 1. Obtenir pred_probs via cross-validation (3 folds) +quick_model = XGBClassifier(n_estimators=80, max_depth=4) +pred_probs = cross_val_predict(quick_model, X, y, cv=3, method='predict_proba') + +# 2. Identifier les labels douteux +issues = find_label_issues(labels=y, pred_probs=pred_probs) + +# 3. Exclure les exemples bruités avant l'entraînement final +X_clean, y_clean = X[~noisy_mask], y[~noisy_mask] +``` + +Ce mécanisme protège le modèle contre l'empoisonnement par des faux positifs mal corrigés ou des biais de confirmation des analystes. Le taux de labels filtrés est loggé pour surveillance. En cas d'échec de Cleanlab (erreur mémoire, dépendance manquante), le pipeline revient aux données brutes sans interruption. + #### 2.4.3 Concept Drift et retraining adaptatif **Définition du concept drift** @@ -3050,7 +3069,7 @@ La durée du cycle (300 s = 5 minutes) est contrainte principalement par la **fe **MetaLearner logistic regression** : O(n × d) entraînement, d = 3 features d'entrée (scores EIF, AE, XGBoost). Temps négligeable quelle que soit la taille. -**Limite architecturale principale** : le modèle XGBoost hebdomadaire nécessite un jeu de labels accumulés via le feedback SOC. À faible volume de labels (< 500 sessions étiquetées par semaine), XGBoost ne converge pas correctement. Ce problème est identifié comme axe d'amélioration futur (§6.6 — online learning). +**Limite architecturale principale** : le modèle XGBoost hebdomadaire nécessite un jeu de labels accumulés via le feedback SOC. À faible volume de labels (< 500 sessions étiquetées par semaine), XGBoost ne converge pas correctement. Ce problème est partiellement atténué par le filtrage Cleanlab qui élimine les labels douteux (détail §3.8), mais reste identifié comme axe d'amélioration futur (§6.6 — online learning). **Overhead de l'uprobe SSL_read** : un uprobe attaché à `SSL_read` se déclenche à *chaque* appel de lecture TLS, y compris pour les gros transferts de fichiers (images, vidéos, scripts JS volumineux), où une seule requête peut générer des dizaines d'appels `SSL_read` successifs transportant des frames HTTP/2 DATA sans intérêt pour le fingerprinting. Sous forte charge (> 10 000 connexions TLS actives simultanées), cet overhead peut dégrader les performances du serveur web de manière mesurable. Les mitigations recommandées sont : (1) filtrer côté eBPF les invocations dont le buffer ne contient pas les magic bytes HTTP/2 ou HTTP/1.x (`GET `, `POST `, etc.) avant de soumettre au ring buffer ; (2) ignorer les frames HTTP/2 de type DATA de grande taille (longueur payload > 16 384 octets) qui ne contiennent pas d'en-têtes de requête ; (3) appliquer du sampling probabiliste (ex. 1 appel sur 10) pour les connexions déjà identifiées par leur JA4 comme des navigateurs légitimes connus. diff --git a/docs/services/bot-detector.md b/docs/services/bot-detector.md index cd5e478..d984841 100644 --- a/docs/services/bot-detector.md +++ b/docs/services/bot-detector.md @@ -161,7 +161,7 @@ Le bot-detector utilise trois modèles en parallèle, combinés par une pondéra ┌──────────────────────┐ │ │ XGBoost │ ├──→ anomaly_score │ (supervisé, labels │──→ xgb_prob (0–1) - │ SOC) │ × XGB_WEIGHT + │ SOC + Cleanlab) │ × XGB_WEIGHT └──────────────────────┘ ``` @@ -229,7 +229,7 @@ dim2 = min(32, max(dim1 // 2, latent_dim + 2)) ### XGBoost (supervisé) -Entraîné sur les labels issus du feedback SOC (table `soc_feedback`) : +Entraîné sur les labels issus du feedback SOC (table `soc_feedback`), filtrés par Cleanlab : ```python xgb.XGBClassifier( @@ -248,6 +248,7 @@ xgb.XGBClassifier( - Labels négatifs (légitime) : `NORMAL`, `LEGITIMATE_BROWSER` - Activation requiert ≥ `XGB_MIN_LABELS` (100) labels - Réentraînement tous les `XGB_RETRAIN_INTERVAL_HOURS` (168h = 7 jours) +- **Filtrage Cleanlab** : avant l'entraînement, un XGBoost rapide (80 arbres, 3-fold CV) produit des `pred_probs` qui alimentent `cleanlab.filter.find_label_issues()`. Les exemples identifiés comme bruités sont exclus du jeu d'entraînement. En cas d'échec, les labels bruts sont conservés. --- diff --git a/services/bot-detector/DOCUMENTATION.md b/services/bot-detector/DOCUMENTATION.md index 8dec67c..0c74ede 100644 --- a/services/bot-detector/DOCUMENTATION.md +++ b/services/bot-detector/DOCUMENTATION.md @@ -583,6 +583,20 @@ XGBClassifier( positifs (FP) servent d'exemples négatifs, les vrais positifs (TP) d'exemples positifs. Requiert ≥ `XGB_MIN_LABELS` (100) labels avant activation. +**Filtrage Cleanlab des labels bruités** (`cleanlab>=2.6`, optionnel) : + +Avant l'entraînement XGBoost, un pipeline de *confident learning* filtre les +labels SOC probablement erronés : + +1. Entraînement d'un XGBoost rapide (`n_estimators=80, max_depth=4`) en 3-fold CV +2. Extraction des `pred_probs` out-of-fold via `cross_val_predict` +3. Appel à `cleanlab.filter.find_label_issues(labels=y, pred_probs=pred_probs)` +4. Exclusion des indices identifiés comme bruités du jeu d'entraînement +5. Recalcul du `scale_pos_weight` sur les données nettoyées + +Le taux de labels filtrés est loggué (`[XGB][name] Cleanlab : N/M labels bruyants supprimés (X.X%)`). +En cas d'échec (erreur, dépendance manquante), le pipeline retombe sur les données brutes sans interruption. + **Ré-entraînement** : Toutes les `XGB_RETRAIN_INTERVAL_HOURS` (168h = 7 jours). **Persistance** : `model.save_model()` → fichier `.json`.