Programmstapelgröße

Programmstapelgröße

Ich habe gelernt, dass die Standardstapelgröße für jeden Prozess auf 8 MB begrenzt ist und mmap_base basierend auf der Stapelgröße in rlimit und einem Zufallswert berechnet wird. Der folgende Code ist die mmap_base-Funktion, die die mmap_base-Adresse in x86 (linux/include/uapi/asm-generic/resource.h) berechnet.

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

Ich frage mich, was passiert, wenn die Programmstapelgröße größer als 8 MB + RND-Wert ist? Ich meine, was passiert, wenn die Stapelgröße über mmap_base hinaus wächst? Wenn ich Stapelspeicher über 8 MB zuweise, schlägt das dann einfach mit einem Segmentierungsfehler fehl? Wenn der Kernel die Stapelgröße automatisch vergrößert, ist es dann möglich, Inhalte in mmap_base in andere Bereiche zu verschieben?

Antwort1

Die Größe des Hauptthreadstapels des Prozesses kann nicht größer als das festgelegte Limit werden. Der Standardwert dieses Limits beträgt 8 MB. Wird dieses Limit überschritten, führt dies zu einem Segmentierungsfehler und dem Prozess wird ein SIGSEGVSignal gesendet, das ihn standardmäßig beendet. Die maximale Größe des Stapels kann ulimit -svor dem Starten des Programms geändert werden. Der Kernel verschiebt sich nach dem Start des Programms nicht zwischen Speicherbereichen (wie dem mmap-Bereich) und könnte dies auch nicht tun, da es normalerweise Zeiger gibt, die auf diesen Bereich zeigen und nach der Verschiebung auf falsche Adressen zeigen würden.

Die Prüfung auf Stapelüberlauf wird jedoch durchgeführt, wenn auf den Stapelspeicher zugegriffen wird. Daher löst die bloße Durchführung einer großen Zuweisung auf dem Stapel oder eine sonstige Änderung des Werts des Stapelzeigers nicht unbedingt einen Fehler aus.

Im Sommer 2017 wurde über die Möglichkeit gesprochen, dieses Verhalten auszunutzen. Wenn ein Angreifer ein Programm dazu bringen kann, eine große Menge Speicher zu reservieren, kann dies dazu führen, dass der Stapelzeiger einen Schutzbereich überspringt und stattdessen auf einen gültigen, aber anderen Bereich zeigt. Dies eröffnet Möglichkeiten für einige clevere Tricks, um die Kontrolle über den Prozess zu übernehmen. Siehedieser lwn.net-Artikelfür eine Diskussion des Themas.

verwandte Informationen