2010-10-23 23 views
3

Posit la situation suivante:Quel est le plus proche des isolats vrais (limités en ressources) dans la JVM aujourd'hui?

  • Vous avez un système vaste et complexe (distribué, ensemble de données en même temps, énorme) qui supporte de nombreux utilisateurs. Le code est envoyé aux données.
  • Vous souhaitez autoriser le code mobile dans le système - à savoir le code non sécurisé qui se déroulera dans les mêmes JVMs que le reste du système, pour tirer profit de la localité des données, éviter désérialisation etc.

Vous pouvez placer le code dans un classloader amusant et utiliser une stratégie de sécurité personnalisée comme le fait l'applet runner. Mais il y a encore des problèmes:

Le système dans son ensemble devrait être protégé contre les codes malveillants - par exemple, engendrer des charges de threads, manger tout le CPU, allouer trop de mémoire.

L'idée évoquée au début du millénaire était JSR-121. Les isolats étaient censés apporter la plupart des avantages de l'isolation des processus - limites sur l'utilisation de l'unité centrale, la multiplication des threads, l'utilisation du tas: allocation de ressources en général. Etant donné que cet effort a apparemment été abandonné par Sun, quel est le plus proche que nous pouvons obtenir actuellement?

Jusqu'à présent, mes idées sont:

  • bytecode traduire le code à insérer le suivi de l'allocation. Google semble avoir fait quelque chose de similaire à ceci: http://code.google.com/p/java-allocation-instrumenter/. Il faut un peu de travail car Google s'est bloqué dans un coin et a fait toutes sortes de choses privées ...
  • Interdire aussi les appels à des choses que le gestionnaire de sécurité ne peut pas, par exemple la création de threads.
  • Insérez des vérifications d'interruption (rares) dans des boucles et des fonctions récursives pour qu'un thread de surveillance puisse les regarder (en utilisant ThreadMXBean), et si cela prend trop de temps, interrompez le thread incriminé. Il serait peut-être plus simple de limiter la réentrance - dans tout appel au code utilisateur, un bloc de base ne peut être saisi que n fois avant d'être abandonné.

Y a-t-il des façons meilleures ou existantes de le faire?

+0

La meilleure façon que je pouvais penser de droite est de jeter chaque utilisateur dans sa propre JVM qui a un faible XMX, et est limitée par le système d'exploitation pour le CPU. Très inefficace au fur et à mesure que le nombre d'utilisateurs augmente, mais l'idée de coder quelque chose comme ça me dépasse. – bwawok

+0

Une chance jusqu'à présent? Voulez-vous mettre à jour? Merci. J'ai cherché cela aussi, c'est à quel point j'ai eu http://stackoverflow.com/questions/3887130/java-implementation-of-a-jvm – mschonaker

Répondre

2

Cette question est complexe. Ma première pensée a été de créer un langage spécifique au domaine qui fait ce dont les utilisateurs 'mobiles' ont besoin. La DSL n'aurait aucune capacité à effectuer une opération dangereuse.

Qui sont les personnes qui téléchargeraient du code non fiable? Cela semble être une idée douteuse pour commencer. Nous faisons beaucoup d'efforts pour nous assurer que les gens ne peuvent pas exécuter du code non fiable ;-)

+1

Un DSL est un énorme bidon de vers. Si c'est interne, vous avez ces problèmes de toute façon. Si c'est externe, vous devez réellement concevoir la langue - la conception de langue est une énorme quantité plus dure que la manipulation de code d'octet! Et également implémenter une traduction assez bonne en code octet pour que le hotspot fonctionne réellement. Et de toute façon, concevoir un dsl qui "ne peut pas" causer de fuites de ressources est un problème. Cette partie doit être runtime. Donc, je préfèrerais utiliser un langage existant que les gens connaissent avec des outils décents car un dsl ne résout pratiquement aucun des problèmes réels. – rjw

+1

Quant à l'idée douteuse jibe, que diable pensez-vous que le point de la gestion de la sécurité était en premier lieu? Pour exécuter un code non fiable .. – rjw

1

Le problème est que la seule façon d'isoler un processus est d'avoir une machine/un matériel dédié. Tout ce que vous faites d'autre, vous devrez faire des compromis. En fonction de ce que ces compromis sont acceptables, dépend de la pratique de partager une JVM avec ce code.

Ce n'est pas un problème que vous pouvez résoudre pour le cas général d'une manière triviale parce que vous voulez protéger contre les choses que vous n'avez pas pensé (que d'autres pourraient penser d'un jour)

+0

Ceci est un peu une réponse insatisfaisante, essentiellement un argument de l'incrédulité personnelle. Je pense que vous devez relire la question et trouver une raison réelle pour laquelle l'approche ne fonctionnerait pas ... Votre plainte, si elle était valide, prouverait que les systèmes de type, la protection de la mémoire, la sécurité basée sur les capacités et tous les autres mécanismes de protection ne fonctionne pas. Aucun de ces systèmes ne protège contre les choses qui ne vont pas bien et auxquelles leurs auteurs n'ont pas pensé. Tbh, ce truc n'est même pas nouveau - les SGBD ont été des requêtes contraignantes sur les ressources depuis les années soixante-dix. Il n'y a rien de magique ici. – rjw

+1

Oui, il existe des techniques pour minimiser l'impact entre les systèmes de bien-être. Cependant, pour vous protéger contre les «codes malveillants», vous avez besoin d'un système séparé. Par exemple, je peux écrire un programme simple en Java qui écrira des données sur le disque d'une manière qui mettra un système à genoux. même ssh ou smtp penseront que le système est inutilement lent. Vous pouvez utiliser le gestionnaire de sécurité pour empêcher cela et bien d'autres opérations jusqu'à ce que le code malicieux ne puisse plus rien faire, alors cela n'aura aucun impact. Fondamentalement, avec un code malveillant, tout ce que vous lui permettez de faire peut être utilisé contre vous. –

+1

Un moyen simple de ralentir une machine est de créer des objets sans fin et de déclencher beaucoup de GC. La mémoire totale des threads n'a pas besoin d'être grande mais peut ralentir considérablement votre JVM. Supposons que vous ayez désactivé toute création d'objet (rendant le code assez inutilisable), le code malicieux pourrait encore appeler des méthodes comme File.length() qui crée des objets dans l'appel JNI et peut générer 400 Mo/s de déchets. Remarque: ce type d'activité peut ralentir non seulement la JVM, mais aussi affecter de manière mesurable les performances de l'ensemble de la machine. –