Webinaire en vedette : Tests d'API améliorés par l'IA : une approche de test sans code | Voir le séminaire
Aller à la section
Analyse du baron Samedit (Sudo CVE-2021-3156)
Baron Samedit est une vulnérabilité majeure de débordement de tampon impactant l'écosystème Linux. En tant que nouvelle forme de vulnérabilité, tout le monde ne comprend pas ce qu'est le Baron Samedit et comment il peut affecter les distributions Linux/Unix. Cet article vous expliquera tout ce que vous devez savoir sur cette pseudo-vulnérabilité.
Aller à la section
Aller à la section
Le 26 janvier 2021, Qualys a publié un blog décrivant leurs découvertes sur la vulnérabilité de débordement de tas dans sudo, CVE-2021-3156, qu'ils ont nommé «Baron Samedit».
Sudo est un outil central dans de nombreuses distributions Linux / Unix qui permet aux utilisateurs d'exécuter des programmes avec des privilèges de sécurité élevés. C'est un composant couramment inclus et installé avec Linux, BSD, macOS, AIX, Solaris et autres.
Analyse de Baron Samedit (CVE-2021-3156) avec Insure ++
Je vais faire une démonstration de Parasoft Assurer ++ détection d'écrasement et d'écrasement de la mémoire à l'aide de cette vulnérabilité. Insure ++ est un outil de débogage de mémoire qui utilise des techniques d'instrumentation brevetées pour identifier les fuites et autres problèmes de mémoire.
Insure ++ rend la découverte, la compréhension et la résolution de tels bogues beaucoup plus faciles que l'utilisation d'outils et de techniques de débogage traditionnels.
Baron Samedit (CVE-2021-3156) Présentation de la vulnérabilité
Lorsque des versions vulnérables de sudo (v1.8.2 - v1.9.5p1) sont exécutées avec une commande en mode shell et que l'argument de ligne de commande se termine par une seule barre oblique inverse, un débordement de tampon du utilisateur_args string se produit en raison d'une faille dans la manière dont la suppression des arguments de ligne de commande est effectuée.
Lorsque vous annulez l'échappement du dernier caractère «\», la fonction écrasera le terminateur nul de la chaîne, ce qui entraînera un dépassement de la mémoire tampon. Pour une analyse détaillée de la vulnérabilité, consultez l'original Blog Qualys. Je couvrirai des détails similaires lorsque nous analyserons les résultats d'Insure ++.
Configuration avec Insure ++
Pour répliquer la vulnérabilité dans Insure ++, nous devons télécharger une version vulnérable de sudo et la compiler à l'aide d'Insure ++. La source de sudo v1.9.5p1, la dernière version vulnérable, est disponible ici sur le site sudo. Après avoir déballé le code source, assurez-vous qu'Insure ++ est sur votre PATH et définissez votre CC à "assurer gcc" avant d'exécuter configure.
Vous devriez également envisager de définir un préfixe différent afin de ne pas remplacer le sudo du système, le cas échéant. De là, courez a prendre une et make install comme d'habitude.
Lancer l'exploit
L'article Qualys a fourni une simple commande de validation de principe qui démontre la vulnérabilité de dépassement de mémoire tampon. C'est comme suit:
sudoedit -s '\' 'perl -e' affiche "A" x 65536 ''
remplacer sudoedit avec le chemin d'accès à celui que vous avez compilé et exécutez la commande.
Nous pouvons dire de la malloc message que la preuve de concept s’est exécutée correctement.
Analyse des résultats
Voyons ce qu'Insure ++ a trouvé en examinant les résultats dans la fenêtre Insra.
Nous pouvons voir que la première erreur de mémoire est un dépassement de capacité de lecture qui se produit dans sudoers.c à la ligne 971. Insra nous dit que le de Le pointeur lit un octet en dehors du bloc de mémoire de deux octets vers lequel il pointe.
Notez que le bloc de mémoire est de deux octets car le premier est le caractère «\» et le second est le terminateur nul. Une trace de pile nous montre que cela se produit dans le set_cmnd () la fonction.
La prochaine erreur de mémoire est une lecture à partir d'une mauvaise adresse dans sudoers.c à la ligne 972. Depuis le de pointeur est déjà hors limites, comme nous l'avons vu dans la première erreur de mémoire, tout accès indexé utilisant de sera un mauvais index.
L'erreur de mémoire suivante est un dépassement de capacité de lecture qui s'est produit à la ligne 974. Ici, nous déréférencerons le pointeur hors limites de et l'écrire dans le tampon pointé par le à aiguille.
Notez qu'Insure ++ suit l'origine de ces blocs de mémoire dans toutes les erreurs de mémoire précédentes. Insure ++ est conscient que le bloc de mémoire que nous lisons est en dehors des limites de ce qui a été défini à l'origine comme le argv paramètre dans la principale() méthode en sudo.c.
L'erreur de mémoire suivante est un débordement d'écriture dans la même instruction qu'auparavant. Maintenant, Insure ++ déclenche lors de l'écriture dans le tampon le à le pointeur pointe sur. Notez que la taille du tampon à pointe vers 65539 octets. La chaîne de commande de débordement que nous avons fournie dans la preuve de concept était un caractère «\», un espace, 65536 caractères «A» et un terminateur nul implicite totalisant 65539 octets.
La prochaine erreur de mémoire se produit en dehors de if vérifiez les caractères «\». Pourquoi cela provoque-t-il un débordement d'écriture maintenant? Étant donné que les erreurs de mémoire précédentes ont corrompu le à pointeur pour pointer en dehors de son bloc mémoire, toutes les opérations d'écriture ultérieures avec ce pointeur entraîneront un débordement d'écriture.
Ici, nous voyons la corruption de mémoire finale où le programme null termine la chaîne. C'est absolument le bon comportement! Cependant, le débordement d'écriture se produit car le à Le pointeur est corrompu et pointe déjà en dehors du bloc de mémoire qu'il devrait être.
Conclusion
On voit que Parasoft Insure ++ a rendu l'analyse de cette vulnérabilité mémoire beaucoup plus facile. Nous avons pu identifier rapidement l'emplacement des débordements de lecture et d'écriture ultérieurs, savoir quelles variables étaient impliquées et voir comment le pointeur invalide affectait les opérations de mémoire ultérieures. Lorsqu'il est combiné avec une bonne couverture de test et un fuzzing, Insure ++ peut rendre de nombreux bogues de mémoire complexes beaucoup plus simples à comprendre, diagnostiquer et corriger.