Nem stack-en fut a kód. Olyasmi a lényeg, hogy a kernel stack-en túlcsordulás miatt át tudja írni a visszatérési címet egy userlandbeli kód címére, ahova meg azt tölt be előtte amit csak akar.
Ez ellen valszeg szegmentálással lehetne védekezni, némi teljesítményromlás mellet, ha támogatja az architektura, de gondolom amiatt hogy nem csak egy arch-on fut a kernel, ezt nem valósították meg. Többek közt az x86_64-ekbe már nem is támogatja a proci.
Persze el lehet képzelni mindenféle protector-cookie-kat meg hasonlókat. Ha jól tudom a kernel heap-re terveznek hasonló megoldást. Meg talán a gcc-ben is van stack-protector opció, bár kérdés hogy maga a kernel lefordítható-e azzal. Persze itt azért gondolom az is játszik, hogy minden plusz biztonsági megoldás ront a rendszer teljesítményén.
Az utolsó mondatra meg: épp az amd64-ben hozták vissza a relatív ugrásokat :-)