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())
   ```