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:
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:
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. AccessController
verwendet, um alle Methodenanforderungen an das zugrunde liegende Objekt so weiterzuleiten, dass der nicht vertrauenswürdige Code nie mit Berechtigungen ausgeführt wird. 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:
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!
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.
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(...)
.