Question:
Réinitialisation du mot de passe donnant des indices sur les adresses e-mail valides possibles
davshowhan449
2020-03-19 18:25:56 UTC
view on stackexchange narkive permalink

Nous avons un système où, si vous avez oublié votre mot de passe et que vous souhaitez le réinitialiser, accédez à la page du mot de passe oublié et entrez votre adresse e-mail. Un lien temporaire sera envoyé à votre adresse e-mail pour réinitialiser votre mot de passe.

Maintenant, lorsque nous avons soumis notre application à des tests d'intrusion, un problème a été trouvé:

L'application donne indices d'adresses e-mail valides possibles lors de la tentative de réinitialisation du mot de passe. Cette fonctionnalité peut être abusée en devinant simplement une adresse e-mail possible et en étant capable de trouver une adresse e-mail valide à travers les messages d'erreur.

Eh bien, il n'y a qu'un seul champ et bien sûr, il est évident que si un mot de passe réinitialisé la tentative échoue, elle est due à un e-mail invalide. Il semble que ce test de pénétration soit faux. Existe-t-il des solutions pour résoudre ce problème en plus d'ajouter un champ supplémentaire (en plus du courrier électronique) pour la réinitialisation du mot de passe?

il est important de clarifier ici la différence entre "e-mail invalide" et "e-mail non enregistré".si l'utilisateur tape quelque chose qui ne correspond pas au format d'une adresse e-mail valide, bien sûr, il est normal du point de vue de la sécurité de l'informer que le processus a échoué.s'ils tapent un e-mail valide qui n'est pas associé à un utilisateur enregistré, cependant, ces informations doivent rester privées.
Quelle réponse donnez-vous à un utilisateur qui utilise une adresse e-mail incorrecte lors de la connexion?
@DocRoot: Il est recommandé de répondre par un message générique tel que «E-mail ou mot de passe invalide» (en supposant que vous utilisez la combinaison e-mail + mot de passe comme informations d'identification).
@bhorkarg Oui, je sais.Cela se voulait un indice / une question rhétorique pour le PO.S'ils fournissent un message "générique" (d'erreur) lors d'une tentative de connexion infructueuse (comme je m'y attendais, car c'est une pratique très bien reconnue dans l'intérêt de la sécurité des comptes d'utilisateurs) alors pourquoi fournir une réponse plus "révélatrice" à un autre stadedans le processus de compte d'utilisateur?
Six réponses:
yoozer8
2020-03-19 18:35:05 UTC
view on stackexchange narkive permalink

N'indiquez pas que la tentative a échoué. Un utilisateur (légitime ou non) demande un lien de réinitialisation de mot de passe et vous donne une adresse e-mail. Tout ce que vous devez dire ici est dans le sens de

Vos soumissions ont été reçues. Si nous avons un compte correspondant à votre adresse e-mail, vous recevrez un e-mail avec un lien pour réinitialiser votre mot de passe.

L'utilisateur recevra toujours le lien (succès), mais les attaquants ne le feront pas savoir si une adresse e-mail fournie est associée à un compte.

