Share
## https://sploitus.com/exploit?id=CDB7056C-E555-516C-BB09-0E933E252292
# FULCRUM β Architecture Technique v3.1
## Vue d'ensemble
FULCRUM est une plateforme d'intelligence multi-spectre (cyber, gΓ©ostratΓ©gique, offensif)
basΓ©e sur une architecture **rule-based** sans dΓ©pendance IA/LLM/NLP.
```
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FULCRUM v3.1 Architecture β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββ ββββββββββββββββ βββββββββββββββββββββββ β
β β collectors/ β β analyzers/ β β persistence/ β β
β β β β β β β β
β β rss_ β β scoring_ β β sqlite_store.py β β
β β collector.py β β engine.py β β cache_manager.py β β
β β β β β β β β
β β api_ β β ioc_ β βββββββββββββββββββββββ β
β β collector.py β β extractor.py β β
β β (CISA KEV, β β β βββββββββββββββββββββββ β
β β ACLED, β β correlator.pyβ β exporters/ β β
β β Ransomware)β β (SimHash, β β β β
β β β β clusters) β β html_dashboard.py β β
β ββββββββββββββββ ββββββββββββββββ β json_exporter.py β β
β β pdf_exporter.py β β
β ββββββββββββββββ βββββββββββββββββββββββ β
β β alerts/ β β
β β β βββββββββββββββββββββββββββββββββββββββ β
β β webhook_ β β config_loader.py β β
β β manager.py β β (Pydantic v2 + YAML validation) β β
β β telegram_ β βββββββββββββββββββββββββββββββββββββββ β
β β alerts.py β β
β ββββββββββββββββ βββββββββββββββββββββββββββββββββββββββ β
β β fulcrum2e.py β β
β β (orchestrateur monolithe) β β
β βββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
```
## Structure des fichiers
```
Monitoring/
βββ fulcrum2e.py # Monolithe original (orchestrateur)
βββ fulcrum_config.yml # Configuration principale
βββ config_loader.py # Chargement + validation Pydantic
βββ ARCHITECTURE.md # Ce document
β
βββ collectors/
β βββ __init__.py
β βββ rss_collector.py # Collecte RSS/Atom (feedparser)
β βββ api_collector.py # APIs REST : CISA KEV, ACLED, Ransomware.live
β
βββ analyzers/
β βββ __init__.py
β βββ scoring_engine.py # Scoring rule-based + dΓ©composition explicite
β βββ ioc_extractor.py # Extraction IOC avec filtrage RFC 1918
β βββ correlator.py # SimHash, clusters 72h, timeline, last-run
β
βββ exporters/
β βββ __init__.py
β βββ json_exporter.py # Export JSON structurΓ© (schΓ©ma v3.1)
β
βββ persistence/
β βββ __init__.py
β βββ sqlite_store.py # Persistance SQLite (90j + archivage)
β
βββ alerts/
β βββ __init__.py
β βββ webhook_manager.py # Slack, Discord, Telegram, webhooks gΓ©nΓ©riques
β
βββ tests/
βββ __init__.py
βββ test_ioc_extractor.py
βββ test_scoring_engine.py
βββ test_correlator.py
βββ test_sqlite_store.py
```
## Flux de donnΓ©es
```
Sources RSS/API
β
βΌ
collectors/ βββΊ dicts bruts
β
βΌ
analyzers/scoring_engine.py βββΊ severity, risk_score (dΓ©composΓ©), strat_score
analyzers/ioc_extractor.py βββΊ IOCs filtrΓ©s (sans RFC 1918, avec contexte hashes)
analyzers/correlator.py βββΊ SimHash β dΓ©dup fuzzy β clusters 72h
β
βΌ
persistence/sqlite_store.py βββΊ articles, iocs, clusters, source_stats
β
ββββΊ exporters/ βββΊ HTML / JSON / PDF
ββββΊ alerts/ βββΊ Slack / Discord / Telegram / Webhook
```
## SchΓ©ma SQLite
### Table `articles`
| Colonne | Type | Description |
|---------|------|-------------|
| id | TEXT PK | Hash MD5 identifiant unique |
| simhash | INTEGER | SimHash 64-bit pour dΓ©dup fuzzy |
| title | TEXT | Titre de l'article |
| source | TEXT | Nom de la source |
| published | TEXT | Date ISO 8601 |
| severity | TEXT | FLASH/CRITICAL/HIGH/MEDIUM/WATCH/INFO |
| risk_score | INTEGER | Score de risque 0-100 |
| strat_score | INTEGER | Score stratΓ©gique 0-100 |
| risk_breakdown | TEXT | JSON dΓ©composition du score |
| theatres | TEXT | JSON liste des théÒtres |
| actors | TEXT | JSON liste des acteurs |
### Table `iocs_extracted`
IOCs par article avec rΓ©fΓ©rence FK pour cascade delete.
### Table `correlations_detected`
Clusters d'incidents corrélés (acteur + théÒtre + 72h).
### Table `source_stats`
Statistiques de fiabilitΓ© historique par source.
## Modules en dΓ©tail
### `config_loader.py`
- Validation Pydantic v2 avec schΓ©mas stricts
- Dot-notation pour l'accès (`config.get("collection.timeout")`)
- Fallback `_DictConfig` si Pydantic absent
- Support hot-reload via `ConfigLoader.reload()`
### `analyzers/scoring_engine.py`
- **PondΓ©ration source** : coefficient multiplicateur par source (YAML)
- **Anti-faux-positifs** : blacklist de 20+ phrases contextuelles
- **Anti-inflation CRITICAL** : exige exploit actif OU acteur Γ©tatique confirmΓ©
- **Scoring temporel** : +10 pts (7j)
- **ScoreBreakdown** : dΓ©composition exportable de chaque contribution
### `analyzers/ioc_extractor.py`
- **Filtrage RFC 1918** : 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 + loopback + link-local
- **Hash contextualisation** : accepte MD5/SHA uniquement avec prΓ©fixe (`hash:`, `md5:`, `sha256:`) ou dans un bloc IOC explicite
- **Validation CIDR** : rejette les sous-rΓ©seaux privΓ©s
### `analyzers/correlator.py`
- **SimHash 64-bit** : n-grams 3 caractères sur titre+résumé, sans ML
- **Seuil configurable** : 0.85 par dΓ©faut (YAML: `persistence.simhash_threshold`)
- **Clusters** : mΓͺme acteur + mΓͺme théÒtre + fenΓͺtre 72h
- **Mode `--since last-run`** : `.fulcrum_last_run` timestamp file
### `persistence/sqlite_store.py`
- **WAL mode** pour performances concurrentes
- **Pruning auto** : DELETE articles > 90j, configurable
- **RequΓͺtes** : `query_articles(theatre, actor, severity, days)`
- **Risk evolution** : comparaison stats 7j vs 30j
- **Source stats** : suivi fiabilitΓ© historique
### `collectors/api_collector.py`
- **CISA KEV** : API publique JSON, pas de clΓ© requise
- **ACLED** : nΓ©cessite clΓ© API + email (gratuit recherche)
- **Ransomware.live** : API publique JSON
### `alerts/webhook_manager.py`
- Filtrage par sΓ©vΓ©ritΓ© (`critical_only`) et score minimum
- Payloads natifs Slack Block Kit, Discord Embed, Telegram HTML
- Rate limiting intΓ©grΓ© (`delay` entre envois)
## Contraintes architecturales
- β Aucune dΓ©pendance IA/LLM/NLP (Ollama, transformers, embeddings, classification ML)
- β
Tout le raisonnement est rule-based et algorithmique
- β
SimHash : locality-sensitive hashing dΓ©terministe, pas de ML
- β
Scoring : somme pondérée de règles explicites
- β
IOC contextualisation : regex + marqueurs syntaxiques
## DΓ©pendances Python
### Obligatoires
```
feedparser
requests
pyyaml
```
### Optionnelles (dΓ©gradation gracieuse)
```
pydantic>=2.0 # Validation config (fallback dict)
rich # Interface CLI colorΓ©e
beautifulsoup4 # Scraping HTML
lxml # Parser HTML/XML
pandas # Exports CSV/analytics
plotly # Charts dashboard
redis # Cache distribuΓ© (fallback mΓ©moire)
```
### Nouvelles (v3.1)
```
pydantic>=2.0 # config_loader.py
# sqlite3 # stdlib β pas d'installation requise
```
## Migration depuis fulcrum2e.py (monolithe)
1. Installer les nouvelles dΓ©pendances : `pip install pydantic>=2.0`
2. Les nouveaux modules sont **opt-in** : `fulcrum2e.py` fonctionne tel quel
3. Pour utiliser le scoring amΓ©liorΓ© :
```python
from analyzers.scoring_engine import ScoringEngine
engine = ScoringEngine(source_weights=config.get("intelligence.scoring.source_reliability"))
```
4. Pour la dΓ©duplication SimHash :
```python
from analyzers.correlator import FuzzyDeduplicator
dedup = FuzzyDeduplicator(threshold=0.85)
unique = dedup.deduplicate(articles)
```
5. Pour la persistance SQLite :
```python
from persistence.sqlite_store import SQLiteStore
store = SQLiteStore("fulcrum.db")
store.upsert_article(article.to_dict())
```