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:
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.
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.
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.
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.
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.
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.
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.
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 StringBuffer
einmal einen solchen Fehler, aber es gab nichts Interessantes, was man damit machen konnte.
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.