프로그램 스택 크기

프로그램 스택 크기

각 프로세스의 기본 스택 크기는 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 기사문제에 대한 토론을 위해.

관련 정보