프로그램 스택 크기

프로그램 스택 크기

프로세스당 기본 스택 크기 제한은 8MB이고 mmap_base는 스택 크기와 rlimit의 임의 값을 기반으로 계산된다는 것을 알고 있습니다. 아래 코드는 x86(linux/include/uapi/asm-generic/resource.h)에서 mmap_base 주소를 계산하는 mmap_base 함수입니다.

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);
}

프로그램 스택 크기가 8MB+rnd 값보다 큰 경우 어떻게 되는지 알고 싶습니다. 스택 크기가 mmap_base 이상으로 커지면 어떻게 됩니까? 8MB 이상의 스택 메모리를 할당하면 분할 오류로 인해 실패합니까? 커널이 자동으로 스택 크기를 확장하면 mmap_base의 내용을 다른 공간으로 이동할 수 있습니까?

답변1

프로세스 기본 스레드 스택 크기는 설정된 제한보다 커질 수 없습니다. 이 제한의 기본값은 8MB입니다. 이 제한을 초과하면 분할 오류가 발생하고 프로세스에 신호가 전달되어 SIGSEGV기본적으로 종료됩니다. ulimit -s프로그램을 시작하기 전에 스택의 최대 크기를 변경할 수 있습니다. 프로그램이 시작된 후 커널은 메모리 영역(예: mmap 영역)에서 이동하지 않으며 그렇게 할 수도 없습니다. 일반적으로 해당 영역을 가리키는 포인터는 이동 후 잘못된 주소를 가리키기 때문입니다.

그러나 스택 메모리에 액세스할 때 스택 오버플로 검사가 수행되므로 단순히 스택에 대규모 할당을 수행하거나 스택 포인터 값을 변경한다고 해서 반드시 오류가 발생하는 것은 아닙니다.

이 동작을 악용할 가능성은 2017년 여름에 논의되었습니다. 일부 공격자가 프로그램을 속여 많은 양의 메모리를 할당할 수 있는 경우 스택 포인터가 보호된 영역을 건너뛰고 유효하지만 다른 영역을 가리킬 수 있습니다. 이는 프로세스를 제어할 수 있는 몇 가지 영리한 트릭을 사용할 수 있는 기회를 열어줍니다. 바라보다이 lwn.net 기사이 문제를 논의해 봅시다.

관련 정보