Hat Java Pufferüberläufe?


96

Hat Java Pufferüberläufe? Wenn ja, können Sie mir Szenarien geben?


2
Es ist bekannt, dass einige Bibliotheksfunktionen (in nativem Code implementiert) Fehler aufweisen. Insbesondere im Java 5-Bereich sind viele Exploits in 2D-, Ton- oder Farbprofilen bekannt.
eckes

Antworten:


108

Da Java-Strings auf char-Arrays basieren und Java die Array-Grenzen automatisch überprüft, sind Pufferüberläufe nur in ungewöhnlichen Szenarien möglich:

  1. Wenn Sie nativen Code über JNI aufrufen
  2. In der JVM selbst (normalerweise in C ++ geschrieben)
  3. Der Interpreter oder JIT-Compiler funktioniert nicht ordnungsgemäß (Java-Bytecode-vorgeschriebene Grenzwertprüfungen)

24

Verwaltete Sprachen wie Java und C # haben diese Probleme nicht, aber die spezifischen virtuellen Maschinen (JVM / CLR / etc), auf denen der Code tatsächlich ausgeführt wird, können dies tun.


5
C # in einem unsicheren Kontext kann Pufferüberläufe aufweisen. Java als Sprache verbietet dies vollständig (Sie müssen die Sprache über JNI ändern, um unveränderten Zeigerzugriff zu erhalten)
ShuggyCoUk

1
Guter Punkt. Mit unsicherem C # befinden Sie sich offensichtlich nicht mehr in einer komfortabel verwalteten Welt.
Brian Rasmussen

1
Richtig, und selbst wenn SIE keine unsicheren oder Interops schreiben, könnten Sie eine Bibliothek verwenden, die dies tut. Darauf sollten Sie also achten.
BobbyShaftoe

13

In jeder Hinsicht nein.

Java verfügt über eine Überprüfung der Array- Grenzen, mit der überprüft wird, ob von einem Bereich außerhalb des zugewiesenen Arrays nicht auf Daten zugegriffen werden kann. Wenn versucht wird, auf einen Bereich zuzugreifen, der außerhalb der Größe des Arrays liegt, wird eine ArrayOutOfBoundsAusnahme ausgelöst.

Wenn ein Pufferüberlauf vorliegt, liegt dieser wahrscheinlich an einem Fehler in der Java Virtual Machine und ist meines Wissens nicht das beabsichtigte Verhalten, das in den Java-Sprachspezifikationen oder den Java Virtual Machine-Spezifikationen geschrieben ist.


10

Ja und nein. Nein, da Sie nicht wirklich versehentlich erstellen können, öffnen Sie sich einer Sicherheitsanfälligkeit durch Pufferüberlauf, da es sich um ein verwaltetes Speichermodell handelt. In der JVM und im JDK können jedoch Sicherheitslücken durch Pufferüberlauf auftreten. Siehe diese Secunia-Empfehlung:

http://secunia.com/advisories/25295

