Comment ASP.NET ou ASP.NET MVC être protégé contre les attaques de cookies de domaine connexes?
le attaque de cookie de domaine connexe (plus d'informations) permet aux machines dans le même domaine DNS d'ajouter des cookies supplémentaires qui seront également envoyés à d'autres ordinateurs dans le même domaine.
cela peut causer des problèmes avec l'authentification, ou au pire être un composant dans une attaque d'adjoint confuse.
Question
Comment puis-je protéger ASP.NET ou ASP.NET MVC de ce type d'attaque?
Un possible scénario d'attaque
- je me connecte à une application web" sécurisée
- je obtenir les informations d'identification pour mon compte
- j'inciter l'utilisateur à visiter mon site sur le même domaine DNS
- j'ai insérer le cookie (de mon creds)
- l'utilisateur retourne à votre application.
- les deux cookies (ou un surimprimé) est envoyé au serveur
- L'utilisateur fait des choses sous mon compte
C'est un exemple simplifié, mais l'idée peut être portée autre style d'attaques, Je ne fais que choisir le scénario qui ne semble pas"trop mauvais".
une idée de la façon dont il peut" devenir mauvais " est si c'était l'étape 1 d'une attaque en deux étapes. Supposons que l'utilisateur a téléchargé un mauvais fichier qui était accessible uniquement dans son compte; de l'autre utilisateur alors involontairement téléchargements fichier, exécutant n'importe quel code exécutable qui est là.
il y a une tonne d'autres scénarios possibles... plutôt que de tous les énumérer ici, j'essaie de trouver comment protéger mon serveur de ce type d'attaque.
9 réponses
Cookies Liés À Un Canal
le RFC proposé ci-dessous provient d'un employé de Google et décrit une façon pour les Clients d'utiliser un certificat de navigateur auto-signé (n'exigeant donc pas de "pop-up" confus pour l'utilisateur final) qui peut également aborder la question de la sécurité des cookies connu sous le nom de "Cookies de domaine liés "
ce qui suit est un extrait de http://www.browserauth.net / , une section de la RFC, certains des commentaires intéressants, et quelques critiques sur cette extension.
vue d'ensemble de la chaîne Liée Cookies
une fois que le canal TLS sous-jacent utilise l'authentification du client TLS (avec l'extension TLS-OBC), le serveur peut lier ses cookies au canal TLS en les associant à la clé publique du client, et en s'assurant que les cookies ne sont utilisés que sur les canaux TLS authentifiés avec cette clé publique (client).
cela signifie que si un tel cookie relié à un canal est volé sur la machine d'un client, ce cookie ne pourra pas authentifier une session HTTP vers le serveur depuis d'autres machines. Cela inclut les attaquants de type man-in-the-middle qui s'injectent eux-mêmes dans la connexion entre le client et le serveur, peut-être en incitant les utilisateurs à cliquer via les avertissements de non-concordance des certificats: un tel homme-in-the-middle devra générer sa propre session TLS avec le serveur, qui ne correspondra pas au canal que le biscuit est lié.
Canal De Liaison
c'est au serveur de décider s'il faut lier les cookies aux canaux TLS. Si le client ne supporte pas TLS-OBC , ou si le cookie qu'il est sur le point de définir sera utilisé à travers différentes origines , alors le serveur ne canalisera pas le cookie. Si elle décide de canaliser le cookie, elle devrait l'associer à le client de la clé publique. C'est similaire à RFC 5929, mais au lieu du client liant les données à la clé publique du serveur, dans ce cas, le serveur serait liant les données (le cookie) à la clé publique du client. Le serveur peut le faire soit simplement en stockant, dans une base de données d'arrière-plan, le fait qu'une certaine session HTTP doit être authentifiée avec une certaine clé publique client, soit il peut utiliser la cryptographie appropriée pour encoder dans le cookie elle-même qui TLS client clé publique que cookie est liée à.
dans la figure ci-dessus, le serveur inclut la clé publique du client dans une structure de données cryptographique signée qui inclut également l'id de l'utilisateur authentifié. Lorsque le serveur reçoit le cookie du client, il peut vérifier qu'il a effectivement émis le cookie (en vérifiant la signature sur le cookie), et vérifier que le cookie a été envoyé par l'intermédiaire du corriger le canal (en appariant la clé client TLS avec la clé mentionnée dans le cookie).
À suivre ici.... http://www.browserauth.net/channel-bound-cookies
RFC Snip
TLS Origine Lié aux Certificats RFC Projet
(extrait)
4.3. Durcissement Des Biscuits
One way TLS-OBC peut être utilisé pour renforcer les cookies l'authentification se fait en "liant" les cookies à une connexion à l'origine certificat. Le serveur, lors de l'émission d'un cookie pour un HTTP la séance, associerait le certificat du client lié à l'origine avec la session (soit en encodant des informations sur le certificat malheureusement dans le cookie, ou en associant le certificat avec cookie session par d'autres moyens). De cette façon, si et lorsqu'un cookie est volé à un client, il ne peut pas être utilisé Connexion TLS initialisée par un autre client - le voleur de cookies aurait aussi pour voler la clé privée associée à la certificat du client lié à l'origine, une tâche beaucoup plus difficile surtout quand on suppose l'existence d'une plate-forme de confiance Module ou autre élément de sécurité pouvant stocker le
origine-lié-certificat de la clé privée.
aussi, notez que quelque peu contre-intuitivement, les cookies liés à un canal protègent contre de nombreuses attaques de domaines connexes, même si le client affirme qu'ils sont liés à une portée plus large qu'une origine web.
Imaginez un instant qu'un agent-utilisateur crée un seul certificat auto-signé qu'il utilise comme un certificat client TLS pour toutes les connexions à tous les serveurs (ce n'est pas une bonne idée en termes de vie privée, mais Suivez-moi pour cette expérience de pensée). Les serveurs installent ensuite des cookies sur leurs domaines de premier niveau respectifs, mais les lient par canal au seul et unique client cert de l'agent utilisateur.
Alors, disons qu'une application app.heroku.com définit un (canal) pour les cookies sur mon navigateur for domain .heroku.com, and that there is an attacker on attacker.heroku.com. Une attaque qui pourrait nous inquiéter est que l'attaquant récolte simplement le .heroku.com cookie de mon navigateur en m'incitant à attacker.heroku.com. Ils ne seront pas en mesure de réellement utiliser le cookie, cependant, parce que le cookie est canal-lié à mon client du navigateur cert, pas à la client cert de l'attaquant.
une autre attaque que nous pourrions être inquiète, c'est que attacker.heroku.com jeux une .heroku.com cookie sur mon agent utilisateur dans le but de faire de me connecter app.heroku.com comme lui-même. Encore une fois, en supposant que la seule façon dont l'attaquant peut obtenir les cookies est en les obtenant de app.heroku.com, cela signifie que les cookies qu'il a à sa disposition sera canal-lié à son client cert, pas à mon client cert - donc lorsque mon navigateur les envoie à app.heroku.com ils ne seront pas valables.
bien entendu, la proposition de TLS-OBC suppose des" portées " plus fines pour les certificats des clients. La raison pour cela, cependant, est purement pour empêcher le suivi dans des domaines non liés. Les attaques de domaines connexes sont déjà atténuées même si nous avons utilisé des certificats clients à grain grossier et des cookies à grain grossier (c.-à-d., domaine). J'ai, au moins, trouvé cela un peu contre-intuitif au début, puisque l'autre défense proposée il pour interdire les cookies à gros grains tout à fait et l'utilisation cookies d'origine à la place.
il y a un certain nombre de questions qui doivent être considérées pour TLS-OBC; je vais mettre en évidence un couple ici que je suis au courant.
-
une certaine logique de la poignée de main SSL pourrait devoir être légèrement modifiée; voir https://bugzilla.mozilla.org/show_bug.cgi?id=681839 pour discussion technique.
-
il y a des considérations potentielles de confidentialité; en particulier si le certificat client unique est envoyé en clair avant la négociation du secret maître, un observateur de réseau passif peut être en mesure d'identifier de façon unique une machine client. L'attaquant aurait déjà l'adresse IP du client, donc ce n'est pas un énorme problème si le certificat est régénéré lors d'un changement D'adresse IP, mais cela annulerait une grande partie de l'avantage de l'authentification. Une proposition visant à permettre l'envoi d'un certificat client après la négociation du master secret. (Je ne trouve pas le bug en ce moment, désolé)
-
L'une des propositions sur la façon de traiter le numéro 2 est ici: http://tools.ietf.org/html/draft-agl-tls-encryptedclientcerts
-
il y a interactions délicates avec SPDY. Il y aura des mises à jour sur browserauth.net pour ça.
Fix the RFC
Le problème principal semble être ici que tous les hôtes peuvent écrire un cookie qui peut être remplacé par un autre hôte dans le même domaine. Et s'il y avait un moyen d'écrire une valeur au client qui ne peut absolument pas être écrasée par un autre hôte? Je n'ai rien trouvé de tel qui soit automatiquement inclus dans L'en-tête HTTP (comme un cookie)
Voici trois solutions qui pourraient fonctionner, bien que je comme Solution 2 ou #3 si les navigateurs l'implémentent correctement
Solution 1: ajouter plus d'informations lors du téléchargement de cookies sur le serveur
lorsque le client envoie des cookies au serveur, incluez également le domaine du cookie qui a été envoyé. Le serveur sait alors quel domaine et quel chemin rechercher. Cela signifie que le client ajoute un nouvel en-tête HTTP Cookie-Details
sur chaque requête:
GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: name=value; name2=value2
Cookie-Details: name="value":"domain":"path":"IsSecure":"IsHTTPOnly"; name2="value2":"domain2":"path2":"IsSecure":"IsHTTPOnly"
Accept: */*
Le serveur peut alors ignorer le champ détails, ou il préférer à celui qui ne fournit pas les détails. La raison pour laquelle j'ai inclus le champ "Valeur" dans la section Détails est que le serveur ne serait pas en mesure de faire la différence entre deux cookies qui ont le domaine défini à example.com
et secure.example.com
si les deux cookies ont le même nom. La plupart des navigateurs envoient les valeurs dans un ordre aléatoire.
peut-être cela peut être optimisé de sorte que le serveur peut dire au client si ce nouveau format de cookie est supporté ou non, et le client peut répondre en conséquence.
Solution 2: étendre HTML5 LocalStorage de sorte que les données soient (optionnellement) automatiquement insérées dans L'en-tête HTTP
si nous pouvions étendre le stockage local de HTML5 pour permettre des données sécurisées / HTTPOnly, nous pouvons imiter ce qui est fait dans la Solution #1 ci-dessus, mais avoir le changement piloté par le HTML5 Groupe de travail W3C
l'avantage de ceci est qu'il y a moins de frais généraux que la solution #1, puisque les détails plus verbeux des cookies ne sont envoyés au serveur que lorsque c'est nécessaire. En d'autres termes, si une valeur sensible est sauvegardée en utilisant le format "new cookie details" dans LocalStorage, alors il y a une séparation claire entre ce qui doit être envoyé et dans quel format.
Solution 3 " Cookie validation "
- un utilisateur visite une application web dont le mode de validation "spécial" est activé.
- sur la réponse HTTP certains cookies sont envoyés au navigateur. Les cookies peuvent être HTTP seulement, Sécurisé,...quoi que ce soit)
- a à côté des cookies, un autre en-tête est envoyé aux cookies:
Set-CookieValidationHash
. Il contient un tableau JSON de clés et de valeurs de cookie SHA-256 hachées, et spécifie l'expiration de la valeur - le navigateur lie logiquement cet en-tête aux cookies avec le comportement suivant
- cet en-tête est placé dans un "pot de Validation de Cookie" qui ne peut être écrit que par le même domaine DNS, et Dns Scope
- cet en-tête est opaque pour le client et est retourné au serveur sur chaque requête HTTP (comme un cookie)
- le serveur utilisera ce champ pour valider les cookies qui sont envoyés, et émettent une erreur (ou autre) si le checksum échoue.
Source: http://www.w2spconf.com/2011/papers/session-integrity.pdf
5.2. Intégrité grâce à des en-têtes personnalisés
au lieu de sécuriser les cookies, nous pouvons atteindre l'intégrité de la session en choisissant une nouvelle méthode de stockage et de transmission de la session état. Bien que cela puisse être fait en utilisant des plugins spéciaux de navigateur comme Flash, nous préférons choisir un design moins de les dépendances, nous nous concentrerons donc uniquement sur les outils HTTP de base. La forme de base D'une requête HTTP a très peu d'endroits sont adaptés pour envoyer des données avec intégrité. Des données dans l'URL ou entité corps de requêtes HTTP n'a pas d'intégrité, parce que ces parties de la requête HTTP sont accessibles en écriture à travers les origines et donc spoofable par un attaquant. Les Cookies sont également faibles dans cet égard, car ils peuvent être remplacées par l'attaquant dans notre modèle de menace. Cependant, grâce à L'utilisation D'une API JavaScript appelé XMLHttpRequest (XHR), nous pouvons envoyer des données dans un tête.
"151970920 d'arrière-plan". XMLHttpRequest (XHR) permet HTTP les requêtes contenant des en-têtes personnalisés et l' réponses lues, mais seulement à l'origine de l'exécution JavaScript.(Voir Note5) en conséquence, les demandes faites via XHR peuvent être par un serveur comme provenant nécessairement de la site lui-même.
de Conception. nous n'utiliserons pas de cookies à tous, et, au lieu de passer une session identifiant un token dans un en-tête HTTP personnalisé qui est seulement écrit via XMLHttpRequest. Le serveur doit traiter tout les demandes dépourvues de cet en-tête personnalisé, ou contenant un invalide jeton, comme appartenant à une nouvelle session anonyme. Afin poursuivre cette session identifier les tokens à travers les redémarres du navigateur et entre différentes pages de la même application, le jeton peut être stocké dans HTML5 localStorage par JavaScript sur authentification réussie.
de Sécurité. Observe que dans ce modèle, la session identifiant le token ne sera envoyée qu'au serveur d'origine, et ne pas être inclus dans L'URL ou le corps d'entité. Ces propriétés assurer la confidentialité et l'intégrité, respectivement. Contrairement à cookies, le token ne peut pas être écrasé par l'attaquant, puisque localStorage divise complètement les données entre les origines dans la plupart des navigateurs (Voir Note 6). Un site utilisant HTTPS peut garantir que le token n'est envoyée sur HTTPS, assurant ainsi le secret de la jeton, même en présence d'un réseau actif attaquant. Dans plus, parce que ce jeton n'est pas envoyé automatiquement par le navigateur, il sert également à protéger contre les attaques CSRF.
inconvénients. cette approche présente toutefois plusieurs inconvénients. Tout d'abord, il exige que toutes les demandes une session de l'utilisateur doit être faite en utilisant XMLHttpRequest. Simplement ajout d'une session identifiant explicitement un token toutes les demandes, beaucoup moins les faire sur XHR, nécessiterait des changements majeurs pour la plupart des sites web existants, et serait lourd et difficile à mettre en œuvre correctement sans cadre. Ce encore plus compliquée si les demandes de sous-ressources comme les images nécessitent l'accès à l'état de session, car il n'est pas trivial pour charger des images via XHR. Troisièmement, puisque cette conception dépend de la présence et la sécurité de HTML5 localStorage, il sera impossible à mettre en œuvre sur certains navigateurs traditionnels
(Note 5) les Sites peuvent effectuer des requêtes intersites en utilisant XHR si le navigateur et autorisé par le serveur cible
(Note 6) Vrai dans Chrome, Firefox, Safari et Opera sur OS X, plusieurs Linux distributions, et Windows 7. Internet Explorer 8 ne partage pas HTTP et HTTPS, mais Internet Explorer 9 le fait.
Principaux Points
- ne donne pas la permission d'exécuter dans les répertoires de téléchargement (un attaquant peut être de l'intérieur).
- obtenir toutes les informations utilisateur possibles qui est connecté au serveur (cookie est un seul).
- Surveiller le serveur et les alertes (trouvé/le voir, l'arrêter, fermer la porte).
réponse à
Supposons que l'utilisateur a téléchargé un mauvais fichier qui n'était accessible que dans son compte; l'autre utilisateur télécharge alors involontairement ce fichier, en cours d'exécution tout code exécutable qui s'y trouve.
tout d'abord, vous ne devez pas permettre d'exécuter quoi que ce soit sur vos répertoires téléchargés, parce que même vos utilisateurs réguliers peuvent télécharger une page aspx et l'exécuter et parcourir vos fichiers. La première étape consiste à ajouter sur votre télécharger des répertoires web.config (mais aussi définir les permissions pour ne pas permettre d'exécuter quoi que ce soit).
<configuration>
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</configuration>
voler les cookies
Permet de voir comment nous pouvons identifier l'utilisateur.
- Cookie
- Browser ID
- Ip y compris les IP proxy et forward.
- navigateur ont javascript activer (ou non).
- demande le mot de passe.
- autre fichier stocké sur le client.
maintenant, pour chaque session connectée, nous pouvons connecter les quatre premières informations ensemble, et si l'un d'eux change, nous pouvons le déconnecter et demander à nouveau de s'inscrire.
est également critique pour connecter certains Comment (avec une ligne sur la base de données) le cookie avec le statut connecté de l'utilisateur, donc si l'utilisateur se déconnecte, no peu importe si certains volent son cookie, pour ne pas être en mesure de voir les pages - ce que je veux dire est le cookie qui lui permet de se connecter ne doit pas être le seul sur lequel nous comptons, mais aussi nos données pour suivre le statut de l'utilisateur.
Dans ce cas, même si certains de voler le cookie, si l'utilisateur de se déconnecter après certaines actions, le cookie n'est plus utile.
donc ce que nous faisons est que nous connectons le cookie+ip+ID du navigateur+Informations javascript par connexion, et si l'un d'eux changement, nous ne lui faisons plus confiance, jusqu'à ce que se connecter à nouveau.
Cookies
un cookie ne suffit pas. Nous avons besoin d'au moins deux cookies, l'un qui fonctionne uniquement sur les pages sécurisées, et qui doit être https secure et l'autre qui fonctionne sur toutes les pages. Ces deux témoins doivent être connectés ensemble et cette connexion doit également être prise sur le serveur.
donc si l'un de ces cookies n'existe pas, ou si la connexion ne correspond pas, alors l'utilisateur n'a pas l'autorisation et le besoin de se connecter à nouveau (avec alerte)
Une idée de connecter les cookies ensemble . Avec cette idée, je connecte le cookie de session avec le cookie d'authentification.
en Cas d'échec
il y a certaines étapes (ou actions) qu'un hacker suivez (faire) quand obtenir à un site afin d'être en mesure de gagner de cette fenêtre d'opportunité et a laissé une porte arrière ouverte.
- Créer un nouveau compte administrateur.
- télécharger un fichier pour l'exécuter en tant que navigateur et exécutable.
comme je le dis, nous ne permettons jamais d'être en mesure de télécharger un fichier qui peut être exécuté, donc c'est facile. Les autres pour créer un nouveau compte administrateur est celle que nous avons besoin d'ajouter un mot de passe qui n'est pas enregistré à n'importe quel cookie, ou ne pas exister de toute façon sur le client.
donc pour des actions rares comme, un nouvel utilisateur de backoffice, changer le privilège des utilisateurs, supprimer un utilisateur, etc, nous devons demander un deuxième mot de passe à chaque fois que seul l'administrateur sait.
donc le second mot de passe est le message final.
Une idée finale
une idée que je n'ai pas faite, est de stocker certains comment l'information est sur le client autre que le témoin, ne peut pas être volé comme les cookies, ou même si il peut être volé est caché quelque part sur l'ensemble des données qu'il est impossible de le trouver.
cette information peut être un id supplémentaire de l'utilisateur avec le cookie, les données du navigateur, IP.
je suis chose quelques endroits possibles, mais pas encore les tester ou les essayer dans la vie réelle. Ce sont quelques placé.
- extension Personnalisée, ou un plugin, malheureusement différent pour chaque navigateur qui ont la capacité d'enregistrer les données et ensuite nous pouvons les utiliser pour communiquer avec le serveur. Cela est nécessaire à l'action de l'utilisateur, pour installer ce plugin et pour les utilisateurs réguliers, cela peut lui faire peur et aller.
- code caché à l'intérieur d'une bonne image mise en cache, sur l'en-tête de celui-ci, par exemple sur etag. C'est aussi facile de ne pas travailler parce que nous ne pouvons pas être sûr que la demande d'image pour recharger...
- quelques autres capacités de navigateur, par exemple à lire et l'utilisation d'un certificat client, qui peut être utilisé pour échanger des données cryptées avec le serveur. Cette demande l'intervention de l'utilisateur pour installer ce certificat, et de notre part de les créer différent pour chaque utilisateur. Bon pour les comptes bancaires, mais pas pour les simples utilisateurs.
voilà donc mes idées... toute critique, ou une solution (pour savoir comment stocker de petites informations sur le client autre que le cookie) est la bienvenue.
mise en œuvre
pour le rendre vraiment sûr, nous devons garder une trace de l'utilisateur sur le serveur, et sur la base de données. Une table qui connecte l'utilisateur, avec l'ip, avec l'id du navigateur, et d'autres statuts, comme si maintenant est se connecter ou non, est une mesure que nous pouvons utiliser pour prendre des décisions.
si vous n'êtes pas en mesure d'utiliser une base de données, ou si vous n'aimez pas la rendre difficile, alors la connexion peut être en train de rassembler des données et vérifier si ce hachage est le même.
par exemple nous vous pouvez définir un cookie avec le hash de (Ip+BrowserID) et vérifier si c'est beaucoup ou pas.
Alertes-Journal
Tout ce qui précède ils essaient d'être automate. Comment jamais, je suggère aussi de montrer à l'utilisateur et à l'administrateur de certaines informations pour diagnostiquer et prévenir une attaque. Ces informations peuvent l'être.
à l'utilisateur
- 10 Dernières informations de connexion (IP, DateTime, Succès ou pas)
- envoyer un e-mail à l'utilisateur sur certaines actions (pour les sites de haute sécurité), comme se connecter, Se Déconnecter, actions critiques.
à l'administrateur.
- afficher toute défaillance de la connexion sur les quatre paramètres Cookie+IP+BroserID+JavaScript activer). Plus l'échec en peu de temps, plus d'attention requise.
- Vérifiez l'ouverture de session d'échec.
- vérifier la page lue par l'utilisateur avec out cookie activer (ou enregistrer) et javascript est désactivé, parce que c'est comment scanner identifié à partir de mon expérience.
Source: Origine des Cookies Proposition du Web 2.0, de la Sécurité et de la Confidentialité de la Conférence
.
6. L'intégrité de Session dans les navigateurs futurs aucune des solutions précédentes, ni d'autres considérées en utilisant les technologies de navigateur existantes, assurer une sécurité suffisante tout en restant déployable site. Par conséquent, nous proposons une extension de cookies appelés origine cookies. Les cookies d'origine permettent aux applications Web existantes de sécuriser contre les attaques décrites, avec très peu de complexité de mise en œuvre de la part de l'application web ou de la navigateur, avec la compatibilité ascendante transparente pour les navigateurs qui font pas encore implémenter les cookies d'origine, y compris les navigateurs traditionnels qui peuvent jamais les soutenir et imposer aucun fardeau sur les sites web existants qui n'ont pas activé les cookies d'origine. Ce n'est pas un trivial problème résoudre, comme en témoignent les propositions existantes qui ne satisfont pas à l'une ou plus des propriétés désirées ci-dessus. Par exemple, l'envoi de l'origine de chaque cookie sur chaque demande est une idée commune. C'est beaucoup plus compliqué que nécessaire, et impose un fardeau beaucoup plus grand sur le web sites, y compris ceux qui ne savent même pas comment l'utiliser efficacement information.
6.1. Cookies d'origine le vrai problème avec l'utilisation les cookies pour la gestion de session est un manque d'intégrité, en particulier en raison capacité d'autres origines à effacer et à écraser les cookies. Alors que nous ne peut pas désactiver cette fonctionnalité à partir de cookies sans briser de nombreux sites existants, nous pouvons introduire de nouvelles fonctionnalités de type cookie qui ne permet pas une telle modification entre les sites.
de Conception. cookies D'origine sont des cookies qui ne sont envoyés et modifiables que par des requêtes et des réponses à partir de l'origine exacte. Ils sont défini dans les réponses HTTP de la même manière que les cookies existants (en utilisant Set-Cookie header), mais avec un nouvel attribut nommé ‘Origin’. Afin permettre aux applications web de distinguer les cookies d'origine des cookies normaux cookies, les cookies d'origine seront envoyés dans une demande HTTP dans une nouvelle en-tête ' OriginCookie’, alors que les cookies normaux continueront à être envoyés dans l'en-tête existant "Cookie".
HTTP/1.1 200 OK
...
Set-Cookie: foo=bar; Origin
...
Fig. 2. An HTTP response setting an origin cookie.
GET / HTTP/1.1
Host: www.example.com
...
Origin-Cookie: foo=bar
...
Fig. 3. Une requête HTTP à une URI pour lesquels une origine cookie a été défini.
par exemple, si en réponse à une requête GET http://www.example.com / , une réponse comme dans la Figure 2 est reçue, puis un cookie d'origine serait défini avec la clé 'foo’ et la valeur' bar’ pour l'origine http://www.example.com , et serait envoyé le les demandes de cette origine. Une demande D'obtention ultérieure pour http://www.example.com / ressemblerait à la Figure 3. Les demandes faites à tout autre origine, même https://www.example.com et http://example.com serait fait exactement comme si l'origine des cookies pour http://www.example.com n'a jamais été mis. L'Origine de l'attribut de l'extension la sémantique de Set-Cookie lui-même est subtile et implique plusieurs changements sémantiques aux autres attributs des cookies. Si l' Origine définir l'attribut, l'attribut de Domaine n'est plus approprié, et doit donc être ignoré. De même, l'Sécurisé attribut n'est plus approprié, car il est implicite dans le schéma de l'origine du cookie: si le schéma est https, l'origine cookie a effectivement l'attribut – car il ne sera envoyée que sur une voie de communication protégée – et si le schéma est autre chose, le cookie pas l'attribut. Parce que la Politique de même origine considère différentes voies vers faire partie de la même origine, l'attribut de les cookies n'offrent aucune sécurité et doivent également être ignorés. Sémantique d'autres attributs, tels que
HttpOnly
,Max-Age
,Expires
, etc. rester inchangé pour les cookies d'origine. Les cookies normaux sont identifiés de manière unique par leur touche, la valeur de l'attribut de Domaine, et la valeur de la Attribut Path: cela signifie que la configuration d'un cookie avec une clé, un domaine, et le chemin qui est déjà défini n'ajoute pas de nouveau cookie, mais à la place remplace cookie existant. Les cookies d'origine doivent occuper une place séparée namespace, et être identifiés de façon unique par leur clé et l'origine complète que jeu. Ceci empêche les sites de accidentellement ou maliciously suppression des cookies d'origine, en plus des autres protections contre la lecture et la modification, et rend l'utilisation côté serveur d'origine cookies nettement plus facile.de Sécurité. parce que les cookies d'origine sont isolés entre les origines, les pouvoirs supplémentaires de l'attaquant de domaine lié et du réseau actif attaquant dans les cookies d'écrasement ne sont plus efficaces, car ils l'absence d'isolement d'origine avec les cookies, que la " confusion’ était due à l'arrangement ou au domaine de origine. En l'absence de ces pouvoirs supplémentaires, le domaine attaquant et attaquant réseau actif sont équivalents au web attaquant, qui ne peut pas briser la sécurité de la gestion de session existante basé sur la combinaison de cookies et de jetons secrets.
la mise en Œuvre. L'intégration des cookies d'origine dans les navigateurs existants ne nécessitera pas de modifications importantes. Comme une preuve de concept, nous implémentation des cookies d'origine dans Chrome. Le patch totalise seulement 573 lignes
de l'IETF TLS groupe de travail a une proposition visant à lier des cookies pour TLS certificats client , tant et aussi longtemps que la clé privée correspondant à la cert n'est que sur une machine, le cookie ne peut être utilisé que sur une seule machine.
si vous voulez émuler l'approche TLS client cert, vous pouvez utiliser localStorage pour stocker une clé privée, et utiliser JS crypto 1 pour remplacer le document.cookie avec une version signée. C'est un peu maladroit, mais il peut être fait au travail. (Évidemment, serait mieux avec Web crypto 2 )
1 par exemple: http://www.ohdave.com/rsa /
de http://www.codeproject.com/Articles/16645/ASP-NET-machineKey-Generator
chaque fois que vous utilisez ViewState, Session, forms authentication, ou d'autres valeurs cryptées et/ou sécurisées, ASP.NET utilise un ensemble de clés pour faire le chiffrement et le déchiffrement. Normalement, ces clés sont cachées et générées automatiquement par ASP.NET chaque fois que votre application recycle
si les deux les sites Web sont des applications web différentes, par défaut ils auront des clés différentes de sorte que l'un ne sera pas en mesure de lire les jetons cryptés générés par l'autre. L'exception à cela est s'ils utilisent des valeurs communes dans un web global.config ou machine.config.
From machineKey Element, decryptionKey: http://msdn.microsoft.com/en-us/library/w8h3skw9.aspx
AutoGenerate, IsolateApps spécifie que la clé est généré automatiquement. C'est la valeur par défaut. Le modificateur D'AutoGenerate spécifie que ASP.NET génère une clé aléatoire et la stocke dans L'Autorité de sécurité locale (LSA). Le modificateur IsolateApps spécifie que ASP.NET génère une clé chiffrée unique pour chaque application en utilisant l'ID d'application de chaque application.
ainsi, à moins que l'élément machineKey ne soit utilisé pour définir la clé de décryptage à un niveau global, la méthode que vous avez décrite ne devrait pas travail. Si elle est définie, vous pouvez outrepasser au niveau de l'application en utilisant le web.fichier de configuration.
vous pouvez définir un unique machineKey dans le web.config pour votre application. De cette façon, seuls les cookies d'authentification émis par cette application peuvent être déchiffrés. Si l'utilisateur visite un site malveillant sur le même domaine, cet autre site pourrait en effet ajouter un cookie d'authentification cookie avec le même nom mais une valeur différente, mais il ne sera pas en mesure de crypter et signer avec la même clé de la machine utilisée par votre application et lorsque l'utilisateur navigue en arrière une exception sera levée.
la réponse est simple: liez toujours les sessions à une IP client spécifique (cela devrait être fait dans n'importe quelle application web moderne de toute façon) et n'utilisez pas les cookies à d'autres fins.
explication: vous envoyez toujours un seul cookie SESSIONID au client, qui ne détient aucune information - c'est juste une très longue chaîne aléatoire. Vous stockez le SESSIONID avec L'IP Utilisateur authentifiée dans votre webapps scope-like i.e. la base de données. Bien que les cookies attack peut être utilisé pour échanger des cookies SESSIONID entre différents clients, aucun client ne peut jamais se faire passer pour un autre utilisateur ou effectuer des actions, car le sessionid est seulement considéré comme valide et les privilèges ne sont accordés, si son envoi à partir de l'adresse IP associée.
aussi longtemps que vous ne stockez pas de données réelles qui sont considérées comme privées dans le cookie lui-même, mais dans l'état de session du côté du serveur (qui est sélectionné uniquement par le cookie SESSIONID) le le problème des cookies ne devrait pas être un problème pour vous.