tamaño de la pila del programa

tamaño de la pila del programa

Aprendí que el tamaño de pila predeterminado para cada proceso está limitado a 8 MB y mmap_base se calcula en función del tamaño de la pila en rlimit y el valor aleatorio. El siguiente código es la función mmap_base que calcula la dirección mmap_base en x86 (linux/include/uapi/asm-generic/resource.h).

static unsigned long mmap_base(unsigned long rnd)
{
    unsigned long gap = rlimit(RLIMIT_STACK);

    if (gap < MIN_GAP)
        gap = MIN_GAP;
    else if (gap > MAX_GAP)
        gap = MAX_GAP;

    return PAGE_ALIGN(TASK_SIZE - gap - rnd);
}

Me pregunto qué pasa si el tamaño de la pila del programa es superior a 8 MB+valor rnd. Quiero decir, ¿qué pasa si el tamaño de la pila crece por encima de mmap_base? Si asigno memoria de pila superior a 8 MB, ¿simplemente fallará con una falla de segmentación? Si el kernel aumenta el tamaño de la pila automáticamente, ¿es posible mover el contenido de mmap_base a otros espacios?

Respuesta1

El tamaño de la pila del subproceso principal del proceso no puede superar el límite establecido. El valor predeterminado de este límite es 8 MB. Exceder este límite resultará en una falla de segmentación y el proceso recibirá una SIGSEGVseñal, matándolo de forma predeterminada. El tamaño máximo de la pila se puede cambiar ulimit -santes de iniciar el programa. El núcleo no se mueve por áreas de memoria (como el área mmap) después de que se ha iniciado el programa, y ​​no puede hacerlo, porque normalmente hay punteros apuntando a esta área que apuntarían a direcciones incorrectas después del movimiento.

Sin embargo, la verificación del desbordamiento de la pila se realiza cuando se accede a la memoria de la pila, por lo que simplemente realizar una asignación grande en la pila o cambiar el valor del puntero de la pila no necesariamente desencadena una falla.

En el verano de 2017 se habló de la posibilidad de explotar este comportamiento. Si algún atacante puede engañar a un programa para que asigne una gran cantidad de memoria, esto puede provocar que el puntero de la pila se salte un área de guardia y apunte a un área válida, pero diferente. Esto abre oportunidades para que algunos trucos inteligentes tomen el control del proceso. Vereste artículo de lwn.netpara una discusión sobre el tema.

información relacionada