Pourquoi même ajouter la deuxième phrase?Donnez simplement un générique "Votre soumission a été reçue et sera traitée."
Les utilisateurs légitimes oublient parfois l'adresse e-mail qu'ils ont utilisée, c'est donc bien de leur dire que la demande pourrait échouer en raison d'un compte inexistant par rapport à l'e-mail marqué comme spam, etc.
De plus, il permet simplement à l'utilisateur de savoir à quoi s'attendre.Oui, la plupart d'entre nous ont déjà suivi le processus et savent que nous devrions chercher un e-mail.Mais pour quelqu'un qui réinitialise un mot de passe pour la première fois, vous voulez lui faire savoir à quoi s'attendre ensuite.
Mais la même chose peut être trouvée en essayant l'enregistrement.À moins que vous ne disiez également «l'inscription peut être réussie ou non», ce qui me semble terrible.Dans l'ensemble, cela ressemble à une obfuscation facilement contournée au détriment de la convivialité (si un utilisateur saisit mal son email, il ne le découvrira jamais et attendra en vain).
et s'il y a des pages qui viennent après?comme les termes et conditions, les avis, les FYI, les publicités, les sondages, etc. avant l'envoi effectif du courrier électronique?cela pourrait affecter l'expérience utilisateur.Un utilisateur légitime pourrait dire, j'ai traversé tout ça et à la fin, ils ne m'ont pas dit que mon e-mail était invalide?
Ces pages sont-elles vraiment nécessaires?Si je devais répondre à une enquête, rejeter plusieurs publicités et lire certaines conditions d'utilisation avant de pouvoir réinitialiser mon mot de passe, j'envisagerais sérieusement d'utiliser ce service.La réinitialisation de votre mot de passe doit être aussi simple que d'écrire mon adresse e-mail et de cliquer sur un bouton.
-1 Parce que vous parlez de la mise en œuvre la plus simple sans même aborder le modèle de menace associé.Par exemple, comme indiqué dans les commentaires, exposer les e-mails d'utilisateurs déjà enregistrés est une caractéristique typique des formulaires d'inscription, et l'important est souvent d'empêcher le forçage brutal en limitant le débit par IP.Vous n'abordez pas non plus l'énorme succès de l'UX et les dangers de donner la même réponse (les vrais utilisateurs étant plus blessés que les acteurs malveillants)
Les utilisateurs d'@davshowhan449 devraient avoir à accepter toute ToC lors de l'inscription, pas pendant l'utilisation
@Christoph "J'envisagerais sérieusement si j'utilise ce service" est une façon étrange d'écrire "Je supprimerais mon compte et je n'y retournerais jamais"
Pour l'enregistrement d'un compte, vous pouvez éviter de révéler ces informations si vous rendez les nouveaux comptes inaccessibles sans vérification par e-mail.Aucune de ces techniques n'est difficile;il s'agit simplement de décider si l'existence d'un compte est suffisamment secrète pour justifier un succès en UX.Et bien sûr, vous pouvez atténuer les problèmes UX en envoyant un e-mail même en cas d'échec (par exemple, vous pouvez envoyer un e-mail «compte non trouvé» lorsqu'une réinitialisation de mot de passe échoue).
Dans tous les cas, un e-mail doit être envoyé à l'adresse e-mail indiquée.Si aucun compte n'est associé à cette adresse, informez le propriétaire de ce compte de messagerie qu'il y a eu une tentative de réinitialisation du mot de passe.Si un tiers a tenté de réinitialiser le mot de passe, il sait que quelqu'un l'attaque.S'ils ont oublié l'adresse e-mail qu'ils ont utilisée pour s'enregistrer, ils n'attendront plus l'e-mail ou penseront que votre système est défectueux, mais essaieront simplement leur adresse suivante.
@UTF-8 Voulez-vous dire qu'un e-mail doit être envoyé à l'adresse, qu'elle soit enregistrée ou non dans le système?Cela semble discutable.Je ne voudrais certainement pas recevoir des e-mails d'un service avec lequel je n'ai rien à voir simplement parce que quelqu'un a connecté mon adresse e-mail à un formulaire Web.
@DavidZ Voyons donc simplement comment les services populaires que nous utilisons tous gèrent cette situation.Idk, peut-être SE?Je viens donc de brancher une adresse e-mail non associée à mon compte StackExchange dans le formulaire «J'ai oublié mon mot de passe».Qu'est-ce que j'ai eu?Un e-mail indiquant: "Nous avons reçu une demande de récupération de compte sur Meta Stack Exchange pour [mon adresse e-mail secondaire], mais cet e-mail n'existe pas dans nos archives."
@DavidMulder Ma préoccupation avec la limitation de débit par IP est qu'elle verrouille souvent les utilisateurs de VPN légitimes, ce qui constitue également un énorme succès pour l'UX.
@Schwern Avoir une petite fraction d'utilisateurs qui aura un formulaire d'enregistrement légèrement pire, mais toujours fonctionnel (étant donné qu'il a été bien programmé) ne semble pas être un `` énorme succès '' (surtout par rapport à l'alternative: un processus d'enregistrement disjoint où vous recevezun e-mail pour continuer l'inscription).Mais oui, vous avez absolument raison de dire que considérer les utilisateurs VPN en vaut vraiment la peine.
@DavidMulder Ce n'est pas un énorme succès tant que vous n'êtes pas l'utilisateur VPN qui est verrouillé.Je ne sais pas si vous avez regardé les nouvelles ces derniers temps, mais nous sommes sur le point de voir beaucoup plus de personnes travailler à domicile sur des VPN.:grimace:
Demento
2020-03-19 18:34:12 UTC
view on stackexchange narkive permalink

