Czy Java ma przepełnienia bufora? Jeśli tak, czy możesz podać mi scenariusze?
java
buffer-overflow
buffer-overrun
ecleel
źródło
źródło
Odpowiedzi:
Ponieważ ciągi znaków w języku Java są oparte na tablicach znaków, a język Java automatycznie sprawdza granice tablic, przepełnienia buforu są możliwe tylko w nietypowych scenariuszach:
źródło
Języki zarządzane, takie jak Java i C #, nie mają tych problemów, ale konkretne maszyny wirtualne (JVM / CLR / itp.), Które faktycznie uruchamiają kod, mogą.
źródło
Dla wszystkich zamiarów i celów, nie.
Java ma funkcję sprawdzania granic tablic, która sprawdza, czy nie można uzyskać dostępu do danych z obszaru spoza przydzielonej tablicy. Gdy ktoś próbuje uzyskać dostęp do obszaru, który jest poza rozmiarem tablicy, plik
ArrayOutOfBounds
zostanie zgłoszony wyjątek.Jeśli występuje przepełnienie buforu, jest to prawdopodobnie spowodowane błędem w wirtualnej maszynie języka Java i, o ile mi wiadomo, nie jest to zamierzone zachowanie opisane w specyfikacjach języka Java ani w specyfikacjach wirtualnej maszyny języka Java.
źródło
Tak i nie. Nie, ponieważ tak naprawdę nie można tworzyć błędnie, otworzyć się na lukę przepełnienia bufora, ponieważ jest to model pamięci zarządzanej. Jednak w JVM i JDK mogą występować luki w zabezpieczeniach przepełnienia buforu. Zobacz ten poradnik Secunia:
http://secunia.com/advisories/25295
Lub zobacz te stare porady dotyczące kilku poprzednich luk w zabezpieczeniach JDK i JRE:
Luki w zabezpieczeniach związane z przepełnieniem liczb całkowitych i buforu w środowisku wykonawczym Java (JRE) „unpack200” narzędzia do rozpakowywania plików JAR mogą prowadzić do eskalacji uprawnień https://download.oracle.com/sunalerts/1020225.1.html
Zidentyfikowano wiele luk w zabezpieczeniach Sun Java Development Kit (JDK) i Java Runtime Environment (JRE). https://security.gentoo.org/glsa/200705-23
źródło
Przepełnienie buforu w ścisłym znaczeniu nadpisania samego stosu lub samej sterty wymagałoby:
Przepełnienie buforu w tym sensie, że kod używa bufora, a kod jest odpowiedzialny za jego poprawną analizę, ale nie jest to możliwe. Na przykład możesz napisać parser XML i ktoś mógłby dostarczyć źle sformułowane (lub uzasadnione, ale rzadkie) żądanie, które z powodu projektu twojego parsera nadpisuje wcześniej sprawdzone dane jakimś ładunkiem, który spowodowałby złe zachowanie aplikacji.
Ta ostatnia forma jest mniej prawdopodobna, ale źle napisana funkcja czyszczenia łańcucha sql, szeroko rozpowszechniona, która miała taki problem, byłaby zachęcającym celem.
źródło
Maszyny wirtualne Java (i .Net) przechwytują kod, który próbuje pisać poza zarezerwowaną pamięcią. Aplikacje, które nie obsługują tego poprawnie, nadal mogą powodować problemy z bezpieczeństwem. Jeśli złośliwi użytkownicy mogą wywołać wyjątki, wprowadzając nieprawidłowe dane wejściowe, mogą na przykład przeprowadzać ataki typu „odmowa usługi”.
źródło
Jak już zostało powiedziane, Java jako język ma granice sprawdzania dostępu do całej pamięci, a jeśli wystąpi tutaj błąd, winna jest JVM, a nie program. Jednak należy zauważyć, że jest to argument podobny do wycieków pamięci w Javie; Chociaż nie jest możliwe rozbicie stosu, wyjątek ArrayOutOfBoundsException w niewłaściwym miejscu, który nie jest obsługiwany poprawnie, może nadal zepsuć system.
źródło
Można sobie wyobrazić przepełnienie bufora w programie Java, jeśli do wywołania kodu zewnętrznego używa się narzędzia Java Native Interace (JNI), a kod zewnętrzny zawiera problem, który można wykorzystać. Jest to dość rzadkie, ponieważ większość aplikacji unika używania JNI tam, gdzie to możliwe.
źródło
Metoda może zapisywać poprawne wpisy tablicy, których nie zamierzała, zazwyczaj poprzez przepełnienie całkowitoliczbowe.
Na przykład poniższe elementy nie wystarczą, aby sprawdzić granice:
IIRC,
StringBuffer
kiedyś miał taki błąd, ale nie można było z nim nic ciekawego zrobić.źródło
0 <= off && 0 <= len && off <= buff.length-len
Myślę. Nie cytuj mnie. Wygląda tak samo, ale nie ma możliwości przepełnienia (w oryginale off + len może być ujemne, a zatem oczywiście mniejsze niż długość tablicy). Upewnij się, że żaden programista nigdy nie „porządkuje” go w oczywistej formie. Uważam, że przepełnienie liczb całkowitych jest bardzo mylące. Muszę chwilę o tym pomyśleć, a potem pojawia się dokuczliwe podejrzenie, że się mylę. Ale oczywiście powinien być jeszcze jeden recenzent i oryginalny programista - razem oczywiście nie ma możliwości przedostania się błędu! (nie)Jedną z kluczowych cech JAVA jest bezpieczeństwo. Programy napisane w językach interpretowanych nie są podatne na exploity przepełnienia bufora, ale zawsze możesz spowodować przepełnienie bufora w samym Interpreterze. Chociaż będzie to trudne. Podobnie Python jest również językiem interpretowanym i jest bezpieczny przed przepełnieniem bufora.
źródło