Kann ich eine Java-Klasse so laden, dass ihre Berechtigungen automatisch entfernt werden?

8

Ich arbeite an der Entwicklung einer Bibliothek, die nicht vertrauenswürdige Objekte instanziieren und zurückgeben muss, die von einer externen Website heruntergeladen wurden. Auf einer höheren Ebene funktioniert die Bibliothek wie folgt:

  • Clients der Bibliothek fordern eine Klasse von einer entfernten Quelle an.
  • Meine Bibliothek instanziiert dieses Objekt und gibt es dann an den Benutzer zurück.

Dies ist ein großes Sicherheitsrisiko, da der nicht vertrauenswürdige Code praktisch alles Mögliche kann. Um dies zu beheben, hat meine Bibliothek folgendes Design:

  • Ich aktiviere SecurityManager und benutze bei der Instanziierung des nicht vertrauenswürdigen Objekts AccessController , um die Instanziierung in einem Kontext zu behandeln, in dem es keine Privilegien gibt.
  • Vor dem Zurückgeben des Objekts an den Client wickle ich das Objekt in einen Decorator, der eine AccessController verwendet, um alle Methodenanforderungen an das zugrunde liegende Objekt so weiterzuleiten, dass der nicht vertrauenswürdige Code nie mit Berechtigungen ausgeführt wird.
Es fällt mir jedoch ein, dass dies nicht die eleganteste Lösung ist. Grundsätzlich möchte ich alle Berechtigungen von jedem beliebigen Objekt entfernen, das von der Remote-Quelle heruntergeladen wurde. Meine aktuelle Verwendung von AccessController ist einfach eine Möglichkeit, dies zu fälschen, indem alle Anfragen abgehört und Privilegien fallengelassen werden, bevor sie ausgeführt werden. Der AccessController -Ansatz hat auch seine eigenen Probleme:

  • Wenn das umschlossene Objekt über Methoden verfügt, die Objekte zurückgeben, müssen diese zurückgegebenen Objekte selbst umgebrochen werden.
  • Der Wrapper-Code wird möglicherweise Tausende von Zeilen lang sein, da jede exportierte Methode gesichert werden muss.
  • Alle vom heruntergeladenen Objekt exportierten Methoden müssen im Voraus bekannt sein, damit sie eingebunden werden können.

Meine Frage lautet: Gibt es eine Möglichkeit, Klassen in die JVM zu laden (wahrscheinlich mit einem benutzerdefinierten ClassLoader ), so dass alle Instanzen dieser Klassen ihre Methoden ohne Berechtigungen ausführen?

Danke!

    
templatetypedef 27.12.2013, 19:30
quelle

2 Antworten

1

Sie möchten defineClass mit einem nicht vertrauenswürdigen ProtectionDomain aufrufen.

Ihre aktuelle Lösung hat eine Reihe von Problemen. Es scheint den statischen Initialisierer nicht abzudecken. Es kann möglich sein, Code in einige veränderbare Argumente zu installieren. Methoden, die den unmittelbaren Aufrufer verwenden, sind weiterhin privilegiert ( AccessController.doPrivileged , sagen wir mal). Aber am allermeisten fällt es auf, wenn man gegen irgendeine Art von Globalität reibt - zum Beispiel wenn man einen Finalisierer spielt.

    
Tom Hawtin - tackline 28.12.2013, 05:46
quelle
1

Ich weiß nicht, ob es eine Möglichkeit gibt, das zu tun, was Sie gefragt haben, aber ich denke, Ihr Ansatz kann durch die Verwendung von Schnittstellen und dynamischen Proxies vereinfacht werden. Wenn Sie eine Schnittstelle für das zurückzugebende Objekt haben und alle Methoden entweder einfache Typen oder Schnittstellen zurückgeben, können Sie alle Methoden und deren Rückgabewerte automatisch umbrechen, ohne die Methoden im Voraus zu kennen. Implementiere einfach ein InvocationHandler , das die AccessController magic in seiner Aufrufmethode ausführt, und erstelle Proxies mit Proxy.newProxyInstance(...) .

    
aditsu 27.12.2013 20:11
quelle

Tags und Links