web-dev-qa-db-fra.com

Une vulnérabilité de dépassement de tampon signifie-t-elle toujours une vulnérabilité d'exécution de code?

Étant donné que les débordements de tampon permettent toujours à un pirate malveillant d'écrire en dehors du tampon et d'écraser le pointeur de retour sur un shellcode que le pirate malveillant peut placer, cela signifie-t-il qu'une exploitation réussie d'un débordement de tampon de pile signifie toujours la possibilité d'invoquer un shell s'il est fait de la bonne manière ? Du moins en théorie, si vous supposez que le DEP et l'ASLR ne sont pas en place.

45
Sree

Non, un débordement de tampon peut:

  • Soyez contre un tampon sur le tas et non sur la pile. Cela pourrait encore conduire à l'exécution de code mais sera beaucoup plus compliqué à exploiter.
  • Soyez limité en taille, afin de ne pas pouvoir remplacer les pointeurs de retour. (par exemple, être capable d'écrire seulement 1 octet au-delà du tampon)
  • Soyez limité dans lequel les octets peuvent être écrits, empêchant les pointeurs appropriés d'être écrits.
  • Écraser les cookies de pile, qui sont détectés avant l'utilisation de l'adresse de retour. À moins que le cookie ne soit divulgué, l'exploit ferait planter le processus la grande majorité du temps, plutôt que de conduire à l'exécution de code.
  • Soyez sur une pile qui grandit, afin de ne pas pouvoir écraser les adresses de retour. Un exploit pourrait toujours être en mesure d'écraser d'autres variables locales, ou le tampon pourrait être passé à une autre fonction, mais ne conduirait pas à une exécution de code aussi fiable que les piles vers le bas.

Certains d'entre eux peuvent encore conduire à l'exécution de code, mais d'autres instances peuvent être impossibles à exploiter.

Cependant, une fois que vous avez trouvé où un débordement de tampon se produit, il est généralement beaucoup plus facile de le corriger que de prouver qu'il ne peut pas être exploité.

70
Douglas Leeder

Douglas donne une réponse correcte. Tous les débordements de tampon ne donnent pas l'exécution de code. Cependant, je sentais qu'il manquait une mise en garde très importante.

Même si un débordement de tampon ne permet pas l'exécution de code arbitraire, cela ne signifie pas qu'il est sûr.

Un débordement de tampon d'écriture vous permet d'écrire sur des données que vous n'êtes pas censé faire. Ces données étant une adresse de fonction n'est qu'un cas spécial. Par exemple, supposons que j'ai une structure utilisateur contenant des champs pour le nom et les privilèges. Il est facile d'imaginer comment la définition de mon nom sur "JosiahhasaverylongnameAdmin" pourrait exploiter une vulnérabilité grave, sans aucune exécution de code arbitraire.

Pour un autre exemple du monde réel, si vous vous souvenez de Heartbleed, c'est un débordement de tampon. C'est juste un débordement de lecture plutôt qu'un débordement d'écriture. Aucune chance d'exécuter du code là-bas, mais une violation dévastatrice de la confidentialité quand même.

46
Josiah

La réponse simple est non, tous les débordements de tampon ne sont pas garantis pour conduire à l'exécution de code. Le débordement pourrait être trop petit pour écraser les pointeurs/valeurs nécessaires, incapable de contrôler la partie débordante pour écraser les choses, ou peut-être trop grand qui pourrait tuer les cookies/canaris de la pile, etc.

0
akshayknows