web-dev-qa-db-fra.com

Java a-t-il des débordements de tampon?

Java at-il des dépassements de tampon? Si oui, pouvez-vous me donner des scénarios?

90
ecleel

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:

  1. Si vous appelez du code natif via JNI
  2. Dans la JVM elle-même (généralement écrite en C++)
  3. L'interpréteur ou le compilateur JIT ne fonctionne pas correctement (vérification des limites imposées par le bytecode Java)
102
Michael Borgwardt

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.

24
Brian Rasmussen

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

13
coobird

Un débordement de tampon au sens strict d'écraser la pile ou le tas lui-même nécessiterait:

  1. Un bug dans le framework (ceux-ci ont existé dans le passé et pourraient bien recommencer)
  2. L'utilisation de JNI (essentiellement n'utilisant plus de code managé)

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.

9
ShuggyCoUk

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.

4
Mendelt

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.

3

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.

3
falstro

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.

2
Tim Howland

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.

1