menu
L'expérience de nos cyber-consultants au service de votre organisation

Audit de code : Quelques vulnérabilités cryptographiques

Actualité publiée par CoESSI le 22/10/2020 | Mise à jour le 27/10/2020 à 14:56
Audit de code : Quelques vulnérabilités cryptographiques

Alors que le monde est confronté à la crise sans précédent de la COVID-19, le nombre d’attaque informatique ne fait qu’augmenter ! Face à ce phénomène, de nouvelles solutions digitales prolifèrent, exposant de plus en plus de données sensibles sur internet.

Pour des raisons d’ergonomie, de coûts et de mise en production rapide, les applications modernes (eg:web) sont conçues avec des architectures de plus en plus sophistiquées, permettant de gérer des données sur des serveurs ou sur internet directement. Cette complexification multiplie les vulnérabilités du fait de la non prise en compte de la sécurité dès la conception (Security-by-design).

Afin de s’assurer du respect des bonnes pratiques de sécurité en développement, la réalisation d’un audit de code est recommandée.

Nous avions décrit dans un précédent article, les différentes méthodologies applicables dans le cadre d’un audit de code et présenté l’outil THEMIS de CoESSI (outil multi-langages). Pour rappel, un audit de code a pour but d’analyser des programmes/modules en profondeur pour identifier les vulnérabilités présentes dans le code source d’une application, et de s’assurer de sa conformité aux bonnes pratiques de développement.

Fort de notre expertise en audit de code, nous exposons dans cet article quatre vulnérabilités cryptographiques (dans un code PHP) :

1.       Utilisation de fonctions de hachage obsolètes comme MD5, SHA1 :

Le hachage est l’opération consistant à calculer, à partir d’une donnée fournie en entrée une empreinte unique servant à identifier rapidement la donnée initiale. Cette fonction doit éviter les collisions (et résister aux préimages). Une collision dans une fonction de hachage est le fait de trouver un couple de données distinctes ayant une empreinte est identique.

 img1.jpg

Une faille qualifiée de « grave » (possibilité de créer des collisions à la demande) est découverte et  indique que MD5 devrait être mis de côté au profit de fonctions plus robustes. En 2005, Xiaoyun Wang et Hongbo ont publié un article [1] dans lequel ils décrivent un algorithme qui peut trouver deux séquences différentes de 128 octets avec le même MD5. Par exemple, la paire :

Ces deux blocs ont le même hachage MD5 79054025255fb1a26e4bc422aef54eb4. L’algorithme utilisé pour générer cette paire a été utilisé par plusieurs chercheurs pour créer des fichiers avec des hachages MD5 identiques.

Les algorithmes de hachage cryptographique tels que MD2, MD4, MD5, MD6, HAVAL-128, HMAC-MD5, DSA (il utilise SHA-1), RIPEMD, RIPEMD-128, RIPEMD-160, HMACRIPEMD160 et SHA-1 ne sont plus considérés comme sécurisés. Avec ces algorithmes, il est trop facile de créer des collisions ou de trouver la donnée associée à une empreinte.

⚠️ Il n’est pas recommandé d’utiliser la fonction md5()  ou la fonction sha1() dans vos applications PHP.


2.       Mauvais choix du mode d’opération dans les fonctions de chiffrement

Le chiffrement des données avec un algorithme de chiffrement par blocs comme AES nécessite le choix du mode d'opération. Les bonnes pratiques préconisent de choisir un mode d’opération comme le GCM (Galois Counter Mode). A l’inverse, il est fortement déconseillé d’utiliser :

-          Le mode ECB (Electronic Codebook). Ce mode est vulnérable car il n'assure pas une confidentialité élevée des messages chiffrés.

-          Le CBC (Cipher Block Chaining) avec PKCS # 5 (ou PKCS # 7) est vulnérable aux attaques du type Padding Oracle Attack.

✔️ Il est conseillé d’utiliser la méthode openssl_encrypt() avec le GCM comme mode de chiffrement.


3.       Mauvaise utilisation de vecteur d’initialisation IV dans les fonctions de chiffrement

Le but d’un vecteur d’initialisation IV est de garantir que le même texte en clair chiffré deux fois produira deux textes chiffrés différents. L’IV doit être aléatoire et imprévisible. Sinon, il expose la valeur chiffrée à des attaques de crypto-analyse comme "Chosen-Plaintext Attacks". Il faut éviter les vecteurs d’initialisation codés en dur comme l’utilisation d’une suite de zéros ainsi que l’utilisation de la clef de chiffrement comme un vecteur d’initialisation. Pour chaque session, la génération d’un vecteur d’initialisation doit être toujours associée à un algorithme de génération aléatoire suffisamment sécurisé.

✔️ Il est conseillé d’utiliser la méthode random_bytes() pour générer les vecteurs d’initialisation.


4.       L’utilisation de générateurs aléatoires faibles

En relation avec le troisième point, la génération des valeurs prévisibles dans un contexte nécessitant une imprévisibilité permet à un attaquant de deviner la prochaine valeur aléatoire générée. Dans ce contexte, un attaquant peut tenter de prédire le jeton de réinitialisation du mot de passe afin d’obtenir les privilèges d’un autre utilisateur.

Les deux fonctions rand() et mt_rand()  reposent sur un générateur de nombres pseudo-aléatoires faible. En effet, elles ne génèrent pas des valeurs sécurisées d'un point de vue cryptographique, et ne doivent pas être utilisées dans un contexte de chiffrement de données. Nous recommandons l’utilisation de random_int()  ou random_bytes().

⚠️ Evitez d’utiliser la fonction rand() et mt_rand() dans vos applications PHP.

Certaines failles de sécurité ne sont pas forcément liées aux quatre vulnérabilités illustrées. 

 

Au vu des vulnérabilités présentées ci-dessus, la réalisation d'un audit de code s'avère indispensable pour obtenir une assurance complémentaire contre les fuites d’information et les altérations de données. 

Réference :  

[1] Wang, Xiaoyun & Yu, Hongbo. (2005). How to Break MD5 and Other Hash Functions. Lecture Notes in Computer Science. 3494. 561-561. 10.1007/11426639_2.


 

CoESSI réalise des audits de code pour ses clients et accompagne fréquemment les développeurs dans la mise en place d’une démarche de développement sécurisé.


expand_less