Programuję serwer Java, który musi obsługiwać kod Pythona podany przez użytkownika przy użyciu Jython. Oczywiście, nie mogę po prostu wykonać go bez ryzyka, że cracker uzyska dostęp do plików i poleceń systemowych, których nie powinien. Szukałem jakiegoś sposobu na ograniczenie uprawnień do plików dla określonych wątków już od wielu godzin, a najbliższym zdobyciem uprawnień było ograniczenie uprawnień do plików dla całej aplikacji. Czy jest zaimplementowana klasa, która robi coś takiego, lub jakąś metodę, aby to zrobić?Uprawnienia do plików Java dla wątków
Odpowiedz
Możesz spróbować użyć opcji java.lang.SecurityManager. Zobacz także this question o używaniu menedżera bezpieczeństwa do ustawiania różnych ustawień bezpieczeństwa dla jednego wątku.
Można ustawić menedżera bezpieczeństwa i polityki bezpieczeństwa tak:
jython -Djava.security.manager=securitymanager -Djava.security.policy=policyfile
gdzie securityManager jest menedżera zabezpieczeń do używania i policyfile zawierający specyfikację polityki, jak opisano na przykład here. Jeśli korzystasz z pliku zasad jako źródła dla polityki bezpieczeństwa, oto przykład:
grant {
permission java.security.AllPermission;
}
Jython będzie potrzebować uprawnień do uruchomienia w tym następujące:
grant {
permission java.io.FilePermission "${user.home}${/}-", "read, write";
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getProtectionDomain";
};
(to zakłada swoją cachedir znajduje się w katalogu HOME bieżącego użytkownika). To zrobi coś bliskiego, czego potrzebujesz, umożliwiając odczyt i zapis dostępu do plików w domenie bieżącego użytkownika i uniemożliwiając dostęp do wszystkich innych części systemu plików. Oto rezultat (pierwszy open() odnosi się do pliku w katalogu osobistym bieżącego użytkownika, ponieważ jest to bieżący katalog roboczy):
>>> f1=open('test.txt', 'r')
>>> f2=open('/tmp/test.txt', 'r')
Traceback (innermost last):
File "<console>", line 1, in ?
java.security.AccessControlException: access denied (java.io.FilePermission /tmp/test.txt read)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:342)
at java.security.AccessController.checkPermission(AccessController.java:553)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
at java.io.File.exists(File.java:748)
at org.python.core.PyFile._setup(Unknown Source)
at org.python.core.PyFile.file_init(Unknown Source)
at org.python.core.PyFile$1.new_impl(Unknown Source)
at org.python.core.PyType.invoke_new_(Unknown Source)
at org.python.core.PyType.type___call__(Unknown Source)
at org.python.core.PyType.__call__(Unknown Source)
at org.python.core.PyObject.__call__(Unknown Source)
at org.python.pycode._pyx2.f$0(<console>:1)
at org.python.pycode._pyx2.call_function(<console>)
at org.python.core.PyTableCode.call(Unknown Source)
at org.python.core.PyCode.call(Unknown Source)
at org.python.core.Py.runCode(Unknown Source)
at org.python.core.Py.exec(Unknown Source)
at org.python.util.PythonInterpreter.exec(Unknown Source)
at org.python.util.InteractiveInterpreter.runcode(Unknown Source)
at org.python.util.InteractiveInterpreter.runsource(Unknown Source)
at org.python.util.InteractiveInterpreter.runsource(Unknown Source)
at org.python.util.InteractiveConsole.push(Unknown Source)
at org.python.util.InteractiveConsole.interact(Unknown Source)
at org.python.util.jython.main(Unknown Source)
java.security.AccessControlException: java.security.AccessControlException: access denied (java.io.FilePermission /tmp/test.txt read)
>>>
Dzięki za zamieszczenie tej polityki; Myślę, że nie istnieje nigdzie indziej. W odpowiedzi poniżej zamieściłem kilka innych niezbędnych uprawnień (słusznie komentarz, jeśli komentarze zezwalały na formatowanie kodu). –
Z Jython 2.5.2 Znalazłem te uprawnienia niezbędne:
permission java.io.FilePermission "${user.dir}${/}path${/}to${/}python${/}-", "read";
permission java.util.PropertyPermission "user.dir", "read";
permission java.lang.RuntimePermission "accessDeclaredMembers";
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getProtectionDomain";
(powinno to być komentarz do przyjętej odpowiedzi, poza tym, że komentarz nie będzie sformatować czytelnie.)
- 1. silverstripe - uprawnienia do plików dla folderu folderu
- 2. Sprawdź uprawnienia do plików
- 3. C# Uprawnienia do plików/katalogów
- 4. Aplet Java Uprawnienia
- 5. Uprawnienia do plików synchronizacji * tylko *
- 6. Jak zmienić uprawnienia do plików dla wszystkich podkatalogów (CHMOD)
- 7. Uprawnienia do plików systemu Linux dla urządzenia USB na Androida
- 8. Wdrażanie rsync i uprawnienia do plików/katalogów
- 9. Ustaw uprawnienia do plików w C#
- 10. Jak zapewnić poprawne uprawnienia do plików
- 11. Uprawnienia do plików nie dziedziczą uprawnień do katalogów.
- 12. Ustawianie priorytetu wątków Java
- 13. Uprawnienia (uprawnienia) SUPER dla tej operacji
- 14. Blokowanie wątków Java
- 15. Czy można przesłonić uprawnienia do plików dla zrzutu sterty wyprodukowanego przez -XX + HeapDumpOnOutOfMemoryError?
- 16. Ustawianie domyślnego uprawnienia do przesyłania plików w Filezilla
- 17. Jak zachować uprawnienia do plików podczas korzystania z FileUtils.copyDirectory?
- 18. Zdalne uprawnienia do plików Netbeans. chmod z poziomu Netbeans?
- 19. Czy można wprowadzić Mercurial, aby zachować uprawnienia do plików?
- 20. Jak zmienić uprawnienia plików w Ubuntu
- 21. Tworzenie programu java do kompilowania plików .java
- 22. jscape sftp przesyłanie plików zachowując uprawnienia
- 23. Java StringBuilder i Bezpieczeństwo wątków
- 24. Java Swingworker i wiele wątków
- 25. uprawnienia do plików mkfifo nie są wykonywane prawidłowo
- 26. Jak zmienić uprawnienia dostępu do plików w systemie Linux?
- 27. Jak zachować uprawnienia do wykonywania plików w archetypie maven archetyp
- 28. Zachowaj uprawnienia do plików z zasobami Maven: testResources
- 29. Uprawnienia do plików w systemie Linux/Unix z .NET Core
- 30. Pojedyncze lub wiele pul wątków dla serwera Java?
pokrewne (ale wciąż otwarta) pytanie: http://stackoverflow.com/questions/6744553/java -security-manager-per-thread – Thilo
Również (z Rhino zamiast Jython): http: // stackoverfl ow.com/questions/93911/how-can-you-run-javascript-using-rhino-for-java-in-a-sandbox – Thilo
the inheritablethreadlocal jest interesującą opcją, ale musisz być ostrożny, ponieważ wygrał ' t być propagowane do dowolnego już wątku (np kod przesłany do puli wątków). więc jest to prawdopodobnie delikatne rozwiązanie. – jtahlborn