Próbuję zrozumieć model zabezpieczeń używany, gdy JVM jest żądana do ładowania klas.Model zabezpieczeń Java ClassLoader
Od specyfikacji JVM w Sandboxing, jestem przekonany, że standardowa implementacja maszyny JVM powinna obsługiwać co najmniej jedną inną wersję: ClassLoader
, niezależnie od primordial ClassLoader
. Służy do ładowania plików klas aplikacji (na przykład z udostępnionej ścieżki klasy).
Jeśli klasa jest wymagane od ClassLoader
że nie jest w jego nazw, java/lang/String
na przykład, a następnie przekazuje żądanie do pierwotnej ClassLoader
, która próbuje załadować klasę z API Javy, jeśli nie jest tam wtedy go wyrzuca NoClassDefFoundError
.
Czy mam rację sądząc, że pierwotny ClassLoader
ładuje tylko klasy z przestrzeni nazw interfejsu API języka Java, a wszystkie inne klasy są ładowane za pomocą osobnej implementacji ClassLoader
?
I to sprawia, że ładowanie klas bardziej bezpieczne, ponieważ oznacza to, że złośliwy klasa nie może uchodzić za członka API Java (powiedzmy java/lang/Virus
), ponieważ jest to obszar nazw chronione i nie mogą być wykorzystywane w bieżącej ClassLoader
?
Ale czy jest coś, co uniemożliwi zastąpienie klas interfejsu API języka Java złośliwymi klasami, czy też zostanie to wykryte podczas weryfikacji class
?
Zasadniczo prawidłowe. "Pierwotna" ClassLoader jest znana jako "boot ClassLoader" i ładuje klasy z "boot classpath". Ochrona zapewniona przez to jest rozsądnie "silna", o ile "oficer bezpieczeństwa" kontroluje inwokację JVM (np. Wiersz poleceń), gdzie określona jest ścieżka startowa bootowania. –
(Kilka maszyn JVM ma dodatkowe zabezpieczenia w ścieżce klasy rozruchowej, wymagające, aby pliki JAR posiadały atrybut uprzywilejowany). –
@HotLicks "Ścieżka startowa boot", w której znajduje się środowisko wykonawcze Java? – Jivings