La raison de cette constatation est qu'un utilisateur obtient des réponses différentes, en fonction de l'existence de l'adresse e-mail. Cela peut être aussi simple que de leur dire que l'adresse n'est pas connue, ou quelque chose de plus subtil dans la réponse.

La mise en œuvre la plus simple pour éviter ce genre de problème est de renvoyer exactement la même réponse , que l'adresse e-mail existe ou non. Un simple

Les informations pour réinitialiser le mot de passe ont été envoyées à l'adresse e-mail fournie. Si vous ne recevez pas d'e-mail, veuillez vérifier que vous avez fourni l'adresse correcte.

ferait l'affaire.

Si vous connaissez l'adresse e-mail, envoyer les informations de réinitialisation du mot de passe. S'il n’existe pas, ne faites rien. Un utilisateur réel obtiendra le lien, tandis qu'un attaquant ne peut pas déterminer si un e-mail a été envoyé ou non.

est tout à fait logique.Je vous remercie.pourquoi n'y ai-je pas pensé avant?
@davshowhan449 - Ne vous inquiétez pas, c'est une vulnérabilité très courante dans les applications Web et facilement manquée.La mauvaise nouvelle est que ces problèmes sont en fait exploités dans la nature et difficiles à atténuer à court préavis, quand cela se produit.Par conséquent, je recommande de le fixer à temps, bien qu'il ne s'agisse "que d'une divulgation d'informations" à première vue.
et s'il y a des pages qui viennent après?comme les termes et conditions, les avis, les informations détaillées, les publicités, les sondages, etc. avant l'envoi effectif du courrier électronique?cela pourrait affecter l'expérience utilisateur.Un utilisateur légitime pourrait dire, j'ai tout traversé et à la fin, ils ne m'ont pas dit que mon e-mail était invalide?
@davshowhan449 Ensuite, débarrassez-vous également de ces pages supplémentaires.Et bon débarras, parce que cela ressemble à une expérience horrible en premier lieu.Mais peut-être que cela vaut une nouvelle question.
@davshowhan449 Je ne pense pas avoir jamais vu cela dans une page de réinitialisation de mot de passe.Vous êtes présumé être déjà membre du service, il n'est pas nécessaire de demander à l'utilisateur d'accepter les conditions générales.Les autres éléments n'apparaissent que lorsque vous répondez au lien envoyé par e-mail.
@davshowhan449 Bien que ce ne soit toujours pas une excellente expérience utilisateur, une façon de résoudre ce flux de travail serait de déplacer toutes les pages * nécessaires * vers après que l'utilisateur clique sur le lien dans son e-mail.
Michael P
2020-03-19 19:15:52 UTC
view on stackexchange narkive permalink

En complément des réponses ci-dessus (serait mieux adapté comme commentaire mais ne peut pas encore le faire), une autre étape que le pirate peut prendre est de mesurer le TEMPS de votre réponse au formulaire. Cela peut vous prendre 10 ms pour déterminer que l'e-mail n'existe pas, alors qu'il vous faut 100 ms pour générer un lien de réinitialisation et envoyer un e-mail. Le pirate peut savoir si la réponse est plus lente que la recherche réussie. Vous pouvez utiliser une minuterie de mise en veille aléatoire dans les cas où l'e-mail n'est pas trouvé afin que les deux réponses prennent le même laps de temps.

