4.7.7 Tester l'expiration de session (OTG-SESS-007)

Sommaire
Dans cette phase, les testeurs vont vérifier que l'application déconnecte automatiquement une utilisateur qui a été inactif depuis un certain temps, garantissant ainsi qu'il n'est pas possible de "réutiliser" la même session, et qu'aucune donnée sensible ne reste stockée dans le cache du navigateur.

Toutes les applications devraient implémenter une limite d'inactivité sur les sessions. Cette limite définit le délai pendant lequel une session restera active alors qu'il n'y a pas d'activité de l'utilisateur, et la session sera fermée et invalidée passé ce délai d'inactivité après la dernière requête HTTP reçue par l’application web pour une session donnée. La limite la plus appropriée doit être un compromis entre la sécurité (limite plus courte) et le confort d'utilisation (limite plus longue), et dépend fortement du niveau de sensibilité des données manipulées par l'application. Par exemple, une limite de 60 minutes peut être acceptable pour un forum public, mais pas pour une application bancaire (dans ce cas, un maximum de 15 minutes est recommandé). Dans tous les cas, une application qui ne force pas de déconnexion en cas d'inactivité doit être considérée comme non sécurisée, sauf si un tel comportement est spécifiquement requis fonctionnellement.

L'expiration de session limite les chances qu'un attaquant puisse deviner et utiliser un identifiant de session appartenant à un autre utilisateur, et dans certaines circonstances, peut protéger les ordinateurs publics contre la réutilisation de session. Cependant, si l'attaquant peut détourner une session donnée, le délai d'expiration ne pourra rien pour limiter ses actions, puisqu'il peut générer périodiquement de l'activité sur la session afin de la garder active plus longtemps.

La gestion des expirations de sessions doit être fait côté serveur. si certaines données contrôlées par le client sont utilisées pour imposer l'expiration de session, par exemple les valeurs de cookie ou autres paramètres client pour mesurer des références temporelles (par exemple, le nombre de minutes depuis la connexion), un attaquant pourrait manipuler ces données pour étendre la durée d'une session. L'application doit donc suivre la durée d'inactivité côté serveur et, une fois la limite atteinte, invalider automatiquement la session courante de l'utilisateur puis supprimer toutes les données stockées côté client.

Ces deux actions doivent être implémentées avec précaution, afin de d'éviter d'introduire des faiblesses qui pourraient être exploitée par un attaquant pour obtenir un accès si l'utilisateur oublie de se déconnecter de l'application. Plus précisément, comme pour la fonction de déconnexion, il est important de s'assurer que tous les jetons de session (par exemple les cookies) sont correctement détruits ou rendus inutilisables, et que des contrôles corrects sont appliqués côté serveur pour empêcher leur réutilisation. Si de telles actions ne sont pas appliquées correctement, un attaquant pourrait rejouer ces jetons de session afin de "ressuciter" la session d'un utilisateur légitime et usurper son identité (cette attaque est communément nommée 'cookie replay' : rejeu de cookie). Le fait que l'attaquant doit être capable d'accéder à ces jetons de session (stockés sur le PC de la victime) est bien sûr un facteur atténuant, mais dans certains cas, cela n'a rien de particulièrement difficile.

Le scénario le plus courrant pour ce genre d'attaques est l'utilisation d'un ordinateur public pour accéder à des informations privées (par exemple : webmail, compte bancaire en ligne). Si l'utilisateur laisse l'ordinateur sans se déconnecter explicitement, et qu'aucune expiration de session n'est implémentée par l'application, alors un attaquant peut accéder au même compte en simplement appuyant sur le bouton "retour" du navigateur.

Test en boite noire
La même approche que dans la section 4.7.6 Tester les fonctionnalités de déconnexion (OTG-SESS-006) peut être utilisée pour mesurer les déconnexions par expiration de délai.

La méthodologie de test est très similaire. D'abord le testeur doit vérifier qu'un délai d'expiration existe, par exemple en se connectant et en attendant que la déconnexion automatique soit déclenchée. Comme pour la fonction de déconnexion, après expiration du délai, tous les jetons de session doivent être détruits ou rendus inutilisables.

Ensuite, si un délai d'expiration est configuré, le testeur doit comprendre si il est imposé par le client ou par le serveur (ou par les deux). Si le cookie de session est non-persistant (ou, plus généralement, si le cookie de session ne contient pas de données temporelles), le testeur peut considérer que l'expiration du délai est imposée par le serveur. Si le cookie de session contient des données liées au temps (par exemple heure de connexion, date d'expiration d'un cookie persistant), alors il est possible que le client soit impliqué dans la gestion de l'expiration du délai. Dans ce cas, le testeur peut essayer de modifier le cookie (s'il n'est pas protégé cryptographiquement) et voir ce qui arrive à la session. Par exemple, le testeur peut configurer une date d'expiration éloignée dans le futur et regarder si la session a pu être prolongée.

En règle générale, tout devrait être vérifié côté serveur, et il ne devrait pas être possible d'accéder à nouveau à l'application en restaurant les anciennes valeurs de cookies de session.

Test en boite grise
Le testeur doit vérifier que :
 * La fonction de déconnexion détruit tous les jetons de session, ou au moins les rend inutilisables.
 * Le serveur vérifie correctement l'état des sessions, empêchant un attaquant de rejouer des identifiants de sessions détruits.
 * un délai d'expiration est imposé correctement par le serveur. Si le serveur utilise un délai d'expiration qui est lu depuis un jeton de session envoyé par le client (ce qui n'est pas conseillé), alors ce jeton doit être cryptographiquement protégé contre les manipulations.

A noter que le plus important pour l'application est d'invalider les session côté serveur. Généralement cela signifie que le code doit invoquer les méthodes appropriées, par exemple HttpSession.invalidate en Java et Session.abandon en .NET. Supprimer les cookies du navigateur est conseillé, mais pas strictement nécessaire; puisque si la session est conrrectement invalidée sur le serveur, la possession des cookies n'aidera pas l'attaquant.