Jakie jest ryzyko odbicia obiektu?

Więc po kilku godzinach pracy obejścia ograniczenia refleksji jest obecnie wyłączony na Google App Engine, zastanawiałem się, czy ktoś może mi pomóc zrozumieć, dlaczego obiekt odbicie może być zagrożeniem. Czy to dlatego, że mogę sprawdzić prywatne zmienne klasy, czy są jakieś inne głębsze powody?

Author: Adeel Ansari, 2010-06-09

5 answers

1 - odbicie (jako pojęcie) jest rzeczywiście ortogonalne dla bezpieczeństwa / ochrony.

W projektowaniu Javy duży nacisk położono na to, aby była ona bezpieczną platformą, z statycznym typowaniem, security manager , zdyscyplinowane użycie class loader i brak możliwości wkręcania wskaźników / pamięci. Wywiad z Jamesem Goslingiem można przeczytać w Masterminds of programming , co jest w tym ciekawe.

Ale im więcejodblaskowej mocy masz tym trudniej jest zapewnić bezpieczeństwo tak, jak powinno. Odbicie pokonuje zwłaszcza statyczne pisanie i może prowadzić do błędów w czasie pracy.

Ale bardziej subtelne rzeczy też mogą się zdarzyć. Na przykład class loaders - które można uznać za odblaskowy hook w systemie - nie były poprawnie zaprojektowane we wczesnej wersji Javy, co prowadziło do potencjalnej wymiany typów. Artykuł dynamiczne ładowanie klas w JVM, autorstwa Gilada Brachy, jest wnikliwy w takich kwestiach.

Odbicia nie można całkowicie wyłączyć; zawsze można zastanowić się nad własnymi publicznymi polami/metodami. Refleksja nad strukturami prywatnymi z AccessibleObject.setAccessible może być jednak wyłączona, ponieważ łamie enkapsulację . Z dostępem do pól prywatnych itp. możliwa jest kontrola i modyfikacja danych wewnętrznych. Może prowadzić do różnych złośliwych exploitów , np.

  • strings nie są już niezmienne i można je zmienić (zobacz to pytanie )
  • możesz ujawnić sensowne informacje o obiektach, których nie posiadasz
  • ... inne wyczyny ...

Wreszcie są inne mechanizmy, które zagrażają bezpieczeństwu, zwłaszcza sun.misc.Unsafe, które dają bezpośredni dostęp do pamięci -- wskaźniki wróciły.

2-teraz pytanie brzmi, czy Refleksja (w praktyce) prowadzi do tak wielu zagrożeń.

Czytałem link wskazywany przez @dbyrne ale chodzi głównie o .net. Poza Tym Nie wiem dokładnie co jest wyłączone dla aplikacji Google. Czy to ReflectPermission Tylko, lub inne pozwolenie kierownika ds. bezpieczeństwa? Jednym z zagrożeń jest uzyskanie dostępu do systemu plików i bałaganu.

Problem dostępu do prywatnych danych i łamania enkapsulacji można argumentować w praktyce. Pisanie bezpiecznego kodu jest naprawdę niezwykle trudne i nawet bez zmiany modyfikatora dostępu można podklasować klasy w niewłaściwy sposób-chyba że są one final, a nawet lepiej, zamknięte - i przekazywać je dookoła. To dla przykład co defensywne kopiowanie staraj się chronić przed.

Bezpieczeństwo typu jest również zagrożone przez błąd run-time z powodu downcast, więc ten punkt można również argumentować.

W środowisku współdzielonym/hostowanym bezpieczeństwo jest względne. Na poziomie języka, na przykład, nie można zapobiec moduł formularz zużywa 100% CPU lub zużywa całą pamięć do OutOfMemoryException. Takie obawy należy rozwiązać w inny sposób, zazwyczaj na poziomie systemu operacyjnego, z wirtualizacja i parytety.

Moja osobista odpowiedź brzmiałaby: odbicie jest Zagrożeniem bezpieczeństwa, ale nie tak dużym w praktyce w porównaniu z innymi potencjalnymi wektorami ataku.
 22
Author: ewernli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:16

Aplikacja może używać API Java reflection do uzyskiwania dostępu i aktualizacji pól oraz wykonywania metod, które są zabronione przez normalne reguły dostępu / widoczności w Javie. Przy odrobinie pomysłowości wystarczy:

  • dostęp do informacji, które mają być ukryte,
  • wywróć piaskownicę bezpieczeństwa Java, aby można było ingerować w inne rzeczy uruchomione w JVM, uzyskiwać dostęp do plików na komputerze lokalnym i tak dalej.

W pewnych okolicznościach może nawet Zezwalaj na wstrzyknięcie złośliwego kodu natywnego.

 3
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-09 03:59:44

Po pierwsze, jeśli nie zainstalowałeś SecurityManager, to i tak nie jesteś bezpieczny.

Po Drugie, odbicie nie otwiera znaczących otworów, chyba że setAccessible() jest włączona, a samo to podlega kontroli bezpieczeństwa (regulowanej przez setAccessChecks pozwolenie na odbicie ). Bez tego, chociaż możesz być w stanie wiedzieć, że prywatne pole lub metoda istnieje (choć sama wymaga accessDeclaredMembers uprawnienia runtime ) z tą wiedzą nic nie można zrobić. Twój najlepszym sposobem na atak może być praca z serializowanymi przedmiotami, ale to zupełnie inna kula wosku.

Zauważ również, że pisanie bezpiecznego menedżera zabezpieczeń i klasy loadera jest nietrywialne. Najlepiej zostawić je innym, jeśli nie aspirujesz do mega-Guru-dom (lub, bardziej prawdopodobne, żenujące poziomy porażek).

 2
Author: Donal Fellows,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-09 08:20:10

GAE jest współdzielonym środowiskiem hostingowym i hostuje pliki wojenne od wielu użytkowników. Jest bardzo prawdopodobne, że wiele plików wojennych jest hostowanych w tym samym JVM, ponieważ spawanie procesu na wojnę jest po prostu śmieszne. Tak więc, jedynym sposobem na sandbox KAŻDEGO pliku wojny jest użycie niestandardowego classloadera dla każdego pliku wojny.

Załóżmy, że odbicie było dozwolone. Możesz przejść hierarchię classloader i wyliczyć klasy / metody z plików wojennych należących do różnych użytkowników. Oczywiście, to wielka sprawa.

 1
Author: Sripathi Krishnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-09 09:16:35

Moja teoria jest taka, że Google próbuje coś ukryć. Wyłączając Reflection Google może ukryć nazwy zmiennych, wywołania funkcji, a nawet pełne API. Jeśli Google ukrywa coś takiego jak API, to na pewno ci o tym nie powie.

Wiem na pewno, że refleksja odgrywa bardzo ważną rolę w testach bezpieczeństwa. Na przykład możesz automatycznie generować testy Fuzz używając reflection. AxMan używa TypeLib do identyfikacji wszystkich klasy i ich wywołania metod, które tworzą obiekt COM. Używając tej informacji AxMan utworzy instancję każdej klasy i wywoła każdą metodę z permutacjami długich łańcuchów i dużych liczb. Podobne testy przeprowadza Soap Fuzzers używając pliku WSDL do refleksji.

 0
Author: rook,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-09 07:47:01