3 Réponses :


2
votes

lual_loadfile () chargera le morceau, puis appelez lua_setfenv () pour définir la table d'environnement, appelez lua_pcall () pour exécuter le morceau. Voir la récente réponse donnée par le juge Maygarden à Appel de la Lua Fonctions de .Lua's Utiliser des poignées?


0 commentaires

9
votes

Voir la discussion au wiki de l'utilisateur Lua de Sandboxing et le sujet plus général de < Un href = "http://lua-users.org/wiki/scriptsecurity" rel = "noreferrer"> Security Security . Il y a un certain nombre de problèmes subtils et pas si subtils avec ce genre de chose. Cela peut être fait, mais la protection contre le code tel que pour i = 1 14e39 do end finalement nécessite plus que de simplement limiter quelles fonctions sont disponibles sur un bac à sable.

La technique générale consiste à créer un environnement de fonction pour le bac à sable qui a une blancheur de fonctions autorisées. Dans certains cas, cette liste peut même être vide, mais laisser l'utilisateur avoir accès à paires () , par exemple, est presque certainement inoffensif. La page Sandbox a une liste des fonctions système décomposées par leur sécurité comme une référence pratique pour la construction d'un tel blancheur.

Vous utilisez ensuite lua_setfenv () pour appliquer l'environnement de fonction au script de l'utilisateur que vous avez chargé (mais pas encore exécuté) avec lua_loadfile () ou ou Lua_Loadstring () selon le cas. Avec l'environnement joint, vous pouvez l'exécuter avec lua_pcall () et amis. Avant l'exécution, certaines personnes ont effectivement numérisé le bytecode chargé pour les opérations qu'ils ne veulent pas permettre. Qui peut être utilisé pour interdire absolument des boucles ou écrire aux variables globales.

Une autre note est que les fonctions de chargement chargeront généralement des bytecodes précompilés ou du texte LUA. Il s'avère beaucoup plus sûr si vous n'autorisez jamais de bytecode précompilé, car un certain nombre de façons de rendre la mauvaise conduite de VM ont été identifiées que toutes dépendent de la fabrique de fabrique de la traçabilité. Étant donné que les fichiers Bytecode commencent par une séquence d'octets bien définie qui n'est pas un texte de texte ASCII clair, tout ce que vous avez à faire est de lire le script dans un tampon à chaîne, de tester pour l'absence du marqueur et ne le transmet que sur lua_loadstring ( ) s'il n'est pas bytecode.

Il y a eu une discussion juste à la Liste de mailing Lua-L sur Les années de ce genre de chose, alors la recherche de la recherche est également susceptible d'être utile.


1 commentaires

Merci; Je me suis déjà occupé de boucles infinies en définissant un crochet de débogage qui met fin au script après 10 millions d'instructions. En ce qui concerne les fonctions, le fichier fourni par l'utilisateur ne contient que des variables globales et aucune fonction que ce soit, donc je n'ai pas besoin de la fonction blanche.



5
votes

Au fait, c'est ce que j'ai fini par faire:

static void Pop(int elements = 1) { lua_pop(mState, elements); }

/* Sets a maximum number of instructions before throwing an error */
static void SetMaximumInstructions(int count) {
    lua_sethook(mState, &Lua::MaximumInstructionsReached, LUA_MASKCOUNT, count);
}
static void ClearMaximumInstructions() {
    lua_sethook(mState, &Lua::MaximumInstructionsReached, 0, 0);
}

static void MaximumInstructionsReached(lua_State *, lua_Debug *)
{
    Error("The maximum number of instructions has been reached");
}

static int GetStackSize() { return lua_gettop(mState); }


0 commentaires