Bienvenue sur le site, obtenez votre premier +1!Merci pour votre ajout.Il existe cependant une solution encore plus simple au problème.Envoyez simplement la réponse immédiatement, sans vérifier d'abord l'e-mail.De cette façon, le temps de réponse est également indépendant de la validité de l'adresse e-mail.
@Demento C'est conceptuellement simple mais cela peut être techniquement difficile - de nombreux backends Web de base ne facilitent pas ce traitement asynchrone, car par défaut, ils lient la durée de vie du thread de traitement à la réponse HTTP.
@Bob oui, c'est un peu plus difficile, mais aussi toujours très traitable.Si vous avez une file d'attente de messages, vous pouvez l'utiliser, ou aller pauvre homme / vieux skool avec un cron qui exécute toutes les minutes en faisant sortir des éléments d'une base de données de soumissions de réinitialisation en attente.
Ce problème disparaît si vous envoyez un e-mail «impossible de réinitialiser le mot de passe: compte non trouvé».
Brian Je vous ai voté pour, mais notez que (sans contrôle) vous avez donné à l'attaquant A la possibilité de spammer l'utilisateur S en utilisant votre service.
Juste une note latérale ici - n'utilisez pas un sommeil aléatoire, il peut être filtré statistiquement.Voir par exemplehttps://stackoverflow.com/questions/28395665/could-a-random-sleep-prevent-timing-attacks Un délai calculé comme étant suffisamment long pour que les deux réponses prennent le même temps peut aider, mais pas aléatoire.
Si vous envoyez la même réponse à tout le monde, comme suggéré dans les autres réponses, la réponse HTTP peut être très simple, même une page HTML statique ou une redirection.La vérification et l'envoi se font soit de manière asynchrone, soit si votre framework ne prend pas en charge cela après l'envoi de la réponse.C'est au lieu de vérifier, envoyer, répondre, c'est répondre, vérifier, envoyer.
David Mulder
2020-03-20 14:10:14 UTC
view on stackexchange narkive permalink

De quoi nous protégeons-nous?

