Cookie de session compromis
Si un cookie de session est compromis, une durée de session plus longue donne effectivement à l'attaquant plus de temps pour exploiter la session active. Voici pourquoi cela se produit et comment y remédier :
- Session Hijacking (Détournement de session) : Si un attaquant parvient à intercepter ou voler le cookie de session (par exemple, via une attaque Man-in-the-Middle, un XSS ou une fuite côté client), il peut utiliser ce cookie pour se faire passer pour l'utilisateur légitime. Une session active plus longue signifie que l'attaquant peut accéder aux ressources de l'utilisateur sans avoir à se ré-authentifier.
- Durée de vie prolongée : Si la session est configurée pour durer plusieurs heures ou même jours, cela augmente la fenêtre d'exploitation. Une session courte limite le temps disponible pour que l'attaquant utilise le cookie compromis.
- Absence de validation continue : Une session trop longue combinée à l'absence de vérification côté serveur (comme une validation du contexte de l'utilisateur, IP ou appareil) peut rendre l'attaque plus facile.
Mesures de protection contre l'exploitation des cookies de session en ASP.NET
- Limiter la durée de la session : Réduisez la durée des sessions pour minimiser le temps d'utilisation d'un cookie volé :
- Marquer les cookies comme sécurisés : Activez les attributs HttpOnly et Secure pour protéger les cookies :
- HttpOnly : Empêche l'accès aux cookies via JavaScript, ce qui réduit les risques liés aux attaques XSS.
- Secure : Assure que le cookie est transmis uniquement via des connexions chiffrées (HTTPS).
- Activer SameSite pour les cookies : Configurez l'attribut SameSite pour empêcher que les cookies soient envoyés lors de requêtes cross-site, ce qui bloque les attaques CSRF :
- <system.web>
- <httpCookies sameSite="Strict" />
- </system.web>
- Régénérer les cookies après une authentification sensible : Par exemple, régénérez l'ID de session après une connexion réussie :
- Session.Abandon();
- SessionIDManager manager = new SessionIDManager();
- manager.RemoveSessionID(HttpContext.Current);
- manager.CreateSessionID(HttpContext.Current);
- Activer la protection contre le vol de session : Liez la session à l'IP ou au User-Agent de l'utilisateur pour détecter les anomalies :
- var userIp = HttpContext.Current.Request.UserHostAddress;
- var userAgent = HttpContext.Current.Request.UserAgent;
- if (Session["UserIp"] == null) {
- Session["UserIp"] = userIp;
- Session["UserAgent"] = userAgent;
- } else if (Session["UserIp"].ToString() != userIp || Session["UserAgent"].ToString() != userAgent) {
- Session.Abandon(); // Déconnecter l'utilisateur
- }
- Utiliser des jetons CSRF : Implémentez des jetons anti-CSRF pour protéger les requêtes sensibles, même si un cookie est compromis.
- Suivre les anomalies : Implémentez une journalisation des connexions avec les cookies pour détecter des connexions suspectes provenant d'autres emplacements.
<configuration>
<system.web>
<sessionState timeout="20" />
</system.web>
</configuration>
Exemple dans le fichier web.config :
<system.web> <httpCookies httpOnlyCookies="true" requireSSL="true" /> </system.web> |
Mesures de protection contre l'exploitation des cookies de session en Fano Framework
Voici les principales mesures de protection contre l'exploitation des cookies de session et les mécanismes que vous pouvez mettre en place manuellement dans le contexte Fano Framework en Free Pascal :
- Activation de l'attribut HttpOnly : L'attribut HttpOnly empêche les cookies de session d'être accessibles via JavaScript, réduisant les risques d'attaques XSS (Cross-Site Scripting). Dans le Fano Framework, vous pouvez configurer cet attribut lorsque vous définissez un cookie de session :
- response.setCookie('SESSION_ID', sessionId, [
- 'HttpOnly'
- ]);
- Transmission sécurisée (HTTPS uniquement) : Pour empêcher qu'un cookie soit transmis en clair sur des connexions non sécurisées, l'attribut Secure
doit être activé. Cela garantit que le cookie est transmis uniquement via HTTPS. Exemple dans le Fano Framework :
- response.setCookie('SESSION_ID', sessionId, [
- 'Secure',
- 'HttpOnly'
- ]);
Assurez-vous que votre serveur Web (comme Nginx ou Apache) est configuré pour forcer l'utilisation de HTTPS.
- Limitation des requêtes intersites (SameSite) : L'attribut SameSite protège les cookies contre les attaques CSRF (Cross-Site Request Forgery) en empêchant leur inclusion dans des requêtes provenant d'autres sites. Configuration dans le Fano Framework :
- response.setCookie('SESSION_ID', sessionId, [
- 'SameSite=Strict'
- ]);
- Rotation des cookies de session : Pour minimiser l'impact d'un cookie de session volé, il est recommandé de régénérer l'identifiant de session après des actions sensibles (comme une authentification ou une élévation de privilèges). Implémentation dans le Fano Framework :
- Détruisez la session existante.
- Créez un nouveau cookie avec un nouvel identifiant.
- sessionManager.destroySession(sessionId);
- newSessionId := sessionManager.createNewSession();
- response.setCookie('SESSION_ID', newSessionId, [
- 'HttpOnly',
- 'Secure'
- ]);
- Réduction de la durée de vie des sessions : Fixer une durée de vie raisonnable pour les cookies limite le temps disponible pour qu'un attaquant exploite un cookie volé. Exemple dans le Fano Framework (expiration après 30 minutes) :
- response.setCookie('SESSION_ID', sessionId, [
- 'HttpOnly',
- 'Secure',
- 'Max-Age=1800' // 1800 secondes = 30 minutes
- ]);
- Validation des sessions côté serveur : Les sessions doivent être validées côté serveur pour éviter les détournements de session. Utilisez un gestionnaire de sessions (par exemple, un stockage Redis ou une base de données) pour vérifier si le cookie de session correspond à une session valide. Implémentation simplifiée dans le Fano Framework :
- Limitation de l'accès aux cookies aux domaines et chemins spécifiques : Réduisez l'accès aux cookies uniquement au domaine et au chemin nécessaires.
Exemple de configuration de cookie pour un chemin spécifique :
- response.setCookie('SESSION_ID', sessionId, [
- 'Path=/secure/',
- 'HttpOnly',
- 'Secure'
- ]);
- Jetons anti-CSRF : Même avec l'attribut SameSite, il est recommandé d'utiliser des jetons anti-CSRF pour valider les requêtes sensibles.
Bien que le Fano Framework n'implémente pas directement un système de jetons anti-CSRF, vous pouvez en ajouter manuellement :
- Générer un jeton unique pour chaque session.
- Inclure ce jeton dans les formulaires ou les requêtes via des champs cachés.
- Vérifier le jeton côté serveur avant d'exécuter une requête.
- Journalisation des activités suspectes : Configurez la journalisation pour détecter des comportements inhabituels liés aux sessions, comme plusieurs connexions avec le même identifiant depuis des adresses IP différentes.
Les options possibles pour SameSite sont :
Option | Description |
---|---|
Strict | Bloque complètement l'accès aux cookies pour des requêtes cross-site. |
Lax | Permet les cookies pour certaines requêtes sécurisées (comme les requêtes GET depuis un lien). |
None | Permet les cookies pour toutes les requêtes cross-site (peu sécurisé). |
Résumé des mesures dans le Fano Framework pour Free Pascal :
Mesure | Description | Exemple dans le Fano Framework |
---|---|---|
HttpOnly | Empêche l'accès aux cookies via JavaScript | setCookie(..., ['HttpOnly']) |
Secure | Cookies transmis uniquement via HTTPS | setCookie(..., ['Secure']) |
SameSite | Limite l'accès cross-site aux cookies | setCookie(..., ['SameSite=Strict']) |
Rotation des sessions | Régénère les identifiants après actions sensibles | destroySession() et createNewSession() |
Expiration des sessions | Réduit la durée de vie des cookies | setCookie(..., ['Max-Age=1800']) |
Validation côté serveur | Vérifie l'état de la session avant toute action | sessionManager.isValidSession() |
Domaines et chemins | Limite l'accès aux cookies à des parties spécifiques | setCookie(..., ['Path=/secure/']) |
Anti-CSRF | Valide les requêtes sensibles avec des jetons | Jeton manuel dans les formulaires |
Dernière mise à jour : Mercredi, le 27 novembre 2019