2012-03-12 3 views
6

Ho visto più volte che non c'è modo di limitare l'utilizzo della memoria di uno script Lua, comprese le persone che saltano attraverso i cerchi per impedire agli script Lua di creare funzioni e tabelle. Ma dato che lua_newstate ti permette di passare un allocatore personalizzato, non è possibile usarlo solo per limitare il consumo di memoria? Nel peggiore dei casi, si potrebbe usare un allocatore basato su arena e porre un limite rigido anche alla quantità di memoria che potrebbe essere utilizzata dalla frammentazione.Limitare l'utilizzo della memoria di uno script Lua?

Mi manca qualcosa qui?

+1

"Ho visto dire più volte" Due parole: Citazione necessaria. –

+0

La pagina wiki Lua su sandbox menziona l'utilizzo della memoria come possibile attacco ma non menziona i modi per limitarlo: http://lua-users.org/wiki/SandBoxes. Penso di aver interpretato erroneamente questa pagina in cui si parlava di "Looah" non di Lua: http://www.sk89q.com/2010/03/sandboxed-lua-via-php/ –

+1

"sono sempre in giro a cercare di impedire la creazione di funzioni o tabelle. " Questo perché non vogliono che creino tabelle e funzioni. Vogliono preservare lo scopo globale. Questo è un compito diverso dal solo impedire l'utilizzo della memoria. –

risposta

9
static void *l_alloc_restricted (void *ud, void *ptr, size_t osize, size_t nsize) 
{ 
    const int MAX_SIZE = 1024; /* set limit here */ 
    int *used = (int *)ud; 

    if(ptr == NULL) { 
    /* 
     * <http://www.lua.org/manual/5.2/manual.html#lua_Alloc>: 
     * When ptr is NULL, osize encodes the kind of object that Lua is 
     * allocating. 
     * 
     * Since we don’t care about that, just mark it as 0. 
     */ 
    osize = 0; 
    } 

    if (nsize == 0) 
    { 
    free(ptr); 
    *used -= osize; /* substract old size from used memory */ 
    return NULL; 
    } 
    else 
    { 
    if (*used + (nsize - osize) > MAX_SIZE) /* too much memory in use */ 
     return NULL; 
    ptr = realloc(ptr, nsize); 
    if (ptr) /* reallocation successful? */ 
     *used += (nsize - osize); 
    return ptr; 
    } 
} 

Per rendere Lua utilizzare l'allocator, è possibile utilizzare

int *ud = malloc(sizeof(int)); *ud = 0; 
lua_State *L = lua_State *lua_newstate (l_alloc_restricted, ud); 

Nota: non ho ancora testato la fonte, ma dovrebbe funzionare.

+0

Grazie, anche se quello che mi stavo chiedendo è perché non ho mai visto nessuno usare questa tecnica; stanno sempre cercando di impedire la creazione di funzioni o tabelle. –

+0

Ora che ho guardato di nuovo, sembra che la ragione sia che le persone stanno cercando di inserire il codice sandbox da Lua. –

+1

Penso che int tu malloc voglia davvero essere azzerato prima dell'uso –