Meine Posts hier sind alles nur meine persönliche Ansicht. Beim Design von CPUs/Betriebssystemen geht man immer Kompromisse ein, mit denen nicht jeder einverstanden ist. Meine einzige absolute Aussage ist, dass alle absoluten Aussagen falsch sind.
Meine Grundannahme ist, dass jedes System, bei dem Stackschutz relevant ist, Virtual Memory beherrscht. Ansonsten ist kann man da nicht viel mit Sicherheit argumentieren und die Erkennung von Fehlern in ausgelieferten Programmen rechtfertigt keine aufwändigen CPU-Features. Guard Pages fangen Stack Overflows ab, wenn der Stack Pointer höchstens ein paar Kilobytes
1) über das Ende hinausgeht. Die Frage ist also, wieviel Aufwand man treiben will, um Stack Overflows zu erkennen, bei denen der Stack Pointer größere Sprünge macht.
Mir fallen nur zwei Ursachen ein: Wenn ein Programmierer versucht sehr große, dünnbesetzte Objekte auf dem Stack anzulegen, oder ein Angriff durch Schadsoftware. Den ersten Fall argumentiere wie eben auch weg: Der Programmierer braucht kein aufwändiges CPU-Feature, um seinen Fehler zu erkennen. Den zweiten Fall kann man nur wegargumentieren, wenn man entweder andere Sicherheitslücken vorschiebt (also den Overflow als Folgefehler deklariert) oder aber wie ich behauptet, dass man das erstmal einen erfolgreichen Angriff durch einen Stack Overflow, der nicht von Guard Pages abgefangen wird, hinkriegen muss. Das Ziel eines solchen Angriffs ist ja etwas außerhalb des Stacks zu überschreiben (andere Angriffe erkennt ein Overflowschutz nicht). Sowas kann man auch versuchen zu verhindern, indem man Stack, Heap, Programm, Shared Librarys an zufälligen Adressen im Speicher platziert (
ALSR.) Damit kann man meistens die Erfolgswahrscheinlichkeit von Angriffen reduzieren. Das ist genauso wie Guard Pages kein 100%iger Schutz, aber (vermutlich) einfacher umzusetzen als die Alternativen (Extra-Bit für Adressen, Segmentierung).
1) Wenn man einen 64-Bit-Adressraum hat, dann ist gegen Guard Pages, die ein paar Mega- oder Gigabyte überspannen, auch nichts einzuwenden.