Tout d'abord, il faut se demander contre quoi ils protègent exactement. Dans ce cas, il existe deux menaces différentes:

  • Menace 1 Un attaquant force des e-mails aléatoires pour trouver des e-mails enregistrés valides. Cela pourrait théoriquement être utilisé pour créer des listes de spam, mais pour autant que je sache, cela n'a jamais été fait car il est plus simple d'envoyer les e-mails que de passer par le problème supplémentaire (Le nombre de fois où j'ai reçu des e-mails de spam réclamant mon [certains États-Unis compte bancaire] une action nécessaire même si vous ne résidez pas aux États-Unis est innombrable).
  • Menace 2 Un attaquant cible un utilisateur spécifique ou une liste d'utilisateurs spécifiques. Ceci est particulièrement important lorsque le simple fait qu'une personne est enregistrée quelque part peut avoir des conséquences. Exemple: le simple fait d'avoir un compte sur Grindr ou Ashley Madison peut être dangereux dans certaines communautés.

Vue d'ensemble

La prochaine question à laquelle il faut réfléchir est de savoir: d'autres endroits pourraient exposer les mêmes informations et les considérer dans leur ensemble. En règle générale, le formulaire d'inscription informera l'utilisateur si l'e-mail saisi est déjà enregistré, mais bien sûr cela ne s'applique pas à la plupart des logiciels B2B. Au-delà de ces fonctionnalités de `` partage avec l'utilisateur '' (une zone de saisie dans laquelle un e-mail peut être saisi pour partager un objet avec cet utilisateur) exposera souvent également ces informations, mais comme elles sont rares, je ne les inclurai pas dans cette réponse.

Solutions pour un système avec enregistrement public

Tout d'abord il est bon de reconnaître que ne pas informer l'utilisateur qu'un compte existe déjà pendant le processus d'inscription est d'un point de vue UX très désagréable. Il en va de même pour les formulaires de réinitialisation de mot de passe qui échouent silencieusement 1 lorsque l'utilisateur fait une faute de frappe ou reçoit plusieurs e-mails. Cela ne veut pas dire que c'est quelque chose qu'il ne faut pas faire, mais il faut le mettre en balance avec les risques et les avantages pour la sécurité.

Dans un système avec enregistrement public, il est important de prendre en compte l'ampleur de la menace 2 pour les utilisateurs de votre produit. Compte tenu du risque même modeste, il peut être prudent de modifier le formulaire d'inscription pour commencer en entrant uniquement un nom et un e-mail, en envoyant un message «Vérifiez votre e-mail pour continuer à vous inscrire», et si l'e-mail est déjà enregistré, envoyer un e-mail à l'utilisateur. eux de cela. De même, dans ce cas, le formulaire de réinitialisation du mot de passe n'informera en aucune manière l'utilisateur si l'e-mail est valide.

D'un autre côté, si la menace 2 est minime, nous devons nous limiter exclusivement à la menace 1 . Bien sûr, l'approche précédente fonctionnera également parfaitement contre la menace 1 exclusivement, mais compte tenu du coût UX, il vaut la peine d'envisager d'autres solutions. La solution la plus évidente est la limitation de débit 2 à la fois pour les vérifications «e-mail existe» et «mot de passe oublié» (techniquement, ces appels peuvent même aller au même point de terminaison d'API). Ceux-ci seront souvent conçus pour être assez indulgents pour les 10 premiers appels environ, mais seront très limités très rapidement après ce point.

Important : ne supprimez jamais les messages d'erreur du mot de passe enregistrement sans également implémenter des restrictions similaires sur le formulaire d'inscription.

Solutions pour un système sans enregistrement public

Tout se résume aux mêmes problèmes que ci-dessus (et j'aurais dû écrire ceci en premier ), mais sans le coût `` supplémentaire '' du hit pour l'enregistrement UX, il est relativement `` moins cher '' d'avoir un formulaire d'oubli de mot de passe sécurisé, même si bien sûr c'est toujours désagréable pour les utilisateurs et vous pouvez toujours déterminer si la limitation du débit n'est pas suffisante pour votre modèle de menace spécifique.

Remarques

1: Au lieu d'échouer silencieusement, il est sage d'envoyer au moins un e-mail à l'e-mail saisi pour l'informer que son e-mail n'a pas été trouvé. Cela 1) empêche les attaquants d'abuser en masse du système (comme on le remarquera) et 2) empêche les utilisateurs de se demander pourquoi ils ne reçoivent pas d'e-mail.

2: Do notez que la limitation de débit peut affecter négativement les utilisateurs de grands réseaux ou VPN. Considérez toujours à quel point ce public est important pour vous et, en fonction de cela, passez un temps suffisant pour vous assurer que l'application reste fonctionnelle même lorsque la limitation de débit est la plus sévère (par exemple en abaissant la limite de débit en résolvant un captcha ou en définissant la limite de débit maximale à environ une fois par minute et en s'assurant que l'application attendra toute la minute (note: ce sera toujours désagréable étant donné qu'une équipe d'utilisateurs s'inscrivant au même service au début de la même réunion)).

