2013-06-06 16 views
5

Obecnie dużo eksperymentuję z mechanizmami bezpieczeństwa java, aby zrozumieć, jak najlepiej wykonać niezaufany kod w piaskownicy. Jedną z rzeczy, które chcesz chronić, są nieskończone pętle, dlatego właśnie chcesz uruchomić niezaufany kod we własnym wątku. Oczywiście złośliwy kod może, na przykład, wykonać ciężkie przetwarzanie, w wyniku czego powstanie zwisający wątek. Aby pozbyć się tego wątku, w zasadzie jedynym sposobem jest użycie przestarzałego mechanizmu Thread.stop() w języku Java. Głównym powodem, dla którego jest to problematyczne, jest zwolnienie wszystkich blokad utrzymywanych przez wątek, co może spowodować uszkodzenie obiektów.Java: Monitorowanie pozyskiwania blokad

Pytanie brzmi: za pomocą Java SecurityManagera i niestandardowych programów ładujących klasy mogę śledzić na przykład, jakie klasy można załadować i jakie zasoby systemowe są dostępne. Czy istnieje sposób na otrzymanie informacji (i potencjalnie zakazu) kodu związanego z pozyskiwaniem blokad (na przykład definiowanie wywołania zwrotnego, które jest informowane przed przejściem bieżącego wątku do zsynchronizowanego bloku).

Odpowiedz

4

Jeśli już używasz niestandardowego programu ładującego klasy, możesz sprawdzić kod bajtowy każdej klasy przed załadowaniem go i wykryć, jeśli zawiera instrukcję przechwytującą blokadę (monitorenter).

Należy również wziąć pod uwagę, że blokady zwolnione przy zatrzymaniu() stanowią problem tylko wtedy, gdy zostaną nabyte na obiektach udostępnionych, które inne kody mogą potencjalnie zablokować. Jeśli uda ci się uniknąć dostępu do takich przedmiotów w "złym" temacie, jesteś bezpieczny.

+0

To prawda, chociaż idealnie nie chcę odrzucić klas tylko dlatego, że potencjalnie nabywają zamki. Mogłem oczywiście zmienić kod bajtowy podczas ładowania i wstawiania wywołań zwrotnych z tą różnicą, że to nie działa dla żadnej klasy w java. *. Czy monitorenter jest jedyną instrukcją bytecode, która mówi vm, aby pobrać blokadę? –

+0

Tak, jednak monitornter jest emitowany tylko podczas kompilowania zsynchronizowanych bloków, podczas gdy podczas wywoływania metod synchronizowanych pozyskiwanie blokady jest niejawne. Więc musisz również uniemożliwić wątkowi uzyskanie dostępu do współużytkowanych obiektów za pomocą metod zsynchronizowanych. Jeśli kod znajduje się w java. *, Powinieneś jednak założyć, że to nie jest złe :) –

+0

Kod w java. * Nie jest zły. Jeśli jednak obiekt z java. * Jest udostępniany na przykład w kolejce z java.concurrent, wówczas blokada jest pobierana z poziomu java. * Nawet jeśli obiekt jest używany z zewnątrz. –