tamanho da pilha do programa

2

Eu aprendi que o tamanho padrão da pilha para cada processo é limitado a 8MB e o mmap_base é calculado com base no tamanho da pilha no rlimit e no valor aleatório. O código abaixo é a função mmap_base que calcula o endereço mmap_base em 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);
}

Eu estou querendo saber se o tamanho da pilha do programa é maior que 8MB + valor rnd? Quero dizer, e se o tamanho da pilha crescer acima de mmap_base? Se eu alocar memória de pilha acima de 8MB, ela falhará com falha de segmentação? Se o tamanho da pilha de ampliação do kernel automaticamente é possível mover o conteúdo em mmap_base para outros espaços?

    
por JuHyung Son 27.11.2017 / 05:34

1 resposta

2

O tamanho da pilha do encadeamento principal do processo não pode crescer além do limite definido. O valor padrão desse limite é de 8 MB. Exceder este limite resultará em uma falha de segmentação e o processo receberá um sinal SIGSEGV , por padrão, matando-o. O tamanho máximo da pilha pode ser alterado com ulimit -s antes de iniciar o programa. O kernel não se movimenta pelas áreas de memória (como a área do mmap) depois que o programa foi iniciado, e não pôde fazê-lo, porque geralmente há ponteiros apontando para essa área que apontam para endereços errados após o movimento.

No entanto, a verificação de estouro de pilha é executada quando a memória da pilha é acessada, portanto, apenas executar uma alocação grande na pilha ou alterar o valor do ponteiro da pilha, não necessariamente dispara uma falha.

Houve alguma conversa no verão de 2017 sobre a possibilidade de explorar esse comportamento. Se algum invasor puder enganar um programa para alocar uma grande quantidade de memória, isso pode fazer com que o ponteiro da pilha ignore uma área de guarda e aponte para uma área válida, mas diferente. Isso abre oportunidades para alguns truques inteligentes para assumir o controle do processo. Veja este artigo do lwn.net para uma discussão sobre o assunto.

    
por 28.11.2017 / 20:03