Le Mer 31 janvier 2007 13:05, Renaud Morvan a écrit :
Tout n’est pas noir ou blanc, le binding d’une session à une ip est
une alternative à faible cout plutôt efficiente contre le vol de
session / cookie.
Oui, c’est une (demi) solution au vol de session et un (quart de)
paliatif
à la fixation de session. Mais la problématique à éviter c’est le vol de
l’identifiant de session, pas le “comment est-ce que je peux faire pour
éviter qu’il utilise un identifiant de session qu’il a volé”.
Disons que pour avoir souvent souffert de la chose pour des applis mal
concues, je peux vous dire que c’est franchement un problème bloquant
quand les sessions sont codées ainsi.
En plus si on est soigneux en général on a l’ip forwardé dans les
entêtes et on peut toujours passer en mode sans binding quand ce
genre d’utilisateur se log, ou même binder sur l’ip forwardé.
Ah non ! surtout pas. Pour le coup ça reviendrait quasiment à ne faire
aucune vérification. Injecter manuellement une entête X-FORWAREDED-FOR
çame prend quelques secondes, deux minutes à tout casser. Si tu fais ton
check là dessus ça veut dire que ton méchant aura juste à ajouter une
entête pour faire croire qu’il passe par un proxy pour accéder à la
session.
Bref ce n’est pas TRES mal surtout à l’heure ou n’importe qui rajoute
n’importe quel widget js sur son site, les sessions n’ont jamais été
aussi en péril que dans le web actuel.
Franchement, si un tiers que tu ne contrôle pas peut insérer du js sur ta
page, tu as bien plus gênant que les problèmes de session. Celui qui
contrôle le js peut directement te faire agir comme il l’entend, il n’a
pas besoin de te voler ta session et de te l’exploiter à côté.
Les sessions, pour aller rapidement il y a quatre moyens courants de les
voler :
1- y aller à l’aveugle et trouver/prédire un n° de session existant
2- trouver l’id de session dans l’url de ses referer
3- un pb coté client (poste infecté, réseau local écouté, etc.)
4- avoir une faille XSS sur l’appli
Les deux premiers avec un minimum de travail on les écarte et on les
oublie. Le troisième c’est de la responsabilité du client et de toutes
façons s’il en est là on peut contrôler ce qu’il envoit sans même avoir
besoin de son id de session.
Reste le dernier, mais avec les xmlhttprequest qui se développent on peut
le plus souvent là aussi faire faire directement les manipulations qu’on
veut sans passer par le vol de l’identifiant de session. Le problème n’est
plus tellement au niveau de la vérification ip de l’utilisateur de la
session.
Bref, franchement la sécurité en plus, elle est majoritairement virtuelle.
Ca ne veut pas dire qu’elle est inutile, mais elle couvre des cas
suffisament restreints pour être négligeable si les points bloquants sont
concrets (ce qui est le cas ici).
C’est clair que ce n’est pas parfait dans le cas d’un site grand
public à fort traffic avec identification utilisateur mais est-ce
pire qu’un site full js, ou sans support de win98, ou …
Maintenant c’est clair que ca n’a de sens que dans un environnement qui
le mérite, pas pour un système de bookmark par exemple.
A la limite ça me parait pire qu’un site en full js ou sans support de
win98, oui. Parce que ça filtre une catégorie de personnes importante (en
qualité et en quantité).
Le problème c’est la définition du “environnement qui le mérite”. La
distinction ne peux pas se faire avec simplement un “application qui
mérite une grande sécurité et qui est complexe”. Moi je préfère me voir
refuser l’accès à un système de bookmark qu’au site de ma banque. Du coup
la comparaison d’ip stricte je l’accepte sur le site de bookmark mais
pas
sur l’appli bancaire.
Une autre alternative plus simple est de loger l’utilisateur pour chaque
ip de demander à l’utilisateur de se logguer à chaque fois qu’il
change d’ip sans pour autant perdre l’authentification sur les autres
ips car dans les fait on est rarement load balancé sur plus de 2 ou 3
proxy.
Ca c’est une bonne solution, je l’avoue, et en plus elle ne coûte pas
trèscher. Malheureusement franchement je ne l’ai jamais vu mise en oeuvre.
–
Éric Daspet
http://eric.daspet.name/