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.