Java at-il des dépassements de tampon? Si oui, pouvez-vous me donner des scénarios?
Puisque Java Les chaînes sont basées sur des tableaux de caractères et Java vérifie automatiquement les limites du tableau, les débordements de tampon ne sont possibles que dans des scénarios inhabituels:
Les langages gérés tels que Java et C # n'ont pas ces problèmes, mais les machines virtuelles spécifiques (JVM/CLR/etc) qui exécutent réellement le code peuvent le faire.
À toutes fins utiles, non.
Java a un tableau vérification des limites qui vérifiera que les données ne sont pas accessibles à partir de la zone en dehors du tableau alloué. Quand on essaie d'accéder à une zone qui dépasse la taille du tableau, une exception ArrayOutOfBounds
sera levée.
S'il y a un dépassement de tampon, c'est probablement à partir d'un bogue dans la machine virtuelle Java, et ce n'est pas, à ma connaissance, le comportement prévu qui est écrit dans le Java ni des spécifications de la machine virtuelle Java Virtual Machine.
Un débordement de tampon au sens strict d'écraser la pile ou le tas lui-même nécessiterait:
Un débordement de tampon dans le sens où vous avez du code utilisant un tampon et que votre code est responsable de l'analyser correctement, mais ne pas le faire est possible. Par exemple, vous pouvez écrire un analyseur XML et quelqu'un peut vous fournir une demande mal formée (ou légitime mais peu commune) qui, en raison de la conception de votre analyseur, écrase les données précédemment validées avec une charge utile qui entraînerait un mauvais comportement de votre application.
Cette dernière forme est moins probable mais une fonction de nettoyage de chaîne sql mal écrite largement distribuée qui avait un problème tel que celui-ci serait une cible invitante.
Les machines virtuelles Java (et .Net) interceptent du code qui tente d'écrire en dehors de la mémoire réservée. Les applications qui ne gèrent pas cela correctement peuvent toujours provoquer des problèmes de sécurité. Si des utilisateurs malveillants peuvent déclencher des exceptions en entrant des entrées non valides, ils peuvent faire des attaques par déni de service par exemple.
Il est possible pour une méthode d'écrire dans des entrées valides d'un tableau qu'elle n'avait pas l'intention de faire, généralement via un débordement d'entier.
Par exemple, ce qui suit n'est pas suffisant pour vérifier les limites:
/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */
IIRC, StringBuffer
a déjà eu un bug comme ça, mais il n'y avait rien d'intéressant que vous puissiez faire avec.
Comme cela a déjà été souligné, Java a, en tant que langage, une vérification des limites sur tous les accès à la mémoire, et s'il y a une erreur ici, la JVM est en faute et non le programme. Cependant, ce doit être noté, qui est un argument similaire aux fuites de mémoire en Java; bien qu'il ne soit pas possible de casser la pile, une ArrayOutOfBoundsException au mauvais endroit, qui n'est pas gérée correctement, peut encore finir par visser votre système.
Il est possible que vous provoquiez un débordement de tampon dans un programme Java si vous utilisiez la fonction Java Native Interace (JNI) pour appeler du code externe et le code externe avait un problème exploitable. Ceci est assez rare, car la plupart des applications évitent d'utiliser JNI dans la mesure du possible.
L'une des principales caractéristiques de Java est la sécurité. Les programmes écrits dans des langages interprétés ne sont pas sujets à l'exploit de débordement de tampon, mais vous pouvez toujours provoquer un débordement de tampon dans Interpreter lui-même. Bien que ce sera difficile De même Python est également un langage interprété et est à l'abri du débordement de tampon.