Le dev frontend lancerait Guard comme ceci: [Bundle exec] Guard-g frontend traits_type:: minimum_size () < = size and traits_type:: is_unbounded () | | (taille < = traits_type:: maximum_size ()). En fait, la pile déborde probablement des pièges, car il sort de la taille allouée pour le segment de pile. Au moins si vous l`utilisez sur 386/486/Pentium, où l`emballage complètement autour est moins probable. Cela a été utilisé dans un système d`exploitation propriétaire que j`ai travaillé avec. Presque tout ce qu`il ya dans les segments alloués séparément, 386 pris en charge (probablement l`un des rares OS`es à utiliser les fonctionnalités de segmentation que les concepteurs d`Intel prévu!), mais toutes les autres douleurs causées par la mémoire segmentée fait probablement cela ne vaut pas la peine. Le 19 juin, Qualys a divulgué un ensemble de vulnérabilités qui font qu`il est clair qu`une seule page de garde n`est pas suffisante pour protéger contre les attaques de dépassement de pile. Ces vulnérabilités ont été doublées de «Stack Clash»; le nom de domaine associé, le logo et la ligne de sous-vêtements de créateurs ne semblent pas avoir été mis en place encore. Ce problème a été clairement discuté dans les chaînes privées pendant un certain temps, car un certain nombre de distributeurs étaient immédiatement prêts avec des mises à jour du noyau pour atténuer le problème. Le problème fondamental avec la page de garde est qu`il est trop petit. Il existe un certain nombre de façons dont la pile peut être développée par plus d`une page à la fois. Ceux-ci incluent des emplacements dans la bibliothèque C de GNU qui font de grands appels et programmes d`alloca () avec de grandes baies de longueur variable ou d`autres grandes structures de données sur-pile. Il s`avère être relativement facile pour un attaquant de provoquer un programme pour générer des adresses de pile qui sautent sur la page de garde, piétinant sur n`importe quelle mémoire est placée sous la pile.
Les attaques de preuve de concept postées par Qualys sont toutes des exploits d`exécution de code local, mais il semble téméraire de supposer qu`il n`y a pas de vecteur par lequel le problème pourrait être exploité à distance. Cela va gâcher avec le profil de performance (allouer des pages plus earlyer que prévu) et diminuer les performances totales dans le cas où l`application n`allait pas toucher ces pages du tout. La région de garde de 1MB devrait en effet être difficile de sauter par-dessus. Il est (ou devrait être) un programme rare qui tente d`allouer que beaucoup de mémoire sur la pile, et d`autres limites (telles que la limite de longueur de ligne de commande) devrait rendre difficile de tromper un programme à faire une telle allocation. Sur la plupart des systèmes 64-bit, il devrait être possible de rendre la région de garde un peu plus grande si l`administrateur s`inquiète que 1MB ne suffit pas. Il y a sans doute des attaquants qui travaillent fébrilement sur des façons de sauter sur ces régions, mais, pendant un certain temps au moins, ils peuvent bien conclure qu`il existe des moyens plus faciles d`attaquer un système donné. . C`est votre page de garde de pile; Cela signifie que votre fonction infiniment recursing ne va pas hors d`un griffonnage sur la pile de son thread voisin, il va juste segmentation comme un bon petit fil. Les piles segmentées sont actuellement uniquement prises en charge par GCC à partir de la version 4,7 et Clang à partir de la version 3,4. Afin d`utiliser un segmented_stack Boost. Fiber doit être construit avec des piles segmentées de propriété, par exemple Toolset = GCC segmenté-Stacks = on et l`application de BOOST_USE_SEGMENTED_STACKS à la ligne de commande B2/bjam.
Les piles segmentées ne peuvent être utilisées qu`avec callcc () à l`aide de la propriété Context-impl = ucontext. La menace d`escalade de privilège locale suppose que le code C de privilège élevé est approuvé, puis l`exploite.