Question

Java a-t-il des dépassements de mémoire tampon? Si oui pouvez-vous me donner des scénarios?

Était-ce utile?

La solution

Etant donné que les chaînes Java sont basées sur des tableaux de caractères et que Java vérifie automatiquement les limites des tableaux, les dépassements de mémoire tampon ne sont possibles que dans des scénarios inhabituels:

  1. Si vous appelez du code natif via JNI
  2. Dans la machine virtuelle elle-même (généralement écrite en C ++)
  3. L'interpréteur ou le compilateur JIT ne fonctionne pas correctement (vérifications des limites obligatoires du bytecode Java)

Autres conseils

Les langages gérés tels que Java et C # ne rencontrent pas ces problèmes, mais les machines virtuelles spécifiques (JVM / CLR / etc) qui exécutent le code peuvent le faire.

À toutes fins utiles, non.

Java a un tableau vérification des limites qui vérifie que les données ne sont pas accessibles depuis une zone extérieure à la tableau alloué. Lorsque l'on tente d'accéder à une zone dépassant la taille du tableau, un ArrayOutOfBounds une exception sera levée.

S'il existe un dépassement de mémoire tampon, il s'agit probablement d'un bogue de la machine virtuelle Java et, à ma connaissance, ce n'est pas le comportement prévu qui est écrit dans les spécifications du langage Java ni dans les spécifications de la machine virtuelle Java.

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

  1. Un bug dans le framework (ceux-ci existaient dans le passé et pourraient bien être à nouveau)
  2. Utilisation de JNI (n'utilise plus le code géré)

Un dépassement de tampon en ce sens que vous avez un code utilisant un tampon et que votre code est responsable de son analyse correcte, sans quoi, il est possible de le faire. Par exemple, vous pourriez écrire un analyseur syntaxique XML et une personne pourrait vous adresser une requête mal formée (ou légitime mais peu commune) qui, en raison de la conception de votre analyseur syntaxique, écrase les données précédemment validées avec des données utiles qui entraîneraient un mauvais comportement de votre application.

Cette dernière forme est moins probable, mais une fonction de nettoyage de chaîne SQL mal écrite et largement distribuée, avec un problème de ce type, constituerait une cible invitante.

Oui et non. Non, en ce sens que vous ne pouvez pas vraiment vous ouvrir par erreur à une vulnérabilité de débordement de mémoire tampon, car il s'agit d'un modèle de mémoire gérée. Toutefois, il peut exister des vulnérabilités de dépassement de mémoire tampon dans la JVM et le JDK. Voir cet avis Secunia:

http://secunia.com/advisories/25295

Ou consultez ces anciens avis sur plusieurs vulnérabilités antérieures de JDK et JRE:

  • Vulnérabilités de saturation de nombre entier et de mémoire tampon dans l'environnement d'exécution Java (JRE) & "; unpack200 &"; L'utilitaire de décompression JAR peut entraîner une escalade des privilèges https://download.oracle.com/sunalerts/1020225.1 .html

      

    Vulnérabilités de nombre entier et de dépassement de mémoire tampon dans Java Runtime   Environnement (JRE) avec décompression des applets et Java Web Start   applications utilisant le " unpack200 " L’utilitaire de décompression JAR peut permettre une   applet ou application non approuvée pour élever les privilèges. Par exemple,   une applet non approuvée peut s'octroyer elle-même les autorisations de lecture et d'écriture   fichiers locaux ou exécuter des applications locales accessibles au   utilisateur exécutant l'applet non approuvé.

         

    Sun reconnaît avec grâce, & "; regenrecht &"; travailler avec l'iDefense   VCP ( http://labs.idefense.com/vcp/ ) et Chris Evans de Google pour   porter ces questions à notre attention.

  • Plusieurs vulnérabilités ont été identifiées dans Sun Java Development Kit (JDK) et Java Runtime Environment (JRE). https://security.gentoo.org/glsa/200705-23

      

    Une vulnérabilité non spécifiée impliquant une " utilisation incorrecte du système   classes " a été rapporté par l'équipe de sécurité de Fujitsu. Aditionellement,   Chris Evans de l'équipe de sécurité Google a signalé un dépassement d'entier   entraînant un débordement de mémoire tampon dans l'analyseur ICC utilisé avec JPG ou BMP   fichiers, et un appel open () incorrect à / dev / tty lors du traitement   certains fichiers BMP.

Les machines virtuelles Java (et .Net) interceptent un 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 causer des problèmes de sécurité. Si des utilisateurs malveillants peuvent déclencher des exceptions en saisissant une entrée non valide, ils peuvent par exemple lancer des attaques par déni de service.

Comme cela a déjà été souligné, Java a pour langage de contrôler tous les accès à la mémoire. S'il y a une erreur, c'est la JVM qui est responsable et non le programme. Cependant, il convient de noter qu’il s’agit d’un argument similaire aux fuites de mémoire en Java; Bien qu’il soit impossible de détruire la pile, une exception ArrayOutOfBoundsException au mauvais endroit, qui n’est pas gérée correctement, risque de finir par gâcher votre système.

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 créer, généralement par dépassement d'entier.

Par exemple, les éléments suivants ne suffisent pas pour vérifier les limites:

/* !! WRONG !! */ 0 <= off && 0 <= len && off+len <= buff.length /* !! WRONG !! */

IIRC, StringBuffer eu un jour un bogue comme celui-là, mais vous ne pouviez rien en faire d'intéressant.

Vous pourriez peut-être causer un dépassement de mémoire tampon dans un programme Java si vous utilisiez la fonction JNI (Java Native Interace) pour appeler du code externe, et si le code externe présentait un problème exploitable. C'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épassement de tampon, mais vous pouvez toujours provoquer un dépassement 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top