2011-11-25 18 views
11

Próbuję zakazać połączenia z System.exit(int); w niektórych słoikach.zabronić wywoływania System.exit

Te słoiki zostaną opracowane przez zewnętrzne zespoły i załadowane przez naszą aplikację "kontenerową".

Mój pierwszy odruch jest użycie menedżera zabezpieczeń Java:

-Djava.security.manager-Djava.security.debug=all 

z najprostszych ${user.home}/.java.policy pliku:

grant {}; 

Mimo, że nie można już nazwać takie jak System.getProperties() (od Nie mam java.util.PropertyPermission), mogę zrobić System.exit (0)!

Opcja java.security.debug=all daje następujące konsoli:

scl: getPerms ProtectionDomain (file: my-bin-path <no sign certificates>) 
sun.misc.Launcher $ AppClassLoader @ 10385c1 
<no principals> 
java.security.Permissions @ 15b7986 (
(java.lang.RuntimePermission exitVM) 
(java.io.FilePermission \my-bin-path\- read) 
) 

Dlaczego wszystkie klasy w moim-bin-path nie java.lang.RuntimePermission exitVM przyznanej ?????

dzięki

+0

Domyślnie 'java.lang.RuntimePermission exitVM' jest domyślnie przyznawana, może trzeba to wyraźnie zabronić. – Romain

+0

Spodziewam się, że uprawnienia exitVM będą domyślnie włączone. Jeśli fragment kodu Java dojdzie do końca jego wykonania, być może potrzebuje niejawnego wywołania System.exit (0), aby powiedzieć maszynie wirtualnej, że jest to zrobione. – Chris

+0

Zakładam jednak, że chcesz wiedzieć, jak to wyłączyć, zaleciłbym edytowanie pytania, aby to konkretnie zadać. – Chris

Odpowiedz

2

Z Javadoc z RuntimePermission:

uwaga: „exitVM *” Prawo jest automatycznie przyznane wszystkim kod załadowany ze ścieżki klasy aplikacji, umożliwiając aplikacji do wypowiedzenia się.

Odczytuję to, wydaje się, że musisz jawnie odmówić tego uprawnienia, pisząc własny SecurityManager. (Na przykład zobacz tę odpowiedź: Prevent System.exit to actually exit the JVM)

+0

Dzięki, znajdziesz to !! – kiki

1

Alternatywnie można wykonać AOP i przechwycić System.exit. Zrobiłbyś to sam: stwórz własny program ładujący klasy i użyj BPEL do śledzenia System.exit i załatuj te połączenia. Naprawdę nie duży wysiłek.

3

Zgodnie z raportem o błędzie, http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4286238, plik zasad nie blokuje wywołań System.exit(). Używam aplikacji w Javie 1.6 i nadal widzę ten błąd, mimo że jest "rozwiązany". Podobnie jak w przypadku OP, mam systemowy plik strategii, który nie zawiera uprawnień do exitVM. Mogę jednak wyjść z aplikacji bez żadnego wyjątku.

Moje zrozumienie włączenia niestandardowego pliku zasad jest takie, że wszystkie uprawnienia są na czarnej liście, z wyjątkiem tych zawartych w pliku zasad. Ponieważ exitVM nie jest dołączone, powinno być zabronione (przesłonięcie domyślnego uprawnienia wspomnianego przez MicSim). Ale tak nie jest.

Powiązane problemy