Oder lesen Sie diese alten Hinweise zu mehreren früheren JDK- und JRE-Schwachstellen:

  • Sicherheitslücken in Bezug auf Ganzzahlen und Pufferüberlauf in der Java Runtime Environment (JRE) Das Dienstprogramm zum Entpacken der JAR "unpack200" kann zur Eskalation von Berechtigungen führen. Https://download.oracle.com/sunalerts/1020225.1.html

    Ganzzahl- und Pufferüberlauf-Schwachstellen in der Java Runtime Environment (JRE) beim Entpacken von Applets und Java Web Start-Anwendungen mit dem JAR-Entpackungsdienstprogramm "unpack200" können es einem nicht vertrauenswürdigen Applet oder einer nicht vertrauenswürdigen Anwendung ermöglichen, Berechtigungen zu eskalieren. Beispielsweise kann sich ein nicht vertrauenswürdiges Applet die Berechtigung erteilen, lokale Dateien zu lesen und zu schreiben oder lokale Anwendungen auszuführen, auf die der Benutzer zugreifen kann, der das nicht vertrauenswürdige Applet ausführt.

    Sun bedankt sich bei "regenrecht" für die Zusammenarbeit mit dem iDefense VCP ( http://labs.idefense.com/vcp/ ) und Chris Evans von Google, die uns auf diese Probleme aufmerksam gemacht haben.

  • In Sun Java Development Kit (JDK) und Java Runtime Environment (JRE) wurden mehrere Schwachstellen identifiziert. https://security.gentoo.org/glsa/200705-23

    Eine nicht spezifizierte Sicherheitsanfälligkeit, die eine "falsche Verwendung von Systemklassen" beinhaltet, wurde vom Fujitsu-Sicherheitsteam gemeldet. Darüber hinaus meldete Chris Evans vom Google-Sicherheitsteam einen Ganzzahlüberlauf, der zu einem Pufferüberlauf im ICC-Parser führte, der mit JPG- oder BMP-Dateien verwendet wird, und zu einem falschen open () -Aufruf an / dev / tty bei der Verarbeitung bestimmter BMP-Dateien.


9

Ein Pufferüberlauf im engeren Sinne des Überschreibens des Stapels oder des Heaps selbst würde entweder Folgendes erfordern:

  1. Ein Fehler im Framework (diese gab es in der Vergangenheit und möglicherweise wieder)
  2. Die Verwendung von JNI (im Wesentlichen nicht mehr mit verwaltetem Code)

Ein Pufferüberlauf in dem Sinne, dass Sie Code haben, der einen Puffer verwendet, und Ihr Code für die korrekte Analyse verantwortlich ist, dies jedoch nicht tut, ist möglich. Zum Beispiel könnten Sie einen XML-Parser schreiben und jemand könnte Ihnen eine fehlerhafte (oder legitime, aber ungewöhnliche) Anfrage stellen, die aufgrund des Designs Ihres Parsers zuvor validierte Daten mit einer Nutzlast überschreibt, die dazu führen würde, dass sich Ihre Anwendung schlecht verhält.

Diese letztere Form ist weniger wahrscheinlich, aber eine schlecht geschriebene SQL-String-Bereinigungsfunktion, die weit verbreitet ist und ein Problem wie dieses hat, wäre ein einladendes Ziel.


4

Virtuelle Java- (und .Net-) Maschinen fangen Code ab, der versucht, außerhalb des reservierten Speichers zu schreiben. Anwendungen, die dies nicht richtig handhaben, können weiterhin Sicherheitsprobleme verursachen. Wenn böswillige Benutzer durch Eingabe ungültiger Eingaben Ausnahmen auslösen können, können sie beispielsweise Denial-of-Service-Angriffe ausführen.


3

Wie bereits erwähnt, beschränkt Java als Sprache die Überprüfung des gesamten Speicherzugriffs. Wenn hier ein Fehler auftritt, ist die JVM fehlerhaft und nicht das Programm. Was jedoch beachtet werden sollte, ist ein ähnliches Argument wie Speicherlecks in Java; Obwohl es nicht möglich ist, den Stapel zu zerschlagen, kann eine ArrayOutOfBoundsException an der falschen Stelle, die nicht korrekt behandelt wird, Ihr System dennoch vermasseln.


3

Sie könnten möglicherweise einen Pufferüberlauf in einem Java-Programm verursachen, wenn Sie die Java Native Interace (JNI) -Funktion zum Aufrufen von externem Code verwenden und der externe Code ein ausnutzbares Problem aufweist. Dies ist ziemlich ungewöhnlich, da die meisten Anwendungen die Verwendung von JNI nach Möglichkeit vermeiden.


3

Es ist möglich, dass eine Methode in gültige Einträge eines Arrays schreibt, die sie nicht beabsichtigt hat, normalerweise durch einen Ganzzahlüberlauf.

Zum Beispiel reicht Folgendes nicht aus, um Grenzen zu überprüfen:

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

IIRC hatte StringBuffereinmal einen solchen Fehler, aber es gab nichts Interessantes, was man damit machen konnte.


Was ist ausreichend Grenzen zu überprüfen?
Broam

1
@Broam: 0 <= off && 0 <= len && off <= buff.length-lenIch denke. Zitiere mich nicht. Es sieht genauso aus, aber es gibt keinen möglichen Überlauf (im Original kann off + len negativ werden und daher offensichtlich kleiner als die Array-Länge sein). Stellen Sie sicher, dass kein Wartungsprogrammierer es jemals in die offensichtliche Form "aufräumt". Ich finde den Integer-Überlauf massiv verwirrend. Ich muss eine Weile darüber nachdenken, und dann gibt es den nagenden Verdacht, dass ich etwas falsch gemacht habe. Aber natürlich sollte es einen anderen Rezensenten und den ursprünglichen Programmierer geben - zusammen kann natürlich kein Fehler durchkommen! (nicht)
Tom Hawtin - Tackline

Ich musste ein bisschen darauf starren, aber du hast recht. off + len könnte überlaufen und umbrechen ... in C. Wenn ich mich in Java nicht irre, würden Sie vorher eine Überlaufausnahme erhalten, oder?
Broam

1
Ganzzahlige Arithmetik wird lautlos umschlossen. C # hat einen "Modus", in dem eine Ausnahme beim Überlauf ausgelöst wird, aber ich glaube nicht, dass sie häufig verwendet wird (wenn Sie daran denken, sie zu verwenden, würden Sie wahrscheinlich trotzdem daran denken, die richtigen Dinge zu tun).
Tom Hawtin - Tackline

1

Eines der Hauptmerkmale von JAVA ist die Sicherheit. In interpretierten Sprachen geschriebene Programme sind nicht anfällig für den Pufferüberlauf-Exploit, aber Sie können im Interpreter selbst immer einen Pufferüberlauf verursachen. Obwohl es schwierig sein wird. In ähnlicher Weise ist Python auch eine interpretierte Sprache und vor Pufferüberlauf geschützt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.