# Modèle de menace — EDCF 52 · Bilan d'activité

> Ce document n'est pas une homologation. Il décrit les menaces envisagées, les mesures
> implémentées et les **risques résiduels**, pour servir de base à une analyse de risques
> (EBIOS RM ou équivalent) menée avec la DSI et les référents sécurité.

## 1. Périmètre

**Actifs** : chiffres hebdomadaires de l'EDCF 52 et leurs observations (données métier, potentiellement
sensibles), historique des versions, journal d'audit, fichiers importés (photos de bilans, tableurs, PDF),
comptes et secrets d'authentification, sauvegardes.

**Acteurs** : gestionnaires (administrateurs), lecteurs, administrateur système, attaquant externe
anonyme (Internet), ancien utilisateur, utilisateur légitime malveillant ou piégé (fichier reçu).

**Surface exposée** : `https://edcf.jeandon.fr` (Apache → API FastAPI sur 127.0.0.1), base PostgreSQL
locale (non exposée), répertoire de stockage `/var/lib/edcf` (hors racine web), sauvegardes.

**Hypothèses** : le système d'exploitation est maintenu à jour ; l'administrateur système est de
confiance ; les postes clients ne sont pas compromis.

## 2. Menaces, mesures, risques résiduels

| # | Menace | Mesures en place | Risque résiduel / à faire |
|---|---|---|---|
| T1 | **Vol d'identifiants** (hameçonnage, réutilisation) | Argon2id ; MFA TOTP obligatoire pour les gestionnaires ; politique de mot de passe ; limitation des tentatives par compte et par IP avec délai progressif et verrouillage ; journalisation des échecs ; message unique anti-énumération. | Le TOTP n'est pas résistant au hameçonnage en temps réel → envisager WebAuthn / carte agent en production. MFA facultatif pour les lecteurs (configurable). |
| T2 | **Vol de session** (XSS, poste partagé) | Cookie `HttpOnly; Secure; SameSite=Strict`, jeton 256 bits, seul son hash est stocké ; expiration d'inactivité (30 min) et absolue (12 h) ; rotation à la connexion ; révocation unitaire/globale ; CSP stricte sans `unsafe-inline` pour les scripts ; aucun jeton dans `localStorage`. | Un poste compromis peut utiliser une session ouverte. Bouton « Déconnecter toutes mes sessions ». |
| T3 | **Élévation de privilèges** | RBAC côté serveur, permission explicite par route, refus par défaut ; contrôle d'appartenance des objets ; tests automatisés « lecteur → route gestionnaire ». Le rôle ne vient jamais du client. | Un gestionnaire peut créer d'autres comptes lecteurs (prévu par le cahier des charges) mais pas de gestionnaire sans la commande CLI ou un autre gestionnaire. |
| T4 | **Ancien utilisateur encore actif** | Désactivation immédiate (sessions révoquées dans la même transaction) ; date de dernière connexion visible ; revue périodique recommandée (checklist). | Dépend d'une procédure humaine de départ (à intégrer au processus RH). |
| T5 | **Import malveillant** (macro, XXE, zip bomb, polyglotte, PDF piégé, image géante) | Type réel par signature + structure ; extension concordante ; taille max ; quarantaine hors web, droits 0600, noms aléatoires ; inspection ZIP (entrées, taille décompressée, ratio, chemins) ; `DOCTYPE`/`ENTITY` refusés ; macros/objets incorporés/liens externes refusés ou signalés ; `.xls` refusé ; images réencodées + limite de pixels ; PDF avec JS/Launch/EmbeddedFile refusé ; analyse dans un sous-processus limité (mémoire, CPU, fichiers, délai, env vidé, sans accès base) ; ClamAV via clamd si disponible. | **ClamAV indisponible sur le VPS de démonstration** (mode `optional`, signalé). Vulnérabilité 0-day dans Pillow/Poppler/Tesseract : atténuée par l'isolement et les limites, pas éliminée → conteneur dédié recommandé en production. |
| T6 | **Fuite de données** | Accès authentifié à toutes les données ; aucune donnée vers un service externe (OCR et PDF locaux, aucune police/CDN/traceur externe, CSP `connect-src 'self'`) ; fichiers importés non servis tels quels ; exports journalisés ; en-têtes `no-store` sur l'API. | **Le domaine est public** : un simple mot de passe ne suffit pas pour des données sensibles. Recommandation : VPN / réseau interne / filtrage IP (gabarit Apache fourni). Sauvegardes à chiffrer (voir T11). |
| T7 | **Altération de données** | Transactions ; révision optimiste (409 en cas de conflit) ; bilans validés verrouillés ; versions immuables (déclencheur PostgreSQL) avec SHA-256 ; historique champ par champ ; journal d'audit chaîné et en ajout seul ; rôle base `edcf_app` sans droits DDL ni UPDATE/DELETE sur l'audit et les versions. | Un administrateur système avec accès `postgres` peut tout modifier ; la chaîne d'audit rend l'altération **détectable** (`edcf verify-audit`), pas impossible. |
| T8 | **Suppression accidentelle** | Archivage plutôt que suppression ; confirmations pour toutes les actions destructives ; « Effacer le brouillon » ne touche jamais une version validée ; annulation complète d'un import (instantané avant/après) ; sauvegardes quotidiennes. | — |
| T9 | **Injection** (SQL, XSS, formules, en-têtes) | Requêtes paramétrées (SQLAlchemy) ; validation Pydantic stricte ; échappement automatique (Preact, Jinja2) ; CSP ; neutralisation des formules dans XLSX/ODS/CSV ; noms de fichiers assainis ; `Content-Disposition` encodé RFC 5987. | — |
| T10 | **Mauvaise configuration** | Valeurs sûres par défaut ; démarrage refusé si `EDCF_SECRET_KEY` absente/courte ; pas de trace d'erreur en production ; documentation OpenAPI désactivée hors développement ; checklist de mise en production ; en-têtes HSTS, nosniff, frame-ancestors, Referrer-Policy, Permissions-Policy. | Revue de configuration humaine indispensable avant production. |
| T11 | **Sauvegarde compromise** | Script de sauvegarde chiffrant avec `age` ou GPG (clé publique seule sur le serveur) ; droits 0600 ; rétention ; procédure de test de restauration. | La clé privée de déchiffrement doit être conservée hors du serveur. |
| T12 | **Dépendance vulnérable** | Versions figées ; `pip-audit` et `npm audit` dans la CI ; SBOM CycloneDX générable ; peu de dépendances front. | Veille de sécurité à organiser (mises à jour mensuelles minimum). |
| T13 | **OCR malveillant / épuisement de ressources** | Une tâche lourde à la fois par worker ; délais (OCR 90 s, PDF 60 s) ; `RLIMIT_AS` 768 Mo, `RLIMIT_CPU`, `RLIMIT_FSIZE` ; limite de pages/pixels ; quota d'imports par utilisateur et par heure ; `MemoryMax` systemd ; l'interface ne bloque jamais (traitement asynchrone). | Un afflux d'imports légitimes peut retarder la file (pas de perte). |
| T14 | **Exposition accidentelle sur Internet** | Bandeau « démonstration » ; refus de charger les données fictives en production ; gabarit de filtrage IP ; `robots.txt` et `X-Robots-Tag: noindex` ; aucune inscription publique. | Tant que le domaine reste public, la protection repose sur l'authentification forte. **Ne pas y saisir de données réelles avant validation.** |
| T15 | **Déni de service applicatif** | Limitation des tentatives de connexion et des imports ; taille de requête bornée côté Apache et API. | Pas de protection volumétrique réseau (hors périmètre applicatif). |

## 3. Données traitées

Les chiffres hebdomadaires sont agrégés et ne contiennent normalement **aucune donnée nominative**.
Les **observations** et les **photos importées** peuvent en contenir (nom, plaque, lieu). Mesures :
rappel dans l'interface de ne pas saisir de données personnelles inutiles ; politique de conservation
configurable des fichiers importés (30 jours par défaut, seules les métadonnées et l'empreinte sont
gardées ensuite) ; à valider avec le DPD/RGPD de l'unité.

## 4. Points à valider par la DSI / les référents sécurité

1. Hébergement cible (réseau interne, VPN, ou filtrage IP) et sensibilité des données.
2. Installation de ClamAV (mode `required`).
3. Facteur d'authentification (TOTP suffisant ? carte agent / WebAuthn ?).
4. Durées de conservation (imports, journaux, sauvegardes).
5. Lieu et chiffrement des sauvegardes, détenteur de la clé.
6. Mention de diffusion à faire figurer sur le document.
