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

96

Java a-t-il des débordements de tampon? Si oui, pouvez-vous me donner des scénarios?

ecleel
la source
2
Certaines fonctions de la bibliothèque (implémentées en code natif) sont connues pour avoir des bogues. Surtout dans la zone Java 5, de nombreux exploits en profils 2D, sonores ou colorimétriques ont été connus.
eckes le

Réponses:

108

Étant 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 le 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 obligatoires du bytecode Java)
Michael Borgwardt
la source
24

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

Brian Rasmussen
la source
5
C # dans un contexte non sécurisé peut avoir des débordements de tampon. Java en tant que langage interdit entièrement cela (vous devez changer de langue via JNI pour obtenir un accès au pointeur sans modification)
ShuggyCoUk
1
Bon point. Avec un C # non sécurisé, vous n'êtes évidemment plus en bac à sable dans un monde géré confortable.
Brian Rasmussen le
1
D'accord, et même si VOUS n'écrivez aucune opération non sécurisée ou n'effectuez aucune interopérabilité, vous pourriez utiliser une bibliothèque qui le fait. C'est donc quelque chose à surveiller.
BobbyShaftoe le
13

À toutes fins utiles, non.

Java a une vérification des limites du tableau 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, unArrayOutOfBounds exception sera levée.

S'il y a un dépassement de la mémoire tampon, c'est probablement à cause d'un bogue dans la machine virtuelle Java, et ce n'est, à ma connaissance, 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.

coobird
la source
10

Oui et non. Non, dans la mesure où vous ne pouvez pas vraiment créer par erreur, vous ouvrir à une vulnérabilité de dépassement de tampon car il s'agit d'un modèle de mémoire gérée. Cependant, il peut y avoir des vulnérabilités de débordement de 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 JDK et JRE précédentes:

  • Les vulnérabilités de débordement d'entier et de mémoire tampon dans l'utilitaire de décompression JAR "unpack200" de l'environnement d'exécution Java (JRE) peuvent entraîner une augmentation des privilèges https://download.oracle.com/sunalerts/1020225.1.html

    Les vulnérabilités d'entier et de dépassement de mémoire tampon dans l'environnement d'exécution Java (JRE) avec des applets de décompression et des applications Java Web Start à l'aide de l'utilitaire de décompression JAR "unpack200" peuvent permettre à une applet ou une application non approuvée d'élever des privilèges. Par exemple, une applet non approuvée peut s'octroyer des autorisations pour lire et écrire des fichiers locaux ou exécuter des applications locales accessibles à l'utilisateur exécutant l'applet non approuvée.

    Sun remercie «regenrecht» de travailler avec iDefense VCP ( http://labs.idefense.com/vcp/ ) et Chris Evans de Google pour avoir porté ces problèmes à 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 des classes système" a été signalée par l'équipe de sécurité de Fujitsu. De plus, Chris Evans de l'équipe de sécurité Google a signalé un débordement d'entier entraînant un dépassement de la mémoire tampon dans l'analyseur ICC utilisé avec les fichiers JPG ou BMP, et un appel open () incorrect à / dev / tty lors du traitement de certains fichiers BMP.

BobbyShaftoe
la source
9

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

  1. Un bug dans le framework (ceux-ci ont existé dans le passé et pourraient bien à nouveau)
  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 votre code est responsable de son analyse correcte, mais ne pas le faire est possible. Par exemple, vous pourriez écrire un analyseur XML et quelqu'un pourrait vous fournir une requête mal formée (ou légitime mais rare) 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 comme celui-ci serait une cible invitante.

ShuggyCoUk
la source
4

Les machines virtuelles Java (et .Net) interceptent le 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 entrant une entrée non valide, ils peuvent par exemple effectuer des attaques par déni de service.

Mendelt
la source
3

Comme cela a déjà été souligné, Java a, en tant que langage, la vérification des limites de tous les accès mémoire, et s'il y a une erreur ici, c'est la JVM qui est en faute et non le programme. Cependant, ce qu'il faut noter, qui est un argument similaire aux fuites de mémoire en Java; bien qu'il ne soit pas possible de briser la pile, une ArrayOutOfBoundsException au mauvais endroit, qui n'est pas gérée correctement, peut encore finir par bousiller votre système.

falstro
la source
3

Vous pourriez éventuellement provoquer un débordement de tampon dans un programme Java si vous utilisiez la fonction Java Native Interace (JNI) pour appeler du code externe et que le code externe présentait un problème exploitable. Ceci est assez rare, car la plupart des applications évitent d'utiliser JNI lorsque cela est possible.

Tim Howland
la source
3

Il est possible pour une méthode d'écrire dans des entrées valides d'un tableau qu'elle n'avait pas l'intention d'écrire, généralement par 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 !! */

L'IIRC a StringBufferdéjà eu un bogue comme celui-là, mais il n'y avait rien d'intéressant que vous puissiez en faire.

Tom Hawtin - Tacle
la source
Qu'est - ce qui est suffisant pour vérifier les limites?
Broam
1
@Broam: 0 <= off && 0 <= len && off <= buff.length-lenJe pense. Ne me citez pas. Cela a la même apparence mais il n'y a pas de débordement possible (dans l'original off + len pourrait devenir négatif et donc évidemment plus petit que la longueur du tableau). Assurez-vous qu'aucun programmeur de maintenance ne le «range» sous la forme évidente. Je trouve le débordement d'entier extrêmement déroutant. Je dois y réfléchir pendant un moment, puis il y a le soupçon tenace que je me trompe. Mais bien sûr, il devrait y avoir un autre réviseur et le programmeur d'origine - ensemble, il n'y a bien sûr aucun moyen qu'une erreur puisse passer! (not)
Tom Hawtin - tackline
J'ai dû regarder ça un peu mais tu as raison. off + len pourrait déborder et envelopper ... en C. En Java , à moins que je ne me trompe - vous auriez une exception de débordement avant que cela ne se produise, non?
Broam
1
L'arithmétique entière s'enroule silencieusement. C # a un "mode" où une exception est lancée en cas de débordement, mais je ne pense pas qu'il soit beaucoup utilisé (si vous pensez l'utiliser, vous penseriez probablement faire les bonnes choses de toute façon).
Tom Hawtin - tackline
1

L'une des principales fonctionnalités de JAVA est la sécurité. Les programmes écrits dans des langages interprétés ne sont pas sujets à l'exploit de buffer overflow, mais vous pouvez toujours provoquer un buffer overflow dans Interpreter lui-même. Bien que ce soit difficile. De même, Python est également un langage interprété et est à l'abri du dépassement de tampon.

ABHISHEK SRIVASTAVA
la source