2010-01-13 14 views
7

Ho un'applicazione java che utilizza JNI in alcune parti per fare un po 'di lavoro. Segue il solito caricamento della DLL e quindi chiama i metodi nativi della DLL. Esiste un modo per limitare i metodi nativi che possono essere eseguiti dall'applicazione java? Ad esempio, possiamo limitare le DLL a non aprire alcun file o non aprire alcun socket anche se ha il codice per farlo? Può solo proibire le DLL che carica per fare certe cose, può essere loggando qualcosa o facendo un'eccezione.Limita funzionalità codice nativo da Java

+0

Interessante domanda, ma sarebbe anche molto bello sapere di più su ciò che si sta tentando di fare. Stai cercando di consentire il caricamento di DLL di terze parti nella tua applicazione Java, ma temono di poterlo modificare? Questa è una minaccia molto reale. Una DLL può penetrare nella macchina Java e ottenere tutto da essa. –

+1

@Clark: esattamente. Non possiamo dire terzi. Ma diciamo che abbiamo l'app java. E definiamo un framework usando il quale chiunque può sviluppare una DLL e usarla con la nostra app. E voglio limitare ciò che possono ottenere dal framework. Spero tu abbia la foto. – vpram86

risposta

7

Mi è piaciuto Gregory Pakosz 'answer molto. Tuttavia, ciò che si potrebbe fare è sandbox l'istanza Java stessa. Avviare l'applicazione Java stessa in un contesto limitato.

In Windows o Unix è possibile creare un utente che è limitato a una determinata directory e ha solo accesso ad alcune DLL. Quindi la DLL chiamata da JNI può fare tutto ciò che vuole, ma non andrà molto lontano, perché l'utente Java viene eseguito come non può fare molto.

Se il tuo programma Java ha bisogno di fare cose privilegiate, il lato Java di esso dovrà parlare con un altro programma (Java o meno) per fare le sue cose "privilegiate" per esso.

Basta tenere a mente che, se non ci si può fidare della DLL, non si può più fidarsi del codice Java, poiché la DLL potrebbe avere "hackerato" la macchina Java. D'altra parte, nessuna roba cattiva dovrebbe essere in grado di uscire dai limiti dell'utente che gestiscono. (Errore di configurazione errata o bug nel sistema operativo.)

+1

+1 - stava per scrivere qualcosa di simile.L'unica cosa che aggiungerei è che potrebbe valere la pena avvolgere la DLL in una sorta di livello di servizio a cui si accede dall'applicazione Java. Ma questo potrebbe introdurre un sovraccarico inaccettabile. – kdgregory

+0

Bel suggerimento. Grazie mille Clark e Gregory! – vpram86

1

Normalmente si esegue l'applicazione con il gestore della sicurezza Java ma non credo che abbia alcun effetto sul codice che esegue il JNI.

+0

Grazie. Mi chiedevo se possiamo restrcit atleast creazione o eliminazione di file impostando alcune proprietà nel gestore di sicurezza per quanto riguarda il caricamento della DLL. – vpram86

8

No, non è possibile. La DLL viene caricata nel suo complesso e quindi il lato Java non ha alcun controllo su ciò che sta facendo il codice nativo.

Una soluzione potrebbe essere un tipo di uomo nell'approccio centrale. Ciò implicherebbe la codifica di una DLL "shell" che ha la stessa interfaccia della DLL originale. Indica a Java di caricare una DLL "shell", ad esempio inserendola in una posizione specifica e utilizzando la proprietà java.library.path. Quindi il ruolo della DLL "shell" è di caricare la DLL "vera" sandboxing e reindirizzare le funzioni standard. Questo suona come un sacco di dolore e questo qualcosa che accadrebbe nella parte nativa delle cose, non da Java.

+0

Grazie. Lo capisco. Non c'è modo in cui possiamo dire al processo java di caricarlo con la proprietà di tipo di restrizione stessa? – vpram86

+0

Wow! Molte grazie. Ma questo lega la shell alla DLL originale e se abbiamo molte DLL potremmo avere anche DLL di shell corrispondenti :(che come hai detto è molto pesante. Stavo pensando se è possibile attraverso alcune proprietà durante il caricamento o l'avvio di JVM args Ma grazie mille per l'intuizione – vpram86

1

È possibile implementare un tipo di impostazione che il codice JNI potrebbe ottenere. Ad esempio, su un sistema UNIX, è possibile creare gruppi per tipi speciali di privilegi e verificare se l'utente corrente dispone dei privilegi richiesti, altrimenti è sufficiente restituire 0 o qualcosa.

+0

Esattamente. Molte grazie!. Questo è stato quello che è stato discusso nella risposta di Clark. Potremmo usare lo stesso anche in Unix. – vpram86

Problemi correlati