Aller au contenu principal

🔬 Optimisation des algorithmes


Algorithme actuel (v1)

Formule

scoreFinal = min(100, round(patternScore × 0.6 + headerScore × 0.4))

Calcul du patternScore

Pour chaque pattern :
matchScore = 0
+ keywords match → (matches/total) × 40 (max +40)
+ subject regex → +30 si match (max +30)
+ sender domain → +30 si match (max +30)
+ body keywords → (matches/total) × 20 (max +20)

Si matchScore > 15 :
finalScore = min(100, round(matchScore/100 × pattern.score))

patternScore = max(finalScore de tous les patterns déclenchés)

Calcul du headerScore

SPF fail → +25
DKIM fail → +25
DMARC fail → +20
rDNS mismatch → +15
IP blacklist → +30

headerScore = min(100, sum des modifiers appliqués)

Limites de l'algorithme v1

LimitationImpactPriorité
Pas de contexte sémantiqueFaux négatifs sur phishing sophistiquéHaute
Regex sensible à la casse (mitigé par (?i))Quelques faux négatifsMoyenne
patternScore = max (pas de cumul)Sous-scoring si plusieurs patterns faiblesMoyenne
Pas de velocity (fréquence d'une IP/domaine)Manque les campagnesHaute
Patterns statiques (pas d'apprentissage)Dérive face aux nouvelles techniquesHaute

Scoring v2 (Q3 2026)

Nouvelle formule

scoreFinal = min(100, round(
headerScore × 0.30 +
patternScore × 0.35 +
iaScore × 0.20 +
velocityScore × 0.15
))

iaScore — Modèle ML embarqué

Technologie : TensorFlow.js (ONNX format) ou HuggingFace Transformers
Modèle cible : distilbert-base-uncased ou sentence-transformers/all-MiniLM-L6-v2
Latence cible : < 200ms par inférence

Pipeline d'entraînement :

Données brutes (SMS Spam + Enron + corpus communautaire)

Nettoyage + tokenisation

Feature extraction (TF-IDF + embeddings)

Fine-tuning (SetFit / few-shot learning)

Validation croisée (k=5)

Export ONNX

Déploiement Edge Function / TF.js

Monitoring F1-score en production

Métriques cibles :

  • Précision : > 96%
  • Recall : > 94%
  • F1-score : > 0.95
  • Latence inférence : < 200ms

velocityScore — Détection de campagnes

// Principe : une IP/domaine qui apparaît N fois en T minutes → signal fort
const velocityScore = calculateVelocity({
identifier: ip || domain,
window: 60 * 60 * 1000, // 1 heure
threshold: 10 // 10 occurrences = score maximal
});

// Stockage en Redis ou table PostgreSQL avec TTL
// score = min(100, (count / threshold) * 100)

Optimisations de performance

Cache/Déduplication par hash

// Empêcher les analyses identiques inutiles
import { createHash } from 'crypto';

const headerHash = createHash('sha256')
.update(emailHeaders)
.digest('hex');

// Vérifier le cache avant d'analyser
const cached = await redis.get(`analysis:${headerHash}`);
if (cached) return JSON.parse(cached);

// Analyser et mettre en cache 1h
const result = await analyze(emailHeaders);
await redis.set(`analysis:${headerHash}`, JSON.stringify(result), 'EX', 3600);

Économie estimée : 20-30% de requêtes évitées (emails en masse similaires).

Architecture asynchrone (job queue)

Pour les analyses lourdes (batch, IA lente) :

POST /analyze → 202 ACCEPTED + { jobId: "uuid" }
GET /job/uuid → { status: "pending" | "processing" | "complete" | "error", result? }

Avantages :

  • Pas de timeout HTTP (analyses > 30s)
  • Scalabilité horizontale des workers
  • Retry automatique sur erreur

Stack : Bull.js (Redis) ou Supabase Queue (Q3 2026)

Validation Zod des patterns

const PatternSchema = z.object({
id: z.string().regex(/^[A-Z]+-\d{3}$/),
type: z.enum(['phishing', 'scam', 'malware', 'commercial', 'banking',
'tech_support', 'sextortion', 'delivery', 'sms_spam',
'corporate_spam', 'financial_spam', 'generic_spam',
'word_frequency', 'char_frequency', 'combination']),
keywords: z.array(z.string()).min(1),
subject_regex: z.array(z.string()),
sender_domains: z.array(z.string()),
score: z.number().min(0).max(100),
severity: z.enum(['low', 'medium', 'high', 'critical']),
});

Validation au build : erreur TypeScript si un pattern est malformé.


Multi-langues (Q3 2026)

Problème actuel : les patterns keywords sont principalement en français.
Les emails en anglais peuvent avoir des scores plus faibles.

Solution :

// Patterns avec variantes multilingues
{
"keywords": {
"fr": ["livraison", "colis", "suivi"],
"en": ["delivery", "package", "tracking"],
"it": ["consegna", "pacco"],
"de": ["Lieferung", "Paket"]
}
}

Détection automatique de la langue via franc ou langdetect (Deno).


NLP avancé — Corps d'email (Q4 2026)

Actuellement, seuls les headers sont analysés. L'analyse du corps permettrait :

FeatureGain détection estimé
URLs suspectes (phishing, redirections)+15% recall
Pièces jointes (hash, extension)+10%
Sentiment / tonalité émotionnelle+8%
Extraction d'entités (IBAN, numéros de téléphone)+5%
Résumé LLM des emails suspects(qualité, pas précision)

Architecture cible :

Corps email brut
↓ HTML stripping
↓ URL extraction → VirusTotal check
↓ LLM summarization (GPT-4 API ou LLaMA local)
↓ Entity extraction (spaCy / Duckling)
↓ Sentiment analysis
↓ bodyScore intégré dans scoreFinal