Sécurité & transparence
1. Audit du 28 mai 2026 — synthèse
Audit multi-domaines (sécurité applicative, performance + base de données, accessibilité / UX, qualité de code) mené sur l'intégralité du code source. 53 constats agrégés, traités par ordre de criticité.
Statut de traitement (mis à jour le 28 mai 2026)
| Catégorie | Trouvé | Corrigé | Planifié / différé |
|---|---|---|---|
| Sécurité applicative | 15 | P0 + P1 + P2 magic-bytes 4 routes + sameSite Strict + lockout PG + CSP nonces actifs ('unsafe-inline' retiré) ✓ tout | Surveillance continue, audit RGAA tiers Q3 2026 |
| Performance + base de données | 11 | P0 N+1 + P1 indexes/pagination/UPSERT + audit_log + paiements indexes ✓ tout | Partitioning audit_log si volume (P3) |
| UI / UX / accessibilité | 15 | P0 clavier calendrier + P1 hamburger/modal/contraste + P2 skip-links/inputmode/footer ✓ majorité | Audit RGAA AA tiers Q3 2026 |
| Architecture / qualité de code | 12 | P1 transactions workflow critique + dead code + catch filtré ✓ | Découpage routes (P2), tests unitaires (P2) |
Les 5 constats P0 ont été corrigés et déployés sous 24 heures. Les 17 P1 ont été traités dans la foulée. La majorité des P2/P3 a été enchaînée le même jour ; le reste (tests unitaires, partitioning, CSP nonces, audit tiers) est planifié. Aucun finding ne concernait une fuite de données existante.
2. Catégories des constats
Pour rester transparents sans rendre nos défauts exploitables, voici les familles de vulnérabilités identifiées et l'état de traitement — sans nom de fichier, ni payload, ni endpoint.
- Injection HTML dans des emails sortants (2 P0) — corrigés. Les champs renseignés par les citoyens étaient insérés dans des emails sans échappement systématique. Échappement HTML désormais appliqué à toutes les valeurs.
- Requêtes en escalier (N+1) sur l'état des lieux (2 P0) — corrigés. Le chargement d'un EDL complet pouvait déclencher plus de 200 aller-retours. Réécrit en jointures + traitement parallèle.
- Accessibilité clavier du calendrier de réservation (1 P0) — corrigé. Les cellules cliquables sont désormais de vrais boutons HTML, atteignables au clavier (RGAA 4.1.2 / 13.7).
- Fuites de messages d'erreur internes (P1) — en cours, majorité corrigée. Les réponses 500 renvoyaient parfois le détail d'erreur PostgreSQL. Messages génériques généralisés sur les routes administrateurs et API publique.
- Robustesse du cookie de session (P1) — corrigé. Politique cookie passée de
SameSite=LaxàSameSite=Strict. - Contrôle magic-bytes sur uploads (P1) — en cours. L'import CSV (contacts) et certains uploads d'images vérifient désormais le contenu réel, pas seulement le
Content-Typeclient. - Limitation brute-force monoprocess (P1) — planifié. Le compteur d'échecs de connexion est en mémoire ; sera porté sur PostgreSQL pour résister aux redémarrages et au multi-instance.
- Indexes manquants sur clés étrangères chaudes (P1) — planifié. Migration à pousser sur les tables EDL et zones.
- Atomicité du workflow d'approbation (P1) — en cours. L'approbation d'une demande de réservation devient une transaction unique (BEGIN/COMMIT) pour éviter tout état intermédiaire incohérent.
- Accessibilité fine (contrast, ARIA, focus-trap) (P1-P2) — en cours. Audit RGAA externe planifié au Q3 2026.
3. Pratiques de sécurité en place
3.1 Hébergement et infrastructure
- Hébergement OVHcloud France (Roubaix) — données traitées en Union européenne, conforme au RGPD.
- Isolation par schéma PostgreSQL dédié à chaque commune cliente (multi-tenant fort).
- Sauvegardes PostgreSQL quotidiennes (rétention 30 jours, conforme à
/usr/local/bin/rotate-backups.sh), backup pré-déploiement systématique. - Réplication base de données et HA en cours d'industrialisation.
3.2 Application
- HTTPS strict avec HSTS (365 jours, preload).
- Content-Security-Policy stricte (Stripe / API Adresse / IGN / Leaflet explicitement listés).
- Helmet middleware (en-têtes de durcissement).
- Cookies de session HttpOnly + Secure + SameSite=Strict + nom anti-fixation.
- Rate-limiting par endpoint (login, démos, API publique, contact).
- Sessions stockées en PostgreSQL (révocables côté serveur, pas de JWT côté client).
- FranceConnect Particulier v2 — activation per-tenant via datapass propre à la commune (le datapass mutualisé Wilder Labs D95332 a été refusé par DINUM le 29/05/2026 ; l'architecture per-tenant reste fonctionnelle pour toute mairie ayant obtenu sa propre habilitation).
- Validation OIDC ES256 contre JWKS Géoplateforme ; tokens FC en session serveur, jamais en localStorage.
3.3 Données et confidentialité
- Aucun appel à Google / Amazon / Microsoft pour le traitement des données métier. Stack 100 % souveraine (OVH, IGN, FranceConnect, Brevo SMTP pour emails transactionnels). Les paiements citoyens passent par PayFiP / DGFiP ; Stripe ne sert qu'au paiement de l'abonnement Sallia par la commune.
- Modèles IA d'analyse photo (EDL niveau 2) tournant localement en sidecar (Florence-2) — aucune image n'est envoyée à un service externe.
- Journal d'audit (audit log) horodaté sur toute action sensible (admin, paiements, EDL).
- Politique de confidentialité dédiée et DPO identifié — voir /politique-confidentialite.
- DPIA (analyse d'impact) réalisée — partageable sur demande aux mairies.
4. Signalement de vulnérabilité
Si vous identifiez une vulnérabilité, nous nous engageons à répondre sous 48 heures ouvrées et à vous tenir informé du correctif.
- Adresse : security@wilderlabs.fr (chiffrement PGP sur demande).
- Fichier conforme RFC 9116 : /.well-known/security.txt.
- Cadre : responsible disclosure — pas de poursuite engagée contre une recherche de bonne foi (test sans impact sur des données réelles, signalement avant publication, délai de correctif raisonnable).
5. Audits passés et à venir
- 13 mai 2026 — Audit mobile RGAA AA + audit sécurité niveau 1 (EDL Photo Comparison). Détails dans la documentation.
- 23 mai 2026 — Audit interne (purge tenants démo, isolation cross-tenant renforcée).
- 28 mai 2026 — Audit intégral (cette page).
- Q3 2026 — Audit RGAA AA par cabinet tiers (déclaration partiellement conforme en attendant).
Nous publions ici tout nouvel audit dès qu'il est terminé. Si vous êtes une mairie cliente, le détail technique (rapports complets) est accessible sur demande à contact@sallia.fr sous accord de confidentialité.