Ne serait-ce pas aussi bien comme ceci: "Un e-mail vous a été envoyé pour continuer votre inscription, si vous êtes déjà inscrit, vous ne recevrez aucun e-mail."Cela empêcherait un attaquant de spammer une adresse e-mail connue pour lui.
@SAJW Je pense que ce que vous décrivez est le même que celui que j'ai décrit lorsque j'ai écrit "Compte tenu du risque même modeste, il peut être prudent de modifier le formulaire d'inscription pour commencer par entrer uniquement un nom et un e-mail, en donnant un message" Vérifiez votre e-mail àcontinuer l'inscription "".Mais si vous avez une idée de la façon de le rendre plus clair ou meilleur: n'hésitez pas à modifier
Ah laisse tomber.Votre chemin est suffisant car si un attaquant connaît votre e-mail, il peut vous spammer si vous n'êtes PAS inscrit, donc nous ne gagnons pas grand-chose avec ma solution.
@SAJW En quelque sorte, j'ai complètement mal lu votre commentaire et maintenant c'est clair comme du cristal ....Mais oui, en général, échouer silencieusement est super dangereux, car l'utilisateur ne sait jamais si un serveur de messagerie lent ou un filtre anti-spam a attrapé son e-mail, ou s'il est en fait censé ne pas recevoir d'e-mail.
Džuris
2020-03-20 07:05:59 UTC
view on stackexchange narkive permalink

Vous devez mettre en balance le problème et les inconvénients de la solution. C'est souvent un compromis.

À mon avis, il est généralement préférable de sacrifier ce peu de sécurité pour le bien de l'expérience utilisateur, à moins que quelqu'un ne soit persécuté pour son inscription sur votre site.

De temps en temps, je viens des années plus tard sur un site et j'essaie de trouver quel e-mail j'ai utilisé pour ce site en particulier. Les sites qui cachent ces informations sont assez ennuyeux.

Un excellent ajout aux autres réponses.Chaque fonctionnalité de sécurité doit être évaluée pour le contexte actuel afin de décider si ses coûts en valent la peine.La réponse n'est pas toujours «oui».
Dans le cas où je ne sais pas quel e-mail j'ai utilisé, je recherche souvent le nom du site via mes adresses e-mail principales pour voir avec laquelle je me suis inscrit.Inconjonction particulièrement utile avec la fonction google de pouvoir ajouter + n'importe quoi à votre adresse e-mail.
Il ne s'agit pas seulement de persécution, mais aussi de phishing.Imaginez que quelqu'un reçoive un e-mail de "réinitialisation du mot de passe" et que 5 minutes plus tard, il reçoive un e-mail apparemment de votre site Web disant "Nous avons reconnu une connexion / un achat sur votre compte qui pourrait ne pas provenir de vous. Veuillez consulter www.thisisascam.com pour vérifiersi votre compte a été compromis ".De nombreuses personnes se connecteront au site Web frauduleux, car l'e-mail de réinitialisation les a préparées et le fraudeur sait que la personne a un compte avec vous, ce qui lui permet de formater le message différemment d'un spam générique.
@Morfildur: La plupart des hameçonneurs ne prennent pas la peine de vérifier l'existence d'un compte avant d'envoyer leurs e-mails.C'est pourquoi vous recevez des e-mails de phishing pour des services que vous n'utilisez pas.
eckes
2020-03-21 09:42:52 UTC
view on stackexchange narkive permalink

Notez que cela s'applique également (en plus des autres réponses) à l'écran d'enregistrement, au lieu de se plaindre d'un utilisateur déjà enregistré, il leur a envoyé un e-mail indiquant qu'ils sont déjà enregistrés et ne fournissent aucun commentaire à ce sujet dans l'application Web en plus de "vérifier votre messagerie ".

Ceci est mieux fait si vous demandez une entrée minimale à la première étape avant la validation de l'e-mail (ce qui est également bon pour le RGPD, où vous pouvez prouver que l'utilisateur a reçu votre e-mail d'information et a continué à s'inscrire ).

En fait, l'enregistrement ne pose aucun problème et doit toujours être fait. Pour la fonction de réinitialisation du mot de passe, nous proposons une option dans le logiciel où vous pouvez sélectionner des commentaires directs ou des commentaires par e-mail. (Dans les scénarios d'entreprise, en particulier sur l'intranet, deviner les e-mails n'est pas une menace réelle).



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...