Découvrez comment la solution Parasoft Continuous Quality permet de contrôler et de gérer les environnements de test pour fournir des logiciels de haute qualité en toute confiance. Inscrivez-vous pour la démo >>

BLOG

Analyse du baron Samedit (Sudo CVE-2021-3156)

Analyse du baron Samedit (Sudo CVE-2021-3156) Temps de lecture : 4 minutes

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

Capture d'écran de la commande run exploit CVE-2021-4156

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.

Capture d'écran du débordement de lecture Insure ++ sudoers.c (971) pour CVE-2021-4156

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

Capture d'écran d'Insure ++ sudoers.c (972) lecture d'un mauvais index pour CVE-2021-4156

La prochaine erreur de mémoire est une lecture à partir d'une mauvaise adresse dans sudoers.c à la ligne 972. Depuis le À partir 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 À partir de sera un mauvais index.

Capture d'écran du débordement de lecture Insure ++ sudoers.c (974) pour CVE-2021-4156

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

Capture d'écran du débordement d'écriture Insure ++ sudoers.c (974) pour CVE-2021-4156

 

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.

Capture d'écran du débordement de lecture Insure ++ sudoers.c (976) pour CVE-2021-4156

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.

Capture d'écran du débordement d'écriture Insure ++ sudoers.c (978) pour CVE-2021-4156

 

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.

Texte qui lit la détection et la visualisation des erreurs d'exécution et de mémoire avec Parasoft Insure ++ avec bouton d'appel à l'action Télécharger le livre blanc

Écrit par

Anthony Méndez

Anthony est un ingénieur logiciel senior chez Parasoft, se concentrant sur la détection des erreurs d'exécution, l'analyse statique, l'ingénierie inverse, l'analyse de vulnérabilité et l'exploitation.

Recevez les dernières nouvelles et ressources sur les tests de logiciels dans votre boîte de réception.