GeoLeaf Core — Security Guide
Version : v2.0.0 Date : 28 mars 2026
Guide destiné aux consommateurs de
@geoleaf/core. Il couvre les directives CSP requises, l'architecture de sécurité et le processus de divulgation responsable.
1. Content Security Policy (CSP) recommandée
GeoLeaf dépend de MapLibre GL JS (WebGL, workers) et de ressources cartographiques externes. La CSP minimale recommandée est :
Content-Security-Policy:
default-src 'self';
script-src 'self';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
connect-src 'self' https:;
worker-src 'self' blob:;
font-src 'self' https:;
style-src 'unsafe-inline'est requis par MapLibre GL JS qui injecte ses styles via<style>au runtime. Ce comportement est délibéré côté MapLibre et ne peut pas être évité sans patcher la bibliothèque.
worker-src blob:est requis pour les Web Workers MapLibre (décodage tiles, parsing GeoJSON).
2. Architecture sécurité de GeoLeaf Core
GeoLeaf implémente plusieurs couches de protection indépendantes :
| Couche | Module | Fonctions clés |
|---|---|---|
| Protection XSS | security/index.ts | escapeHtml(), escapeAttribute(), sanitizeHTML(), sanitizeSvgContent() |
| Protection CSRF | security/csrf-token.ts | Génération token (32 bytes crypto-random), rotation auto, cookie Secure; SameSite=Strict |
| Sécurité DOM | utils/dom-security.ts | DOMSecurity.setTextContent(), DOMSecurity.setSafeHTML() — aucun innerHTML direct |
| Validation entrées | validators/ | Whitelist protocoles URL (https:, http:, data:image/*), bounds coordonnées, structure GeoJSON |
| Sécurité fetch | utils/fetch-helper.ts | Validation URL + rate limiting (50 req/10s/domaine) |
| Sanitisation erreurs | errors/index.ts | sanitizeErrorMessage() — échappe HTML dans les messages d'erreur |
| Protection prototype | security/index.ts | _safeAssign() bloque __proto__, constructor, prototype |
Vecteurs couverts (résumé)
- Injection DOM : 12 vecteurs identifiés (popup POI, tooltip, labels, résultats search, etc.) — tous sanitisés via
escapeHtml()ouDOMSecurity.* - Injection URL : 7 vecteurs (champs
url,website,image, permalink lat/lng/zoom) — validés viavalidateUrl()+validateCoordinates() - Prototype pollution : 4 vecteurs (profil JSON config, propriétés POI, GeoJSON features, permalink compact) — bloqués via
_safeAssign()
Pour l'inventaire complet avec fichiers source et tests, voir security/SECURITY_CONTRACT.md.
3. CSRF — note breaking change v2.0.0
La méthode CSRFToken.setSecureCookie() a secure: true par défaut depuis v2.0.0.
Sur un déploiement HTTP uniquement (développement local, intranets), cela génère un avertissement console mais n'empêche pas le fonctionnement. Pour supprimer l'avertissement :
CSRFToken.setSecureCookie("my-cookie", value, { secure: false });4. Limitations connues
| Limitation | Raison | Mitigation |
|---|---|---|
data: URLs autorisées pour les images | Profils POI supportent les icônes base64 | Filtrage MIME strict (image/* uniquement via _validateDataUrl()) |
http: autorisé par défaut dans validateUrl() | Contextes non-HTTPS (dev, intranet) | Passer { requireHttps: true } pour forcer HTTPS |
| Service Worker non authentifié | Hors périmètre de la bibliothèque | Implémenter l'auth SW côté applicatif |
5. Divulgation responsable
Ne pas reporter les vulnérabilités via les issues publiques GitHub.
Contact
| security@geoleaf.dev | |
| Accusé de réception | Sous 48h |
| Triage initial | Sous 5 jours |
| Correctif ou contournement | Sous 30 jours |
| Divulgation publique | Après publication du correctif |
Nous suivons un modèle de divulgation coordonnée. Merci de nous laisser le temps d'adresser la vulnérabilité avant toute publication.
Périmètre couvert
In scope : XSS dans le module sécurité, contournement CSRF, prototype pollution, injection HTML unsafe via le DOM, contournement de validation URL, vulnérabilités de dépendances avec chemin d'exploitation direct.
Out of scope : vulnérabilités dans MapLibre GL JS ou autres dépendances (à reporter à ces projets directement), accès physique, ingénierie sociale, versions non supportées (< 2.0), DoS.
6. Références
| Document | Description |
|---|---|
| security/GeoLeaf_Security_README.md | API complète du module sécurité (signatures, exemples) |
| security/SECURITY_CONTRACT.md | Inventaire exhaustif des vecteurs d'injection et tests associés |
| packages/core/SECURITY.md | Security policy officielle (responsible disclosure) |
