2011-11-10 13 views
11

Sto programmando un server Java che deve gestire codice Python dato dall'utente utilizzando Jython. Ovviamente, non posso semplicemente eseguirlo senza il rischio che un cracker acceda a file e comandi di sistema che non dovrebbe. Sono stato alla ricerca di un modo per limitare le autorizzazioni dei file per thread specifici per ore, e il più vicino che ho ottenuto era limitare le autorizzazioni dei file per l'intera applicazione. C'è una classe implementata che fa qualcosa del genere, o un metodo per farlo?permessi dei file Java per le discussioni

+2

correlati (ma ancora aperta) domanda: http://stackoverflow.com/questions/6744553/java -security-manager-per-thread – Thilo

+1

Inoltre (con Rhino anziché Jython): http: // stackoverfl ow.com/questions/93911/how-can-you-run-javascript-using-rhino-for-java-in-a-sandbox – Thilo

+0

the inheritablethreadlocal è un'opzione interessante, ma devi stare attento, perché ha vinto ' t essere propagato a qualsiasi thread già generato (es codice inviato a un pool di thread). quindi, probabilmente è una specie di soluzione fragile. – jtahlborn

risposta

4

Si potrebbe provare a utilizzare java.lang.SecurityManager. Vedere anche this question sull'utilizzo di un gestore sicurezza per impostare diverse impostazioni di sicurezza per thread.

È possibile impostare un gestore della sicurezza e la politica di sicurezza in questo modo:

jython -Djava.security.manager=securitymanager -Djava.security.policy=policyfile 

dove SecurityManager è il responsabile della sicurezza da utilizzare e policyfile contiene specifica politica come descritto per esempio here. Se si utilizza un file di criteri come l'origine per la politica di sicurezza, ecco un esempio:

grant { 
    permission java.security.AllPermission; 
} 

Jython avrà bisogno di alcune autorizzazioni per avviare tra cui le seguenti:

grant { 
    permission java.io.FilePermission "${user.home}${/}-", "read, write"; 
    permission java.lang.RuntimePermission "createClassLoader"; 
    permission java.lang.RuntimePermission "getProtectionDomain"; 
}; 

(questo presuppone che il cachedir si trova nella directory HOME dell'utente corrente). Ciò comporterà qualcosa di simile a ciò che è necessario consentendo l'accesso in lettura e scrittura ai file nella HOME dell'utente corrente e l'accesso non autorizzato a tutte le altre parti del filesystem. Ecco il risultato (il primo open() fa riferimento a un file nella home directory dell'utente corrente in quanto questa è la directory corrente di lavoro):

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

Grazie per aver postato questa politica; Non penso esista altrove. Ho postato alcune altre autorizzazioni necessarie in una risposta di seguito (giustamente un commento se i commenti consentivano la formattazione del codice). –

0

Con Jython 2.5.2 ho trovato queste autorizzazioni necessarie:

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"; 

(Questo dovrebbe essere un commento alla risposta accettato, tranne che un commento non sarà formato leggibile.)

Problemi correlati