Skip to content

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 :

http
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 :

CoucheModuleFonctions clés
Protection XSSsecurity/index.tsescapeHtml(), escapeAttribute(), sanitizeHTML(), sanitizeSvgContent()
Protection CSRFsecurity/csrf-token.tsGénération token (32 bytes crypto-random), rotation auto, cookie Secure; SameSite=Strict
Sécurité DOMutils/dom-security.tsDOMSecurity.setTextContent(), DOMSecurity.setSafeHTML() — aucun innerHTML direct
Validation entréesvalidators/Whitelist protocoles URL (https:, http:, data:image/*), bounds coordonnées, structure GeoJSON
Sécurité fetchutils/fetch-helper.tsValidation URL + rate limiting (50 req/10s/domaine)
Sanitisation erreurserrors/index.tssanitizeErrorMessage() — échappe HTML dans les messages d'erreur
Protection prototypesecurity/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() ou DOMSecurity.*
  • Injection URL : 7 vecteurs (champs url, website, image, permalink lat/lng/zoom) — validés via validateUrl() + 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 :

typescript
CSRFToken.setSecureCookie("my-cookie", value, { secure: false });

4. Limitations connues

LimitationRaisonMitigation
data: URLs autorisées pour les imagesProfils POI supportent les icônes base64Filtrage 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èqueImplémenter l'auth SW côté applicatif

5. Divulgation responsable

Ne pas reporter les vulnérabilités via les issues publiques GitHub.

Contact

Emailsecurity@geoleaf.dev
Accusé de réceptionSous 48h
Triage initialSous 5 jours
Correctif ou contournementSous 30 jours
Divulgation publiqueAprè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

DocumentDescription
security/GeoLeaf_Security_README.mdAPI complète du module sécurité (signatures, exemples)
security/SECURITY_CONTRACT.mdInventaire exhaustif des vecteurs d'injection et tests associés
packages/core/SECURITY.mdSecurity policy officielle (responsible disclosure)

Released under the MIT License.