buffer overflow

LouCyphre

Bekanntes Mitglied
Hallo,

ist es in Java möglich ein code zu erzeugen der für buffer overflow anfällig ist?

Die Java Plattform sollte das ja eigentlich von Grund auf verhindern, da Speicherallokation, Zeiger etc. nicht vom Nutzer gemanged werden oder?

Würde mich Mal interessieren, was ihr dazu sagt...

Gruß
Lou
 

Robert Zenz

Bekanntes Mitglied
Grundsaetzlich ist es moeglich, aber mir ist keine unmittelbare/aktuelle Moeglichkeit bekannt, aber ich ziehe mir das auch gerade aus dem Hintern um ehrlich zu sein.

Also die JVM ist in C++ geschrieben, mit "manueller" Speicherverwaltung und natuerlich kann es sein dass man damit hier irgendwo einen Fehler hat, welcher auch durch Java Bytecode ausgeloest werden kann. Aber man braucht dafuer den Fehler in der JVM und den passenden Bytecode damit dieser angesprochen wird, und dann muss die Sache auch noch so sein das man es ausnutzen kann.

Eine andere Moeglichkeit ist mit Unsafe Speicher selbst zu verwalten, dann ist es, denke ich, schon moeglich das man solche Luecken erzeugt oder ausnutzt.

Wenn man eine native Bibliothek/nativen Code per JNI oder JNA anspricht, hat man natuerlich genau das Gleiche.

Aber von "normalem" Java auf einen Buffer-Overflow zu kommen braucht man schon einen Fehler in der JVM. Ich bin mir sehr sicher dass das nicht geht selbst wenn man sich den Bytecode selbst schreibt, weil dieser auch schon nichts mehr mit Speicher zu tun hat. Also grundsaetzlich ist man in Java zusammen mit dem JIT Compiler komplett losgeloest von der Speicherverwaltung, und kann dementsprechend auch nicht derartige Fehler machen oder ausloesen. Das schlieszt Fehler in der JVM natuerlich nicht aus.
 

Oneixee5

Top Contributor
Problematisch in diesem Umfeld waren (sind?) einige externe Grafikbibliotheken. Teilweisen konnten solche Probleme beim (serverseitigen) Rendern von Bildern auftreten und ausgenutzt werden. Ich erinnere mich an entsprechende Artikel, konnte sie aber über Google jetzt nicht ohne weites finden.
Dabei bin ich jetzt aber noch auf folgendes gestoßen: https://insinuator.net/2020/09/java...ble-methodtype-cve-2020-2805-sandbox-escapes/
 

Mart

Top Contributor
Java:
public class Overflow

 {

  public static void main(String[] args)

  {

    int importantData =1;

    int[]  buffer = new int[10];

 

    for (int i =0; i < 15; i++)

      buffer[i] = 7;

 

    System.out.println("after buffer overflow ");

    System.out.println("Important data  = "+importantData);

  }

}
das wirft dir diese Meldung

Java:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10

        at Overflow.main(Overflow.java:9)
dh java versucht dich vor einem buffer overflow zu schützen jedoch ist die jvm nicht fehlerfrei und irgendwie bekommt man einen overflow immer hin aber wenn man das schafft sollte man es vllt mal in den raum zur diskussion stellen xD
 

LouCyphre

Bekanntes Mitglied
Java:
public class Overflow

 {

  public static void main(String[] args)

  {

    int importantData =1;

    int[]  buffer = new int[10];

 

    for (int i =0; i < 15; i++)

      buffer[i] = 7;

 

    System.out.println("after buffer overflow ");

    System.out.println("Important data  = "+importantData);

  }

}
das wirft dir diese Meldung

Java:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10

        at Overflow.main(Overflow.java:9)
dh java versucht dich vor einem buffer overflow zu schützen jedoch ist die jvm nicht fehlerfrei und irgendwie bekommt man einen overflow immer hin aber wenn man das schafft sollte man es vllt mal in den raum zur diskussion stellen xD
Naja, solange die Exception geworfen wird statt wild irgendwelche Speichereinträge auszugeben, ist es doch okay
 

LimDul

Top Contributor
Man kann sagen: Innerhalb der Java-Laufzeitumgebung sind im Java Code keine Buffer Overflows möglich. Die Java Laufzeitumgebung stellt sicher, dass die Java Operationen keine Buffer Overflows erzeugen, sondern sauber mit Exceptions gefangen werden.

Davon ausgenommen ist natürlich:
* Der Aufruf von nativen (JNI & Co) Code - hier verlässt man die Grenzen, wo durch die Laufzeitumgebung das sichergestellt werden kann
* Fehler in der Laufzeitumgebung selber.

Das heißt, wenn ich Java Code schreibe, kann ich keinen Buffer Overflow erzeugen, solange ich nicht nativen Code aufrufen und keine Fehler der JVM finde.
 

Ähnliche Java Themen


Oben