Question:
Est-ce une faille de sécurité d'indiquer à un utilisateur quels caractères d'entrée sont valides / invalides?
csrowell
2020-01-15 02:41:57 UTC
view on stackexchange narkive permalink

Pour la validation d'entrée sur un site Web, y a-t-il des problèmes de sécurité à divulguer à l'utilisateur exactement quels caractères sont valides ou non valides pour un champ donné?

CWE-200: Information Exposure dit qu'il faut essayer de ne pas divulguer des informations "qui pourraient être utiles dans une attaque mais qui ne sont normalement pas disponibles pour l'attaquant". Un exemple spécifique serait d'empêcher un système d'exposer des traces de pile (traité par CWE-209: Exposition d'informations via un message d'erreur).

Doit-on s'assurer que les messages d'erreur sont vagues, comme "Le texte que vous avez entré contient des caractères invalides"?

Est-ce une faille de sécurité d'inclure les expressions régulières utilisées pour valider l'entrée dans le code côté client, tel que JavaScript, qui seraient visibles par les attaquants? L'alternative, la validation des entrées côté serveur, réduirait quelque peu la convivialité car elle nécessiterait plus de communication backend (par exemple, cela pourrait entraîner une réponse du site et un affichage des erreurs plus lent).

Ou est-ce une forme de «sécurité par l'obscurité» car l'utilisateur / attaquant peut déduire quels caractères sont valides en soumettant à plusieurs reprises différents caractères pour voir s'ils produisent des erreurs?

Vaut-il la peine de toucher l'expérience utilisateur pour ralentir potentiellement une attaque?

Je dois noter, pour autant que je sache, la feuille de triche de validation d'entrée et le guide de développement de la validation des données ne fournissent pas d'orientation sur ce sujet.

Modifier le 17/01/2020:

Il y a eu plusieurs questions (y compris des réponses sur lesquelles je me suis efforcé d'écrire des commentaires depuis lors supprimé) quant à pourquoi on devrait faire une validation d'entrée.

Tout d'abord, merci à @Loek pour le commentaire pointant sur la Norme de vérification de la sécurité des applications de l'OWASP qui fournit des conseils sur les mots de passe aux pages 21 et 22: "Vérifiez qu'aucune règle de composition de mot de passe ne limite la type de caractères autorisé. Il ne devrait y avoir aucune exigence de majuscules ou de minuscules, de chiffres ou de caractères spéciaux. ".

Je pense que nous pouvons tous convenir que limiter les caractères dans un mot de passe est généralement une mauvaise idée (voir Réponse de @ Merchako). Comme @emory le souligne, cela ne peut probablement pas être une règle absolue (par exemple, j'ai vu de nombreuses applications mobiles qui utilisent un "NIP" secondaire plus facile à utiliser pour sécuriser l'application, même si quelqu'un d'autre y a accès pour me connecter à l'appareil.) Je n'avais pas vraiment de mots de passe en tête lorsque j'ai posé cette question, mais c'est dans une direction que les commentaires et les réponses sont allés. Pour les besoins de cette question, considérons que c'est pour les champs sans mot de passe.

La validation d'entrée fait partie de la "défense en profondeur" pour sites Web, services Web et applications pour empêcher les attaques par injection. Les attaques par injection, comme indiqué par l'OWASP, "peuvent entraîner la perte de données, la corruption ou la divulgation à des parties non autorisées, la perte de responsabilité ou le refus d'accès. L'injection peut parfois conduire à une prise de contrôle complète de l'hôte. L'impact sur l'entreprise dépend des besoins de application et données. "

Voir la vulnérabilité n ° 1 de OWASP, A1-Injection et CWE-20: Improper Input Validation pour plus d'informations. Notez qu'ils disent tous les deux que la validation d'entrée n'est pas une défense complète mais plutôt une couche de cette «défense en profondeur» pour les produits logiciels.

Les commentaires ne sont pas destinés à une discussion approfondie;cette conversation a été [déplacée vers le chat] (https://chat.stackexchange.com/rooms/103507/discussion-on-question-by-csrowell-is-it-a-security-vulnerability-to-tell-a-utilisateur).
@RoryAlsop Je ne vois pas vraiment pourquoi cela a été déplacé vers le chat - ce n'est pas comme s'il y avait une conversation rapide aller-retour en cours ici ... Cela déforme aussi mes liens vers des commentaires spécifiques ... C'est aussiterrible utilisabilité car la plupart des gens n'iront pas cliquer sur un lien pour lire une conversation ....
Plus de 20 commentaires nuisent à la lisibilité, et les commentaires ne sont explicitement pas à discuter.Le chat est l'endroit idéal pour cela.Tout ce qui est pertinent de cette discussion peut ensuite être incorporé dans les messages si nécessaire.
Je pensais que c'est pourquoi ils cachent les commentaires avec des votes faibles / non.Ce n'est pas comme s'il montrait chaque commentaire par défaut.Maintenant, vous n'avez aucune idée de quels commentaires étaient importants ou avec lesquels les gens étaient d'accord (il y a eu des commentaires avec plus de 40 votes).Je ne vois aucun moyen d'afficher le nombre de votes dans le chat.Autant que je sache, ils ont été anéantis.
c'est par conception.Les commentaires sont destinés à être temporaires pour demander ou suggérer des améliorations à un message, ou pour gagner en clarté.
Sept réponses:
Steffen Ullrich
2020-01-15 03:02:15 UTC
view on stackexchange narkive permalink

... qui pourrait être utile dans une attaque mais qui n'est normalement pas disponible pour l'attaquant

La connaissance des caractères d'entrée invalides est utile mais peut facilement être trouvée par l'attaquant avec juste quelques essais. Ainsi, ces informations ne sont pas vraiment secrètes et garder tous les utilisateurs ignorants de ce qui ne va pas ne dissuade pas réellement les attaquants, cela éloigne seulement les utilisateurs innocents car ils ne peuvent pas continuer.

OMI, c'est tout le sujet de la question.Je suis d'accord avec la réponse, mais la même chose se produit avec la version du serveur, si elle est divulguée via les en-têtes HTTP.Ce dernier, cependant, entre dans le champ d'application de la CWE car 1) la divulgation des caractères d'entrée est * utile * pour l'utilisateur et facile à découvrir et 2) la version du logiciel serveur * n'a aucun effet d'utilisation / compatibilité * tout en augmentant la surface d'attaque
@usr-local-ΕΨΗΕΛΩΝ: En cas de caractères invalides, l'attaquant peut rapidement trouver lesquels sont invalides en en essayant quelques-uns.Dans le cas de la version du serveur, l'attaquant ne peut pas facilement déterminer la version à moins que le serveur ne la fournisse explicitement (dans l'en-tête).Par conséquent, fournir la version du serveur est un problème tout en fournissant les caractères non valides.
Bien que ce ne soit pas une faille de sécurité en soi, lorsqu'un site Web me dit de ne pas utiliser ``, `" `, une barre oblique inverse et un` -` dans mon mot de passe, cela remet immédiatement en question s'ils ont des problèmes d'injection SQL et / ou utilisent le stockage de texte brutpour les informations saisies.
@SeinopSys Cela pourrait aussi être une approche de sécurité en profondeur.Vous pouvez utiliser des requêtes paramétrées partout, mais également interdire les caractères d'injection SQL typicall s'ils peuvent être évités dans certaines entrées.Donc, si quelqu'un insère une vulnérabilité possible pendant le développement, vous avez une chance qu'elle soit un peu plus difficile à exploiter.
"La version du logiciel serveur n'a aucun effet d'utilisation / compatibilité tout en augmentant la surface d'attaque" ** c'est la sécurité par obscurité, et cela n'empêche rien **.Plutôt que de cacher la version du serveur, il faut la mettre à jour vers une version sécurisée.Mentir / cacher cela ne fait rien pour éviter le problème et ne fait que rendre l'attaque légèrement plus difficile.
@Vinz243: Ce ne serait la sécurité par l'obscurité que si le serveur exécutait une version logicielle non sécurisée et que l'administrateur le saurait et ne le corrige pas.Mais sinon, cacher ces informations n'est qu'une partie d'une défense en profondeur, c'est-à-dire qu'il est plus difficile pour l'attaquant d'obtenir des informations sur l'infrastructure.
Security.SE a déjà de nombreuses questions dédiées sur le thème du masquage des versions de serveur: [Masquer la version - utile ou simplement la sécurité par l'obscurité?] (Https://security.stackexchange.com/q/14709/10843), [Affichequel serveur j'exécute sur les pages d'erreur un risque de sécurité?] (https://security.stackexchange.com/q/4940/10843), et plus généralement [Le rôle valide de l'obscurité] (https: //security.stackexchange.com / q / 2430/10843).
Merchako
2020-01-15 19:42:36 UTC
view on stackexchange narkive permalink

Créer une situation psychologiquement frustrante pour les utilisateurs pourrait les inciter à prendre des décisions moins sûres. Par exemple, ils essaient d'écrire un mot de passe en suédois, mais votre saisie refuse le caractère å sans explication. Au lieu de choisir un bon mot de passe différent sans å , ils lèvent la main et utilisent password123 - un mot qui est facilement vaincu par une attaque par dictionnaire.

Ainsi , vous avez tenté de créer un système "plus sécurisé" par l'obscurité, mais une fois que nous avons pris en compte les comportements des utilisateurs, il est en fait moins sécurisé.

Les caractères valides sont finalement détectables par des moyens systématiques. Les cacher ne vaut pas les dommages que vous pourriez causer aux comportements des utilisateurs.


Pour plus d'informations, reportez-vous à " Sécurité et biais cognitif: exploration du rôle de l'esprit" et " Mesure des incidences sur la sécurité des politiques de mot de passe à l'aide de Cognitive Behavioral Modélisation basée sur les agents "par Sean Smith et al.

Bon point.Quelqu'un ici a dit: "La sécurité au détriment de la commodité vient au détriment de la sécurité".
mentallurg
2020-01-15 03:32:36 UTC
view on stackexchange narkive permalink

Cela dépend.

Si le message décrit une erreur du point de vue des utilisateurs normaux, comme "Le 3ème caractère doit être un chiffre", ce n'est pas une faille de sécurité. Mais afficher l'expression régulière utilisée pour la validation signifie divulguer les détails d'implémentation , ce qui peut être une faiblesse, par ex. certaines bibliothèques utilisent largement les appels récursifs et certaines expressions peuvent provoquer un débordement de pile ou une utilisation élevée de la mémoire et du processeur, ce qui peut conduire à un DoS.

Le CWE-200 définit la divulgation d'informations comme une faiblesse uniquement si l'utilisateur n'est pas explicitement autorisé à accéder à ces informations . Vous envisagez l'entrée de l'utilisateur. Cela signifie que l'utilisateur est autorisé à entrer ces informations et donc autorisé à voir ces informations et naturellement il est autorisé à voir tous les messages d'erreur de validation liés à cette entrée.

Trace de pile ainsi que d'autres messages techniques peuvent fournir des informations sur les technologies utilisées dans l'application (par exemple, quelle version de quelles bibliothèques sont utilisées), sur l'environnement (par exemple, disposition du répertoire et autorisations, type et version du système d'exploitation), etc. Un attaquant peut utiliser ces informations pour choisissez des exploits pour ces technologies, bibliothèques, systèmes d'exploitation, etc. C'est pourquoi la divulgation de telles informations à l'utilisateur est potentiellement une faiblesse.

Ne pas expliquer à l'utilisateur ce qui ne va pas dans sa saisie est définitivement une mauvaise UX, mais pas la sécurité amélioration.

Ne confondez pas cela avec des cas similaires, lorsque les données sont sensibles et que toute validation y relative peut être sensible. Par exemple, si l'utilisateur a entré des lettres dans le champ où vous prévoyez un an, expliquer une telle erreur à l'utilisateur est sûr. Mais si l'utilisateur entre une adresse e-mail et que vous vérifiez si cette adresse est enregistrée dans votre système, alors toute information (l'adresse est connue, l'adresse est inconnue) peut être une faiblesse. C'est pourquoi lorsque vous allez implémenter des messages de validation ou tout autre commentaire concernant les entrées de l'utilisateur, évaluez les conséquences. Mais interdire tout retour par défaut pour tous les champs peut être une mauvaise expérience utilisateur avec un faux sentiment de sécurité.

Désolé, je n'avais pas l'intention de suggérer de montrer à l'utilisateur le RegEx.Il s'agissait plutôt de se demander si un RegEx ne devait pas être intégré dans du code côté client.Je réviserai ma question pour que cela soit plus clair.
@csrowell N'oubliez pas que TOUT ce qui est côté client est "affiché".Même si vous ne l'affichez pas à l'écran, il est montré au type d'utilisateur malveillant (qui examine certainement tout le code client qu'il est transmis).
@Thomas: oui, et je pense que c'était le but du PO.Est-il sûr d'utiliser des expressions régulières dans JS côté client dans le code qui aide l'utilisateur à comprendre pourquoi leur entrée était invalide?(Parce que cela révélera les règles aux attaquants).
@PeterCordes Je ne vois pas en quoi cela compte, car la vérification doit toujours être dupliquée sur le serveur (sinon un utilisateur malveillant pourrait créer un mot de passe inacceptable et le soumettre, en contournant la vérification côté client).Si vous effectuez déjà des vérifications côté client en plus de côté serveur (par exemple pour réduire la charge du serveur en cas de tentatives non valides), il est inutile de masquer les caractères inacceptables,
@DanM.: Oui, la réponse à la question est que garder cette obscurité nuit à la convivialité plus qu'elle ne permet de défendre quoi que ce soit.J'essaie seulement de dire ce que le PO demandait, pas de le demander moi-même.
Filipe dos Santos
2020-01-15 02:56:49 UTC
view on stackexchange narkive permalink

Ce n'est que l'un des nombreux scénarios où des compromis de sécurité sont attendus en faveur de la convivialité du système.

Cependant, il y a une énorme différence entre l'affichage des traces de pile (mauvaise gestion des erreurs) et nier les caractères attendus ou interdits dans un champ de saisie.

Pour la plupart des scénarios, on peut affirmer que le refus de savoir quels caractères sont attendus ou interdits dans un champ de saisie n'est pas une faille de sécurité du tout, si d'autres mécanismes de sécurité sont en place, comme la limitation des tentatives de mot de passe.

Il peut être déterminé à l'aide d'un cadre de modélisation des menaces qu'il s'agit d'un risque accepté du système.

dandavis
2020-01-15 03:57:37 UTC
view on stackexchange narkive permalink

L'obscurité n'est pas la sécurité. Un bon système est sécurisé même lorsqu'un attaquant en sait tout. Dans votre cas, réduire les estimations de fissuration gaspillées d'un certain pourcentage, disons 25%, ne devrait pas faire ou défaire l'aspect pratique de la fissuration: 1 billion d'années est tout aussi pratique que 0,75 billion d'années. Le fait de ne pas masquer les détails d'implémentation aide également les nouveaux bons à se défendre.

Il y a aussi des considérations sociales. Un signe «BEWARE OF DOG» peut divulguer des détails d'implémentation de sécurité, mais il décourage également une certaine échelle d'attaques courantes. Le chien aide, connu ou inconnu, mais un signe pourrait réduire les coûts d'entretien de la clôture, ce qui libère des ressources pour mener d'autres batailles.

"Un bon système est sécurisé même lorsqu'un attaquant sait tout sur lui."Cette sagesse conventionnelle est bien sûr vraie.Mais si vous n'avez aucun avantage à divulguer des informations à l'utilisateur, ne le faites pas.En effet, les systèmes compliqués ne sont pratiquement jamais sécurisés à 100%.Dans ce cas précis, il y a évidemment un énorme avantage en termes de convivialité, et certainement pas un problème de sécurité, mais vous devez être prudent lorsque vous appliquez cette logique au cas général.
bolov
2020-01-17 20:49:45 UTC
view on stackexchange narkive permalink

Les autres réponses montrent à quel point le fait de divulguer ceci n'est pas un problème de sécurité.

Je soutiendrai une anecdote vraie selon laquelle ne pas divulguer peut conduire non seulement à frustrer les utilisateurs, mais encore à réduire la sécurité.

Cela m'est arrivé plus d'une fois sur des sites qui n'indiquaient pas clairement les caractères autorisés. À ce moment-là, je n'utilisais pas de générateur de mots de passe, j'avais donc un schéma mental pour me souvenir des mots de passe. Cela impliquait d'utiliser quelques caractères spéciaux comme $ @. & . Quelques tentatives frustrées où tout ce que j'ai obtenu était des "caractères invalides dans le mot de passe" et j'ai progressivement commencé à éliminer les caractères spéciaux. Puis vint "votre mot de passe n'est pas assez sûr, essayez d'ajouter des chiffres et des symboles" ... ouais ... Je suis vraiment détendu à ce stade.

J'ai finalement réussi à accepter mon mot de passe. Ce qui non seulement contenait un seul caractère spécial, mais ne correspondait à aucun de mes schémas de mémorisation des mots de passe, alors j'ai dû ... hmm ... le stocker ailleurs (c'était avant même de connaître les gestionnaires de mots de passe, alors je vais laisser vous imaginez comment je l'ai sécurisé. Je vais vous dire que c'était comme un hélicoptère et comme une ficelle).

Sango
2020-01-15 18:45:33 UTC
view on stackexchange narkive permalink

Je ne vois pas de problème dans la divulgation du jeu de caractères parmi lesquels l'utilisateur peut choisir, tant que ces règles sont d'une part également appliquées et vérifiées. C'est-à-dire que si l'utilisateur n'est pas autorisé à utiliser \ dans le champ, il ne suffit pas de le vérifier dans l'entrée JS, mais également avant de le saisir, c'est-à-dire dans le DB et lorsque les données sont utilisées. Les règles doivent donc s'appliquer tout le temps (TOCTOU). L'autre partie est qu'il n'y a aucun problème à réduire le jeu de caractères, tant que l'entropie est toujours donnée. Vous pouvez réduire les caractères du mot de passe à "a" et "b", mais vous devez ensuite augmenter la longueur minimale de PW en conséquence (et vérifier qu'ils ne maintiennent pas seulement la touche "a" enfoncée jusqu'à ce qu'elle soit suffisamment longue). Avec un mot de passe assez long (aléatoire), ce serait aussi un mot de passe sécurisé.En fin de compte, tout ce qu'il y a à un caractère sont des bits, et tout le monde sait que ce sont 0 & 1, donc l'alphabet (réel) est toujours connu, comment il y a de nombreux arrangements possibles, à vous de préciser (et de vérifier).



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...