Ce n'est pas tous les jours que l'on peut appliquer les leçons de la cryptanalyse de la Seconde Guerre mondiale à ses propres applications web. Mais aujourd'hui, c'est exactement ce que nous allons faire. En fait, nous allons voir comment même l'un des outils cryptographiques modernes les plus puissants peut être mis en échec par la même méthode qu'Alan Turing a utilisée pour casser la machine Enigma, qui était l'outil cryptographique le plus puissant de son époque, si les personnes chargées de la mise en œuvre commettent les mêmes erreurs que Turing dans la transmission des messages.
Examinons une API que j'ai évaluée récemment, pour voir comment elle a évité le problème qui a aidé les Alliés à battre les puissances de l'Axe pendant la Seconde Guerre mondiale.
Une API pour le commerce électronique : Un pot de miel bien sucré
L'exemple que je vais examiner aujourd'hui est l'API d'une entreprise de commerce électronique qui accepte les paiements. En ce qui concerne les cibles d'attaque, il n'y a pas beaucoup plus précieux pour les acteurs malveillants qu'une API de paiement par carte de crédit. C'est pourquoi cette entreprise a décidé d'exposer au monde une clé publique permettant aux consommateurs de l'API de chiffrer toutes les informations relatives aux cartes de crédit soumises pour le traitement des paiements.
En effet, toutes les données soumises par ce formulaire sont cryptées et ne sont jamais envoyées en texte clair. En effet, il est important de protéger toutes les données contre les attaques, et pas seulement le numéro de carte. La date d'expiration et le CVV font partie de l'ensemble qui rend chaque méthode de paiement unique, c'est pourquoi cette entreprise a crypté toutes ces données. L'entreprise n'enverrait jamais ces données en texte clair.
Voici à quoi ressemble un exemple de requête qui traverse le réseau, en utilisant un proxy Charles pour capturer le trafic en tant qu'homme du milieu :
Dans cet exemple, on remarque que deux valeurs hachées sont transmises : paymentHash et cvvHash. Réfléchissons aux données contenues dans ces deux valeurs.
Pour paymentHash, nous avons le numéro de carte de crédit à 16 chiffres, crypté à l'aide de la clé publique publiée pour l'utilisation de cette API. Il est évident que les valeurs disponibles pour le cryptage varieront considérablement.
Pour cvvHash, nous n'avons pas du tout la même situation ! Les CVV ne comportent que 3 chiffres. Si vous ne cryptez que des combinaisons de trois chiffres, un pirate pourrait constituer un dictionnaire complet de seulement 1 000 valeurs différentes (10 valeurs pour chacun des trois chiffres). Avec ce dictionnaire, il peut trouver le CVV de n'importe quelle carte envoyée par l'intermédiaire de cette API. Heureusement, mon client savait comment éviter les attaques connues en texte clair et avait déjà mis en œuvre un remplissage aléatoire pour éviter la même attaque qui a fait tomber les nazis.
Percer l'énigme
Si la machine Enigma a été si difficile à décrypter, c'est en partie parce que sa structure de cryptage des messages était très complexe et que les paramètres étaient fréquemment modifiés. Cependant, comme la machine était utilisée pour des messages militaires, l'équipe de Turing à Bletchley Park a commencé à chercher du texte qui pouvait être attendu dans de nombreux messages.
Un type de message fréquemment envoyé par l'armée allemande était un rapport météorologique, et ces rapports comprenaient le mot allemand pour "météo" au même endroit dans chaque message, suivi des conditions météorologiques connues. Autre exemple, de nombreux messages se terminaient par "Heil Hitler" et certains opérateurs utilisaient des salutations standard. Ces exemples ont également permis de déterminer une partie du texte en clair et des paramètres pour chaque jour.
C'est ce type de vulnérabilité de chiffrement qui aurait pu se produire si cette société de commerce électronique n'avait pas utilisé un remplissage aléatoire pour le CVV, car le nombre de valeurs possibles est très faible.
Éviter la même erreur
En utilisant un pavé aléatoire, l'entreprise s'est assurée que deux méthodes de paiement avec le même CVV ne révéleraient rien sur ce qui est transmis. Voici quelques exemples où la même valeur "777" peut être cryptée pour obtenir des valeurs différentes à l'aide d'un pavé numérique :
$ echo -n 777 | openssl rsautl -inkey public_key.pem -pubin -pkcs |
Comme vous pouvez le constater, les commandes exécutées ci-dessus sont toutes identiques, mais en raison des normes en place dans le cryptage RSA, les valeurs produites sont toutes complètement différentes.
De bons algorithmes de cryptage ne suffisent pas
Cet exemple devrait vous aider à comprendre qu'il ne suffit pas de mettre en place un bon système de cryptage. Même avec des algorithmes de cryptage très sophistiqués, si la même entrée est utilisée à plusieurs reprises, il est possible que les données que vous essayez de transmettre en toute sécurité soient dévoilées. Il est très important, surtout lorsqu'il s'agit d'informations de paiement, de s'assurer qu'il n'est pas facile de deviner les valeurs envoyées sur le câble.
Le stockage des mots de passe est un autre exemple où le rembourrage est important. Les développeurs savent qu'ils doivent utiliser une bonne fonction de hachage à sens unique pour s'assurer qu'ils ne peuvent pas lire les mots de passe soumis par les utilisateurs. Pour ce faire, les développeurs doivent ajouter une chaîne aléatoire (appelée salt ) à tout mot de passe avant de le hacher.
Conclusion
L'intégration de la sécurité dans vos applications web est une tâche extrêmement importante. En veillant à ce que les données sensibles de vos utilisateurs ne soient pas facilement décryptées, vous renforcez la confiance de vos clients et assurez la longévité de votre entreprise. Après tout, personne ne souhaite que son site fasse l'objet d'une couverture médiatique en raison de la fuite des informations de paiement de ses clients. Si vous êtes en mesure de vous assurer que vous ne cryptez pas les mêmes valeurs à plusieurs reprises, vous éviterez une erreur très élémentaire et assurerez la sécurité des données de vos clients.
Pour en savoir plus sur les meilleures pratiques en matière de sécurité, consultez les guides de sécurité de Linode !
Commentaires