Hat Java Pufferüberläufe? Wenn ja, können Sie mir Szenarien geben?
java
buffer-overflow
buffer-overrun
ecleel
quelle
quelle
Antworten:
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:
quelle
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.
quelle
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
ArrayOutOfBounds
Ausnahme 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.
quelle
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
In Sun Java Development Kit (JDK) und Java Runtime Environment (JRE) wurden mehrere Schwachstellen identifiziert. https://security.gentoo.org/glsa/200705-23
quelle
Ein Pufferüberlauf im engeren Sinne des Überschreibens des Stapels oder des Heaps selbst würde entweder Folgendes erfordern:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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:
IIRC hatte
StringBuffer
einmal einen solchen Fehler, aber es gab nichts Interessantes, was man damit machen konnte.quelle
0 <= off && 0 <= len && off <= buff.length-len
Ich 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)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.
quelle