2011-11-10 15 views
11

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

+2

pokrewne (ale wciąż otwarta) pytanie: http://stackoverflow.com/questions/6744553/java -security-manager-per-thread – Thilo

+1

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

+0

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

Odpowiedz

4

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) 
>>> 
+0

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). –

0

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.)

Powiązane problemy