Hallo,
Magic Cookies sind mehr als nur eine simple Buffer-Overflow-Erkennung, sie können (wenn die zugrundeliegenden Informationen Position/Wert des Cookies sicher versteckt sind) auch Stack-Angriffe vermeiden. Kostet natürlich Performance.
Gruß,
Svenska
Objekte auf den Stack zu legen anstatt dafür den Heap zu benutzen ist eigentlich eine Entscheidung das Programmierers. Sicher kann man versuchen das der Compiler da zur compilezeit etwas optimiert oder man könnte Code einfügen lassen der zur Laufzeit ermittelt wie viel Speicher da eigentlich geholt werden soll und wenn das nicht zu viel ist (<= z.B. 64kBytes) dann wird einfach Stack benutzt. Ich denke schon das man da einiges vom Compiler optimieren lassen könnte aber ich glaube nicht dass das heutige Compiler bereits tun.Würde mich nicht wundern, wenn sie das tun - das bringt eine Menge Performance, wenn eben dieser Kleinkram nicht über die Heap-Verwaltung geht und wenn der Stack ausreichend groß ist, kann man das auch mit größeren kurzlebigen Objekten tun.
Was die "Magic Cookies" angeht so ist das einfach ein Problem der Stack-Implementierung, das der Stack nach unten wächst aber alle anderen Datenstrukturen nach oben ist einfach eine Fehlkonstruktion (zumindest aus heutiger Sicht wo der Stack einfach ein beliebiger dynamischer Bereich des Speichers ist und nicht das obere Ende eines fixen Real-Mode-Segments). Deswegen wächst mein Stack ja auch nach oben und schon ist dieses Problem nur noch halb so schlimm, trotzdem werde ich noch etwas Denkarbeit in die Realisierung von VLAs usw. investieren müssen.Naja, du kannst als Userspace-Programm deinen Stack auch per Hand adressieren und wenn du dann in der Lage bist, die Rücksprungadressen zu verändern (unter DOS nur ein "pop" zuviel), dann fliegt dir dein Programm um die Ohren. Viel schlimmer ist es, dass du Argumentübergabe auch über den Stack machst und die Syscalls daraus unter Umständen irgendetwas berechnen. Das ist ein wunderbarer Angriffsvektor, wenn die Syscalls nicht sicher implementiert sind und das ist genau unabhängig von der Richtung, in die der Stack wächst... man denke auch an Return Based Programming.
Echten Zufall müsste eigentlich auch die CPU selber zur Verfügung stellen, etwa so wie VIA das macht, und schon wäre noch ein Angriffspunkt weg. Wenn der Referenzwert für die Cookies irgendwo im Speicher liegt dann ist er dort auch lesbar und vor allem auch manipulierbar. Welches OS markiert schon die Pages in denen die .const-Section liegt wirklich als Read-Only?Sollte jedes moderne OS eigentlich tun, bei Linux bin ich mir relativ sicher und bei Windows auch (weil dort viel an Sicherheit gedacht wurde). Wenn man das NX-Bit vollständig unterstützt, dann ist das RO-Bit doch nur noch eine Nebensache, weil die Infrastruktur (Page-Permissions) schon da ist... Wahrer Zufall wird auch von den CPUs nur begrenzt (OpenSSL unterstützt den RNG von VIA-CPUs übrigens nicht, weil er bestimmte Anforderungen nicht erfüllt), außerdem kann das nicht jede CPU. Wenn das vorhanden ist, ist das allerdings eine sehr gute (weitere) Quelle für Zufallszahlen.
Wenn dieses Magic Cookie für jeden Stack extra abgespeichert wird, und zwar in nicht-Userspace-lesbaren Kernel-Strukturen (!), dann kann die Applikation das nicht wissen und damit auch nicht dagegen vorgehen. Aber sicher ist nur, dass es keine absolute Sicherheit gibt - aber selbst eine simple Buffer-Overflow-Erkennung ist schon etwas richtig feines.Irgendwo muss es doch aber gespeichert sein, damit zu einen Wert zum überprüfen hast und diese Adresse dieses Wertes muss auch bekannt sein.Das ist eines der Probleme dieser Stack-Protectoren. Die schützen zwar gegen "aus versehen" fehlerhaften Code oder simple Buffer-Overflows aber nicht gegen einen gezielten und mit Köpfchen vorbereiteten Angriff.
Als Mindestausstattung an qualitativ hochwertigen Sportgeräten sollte eine Freundin vorhanden sein, da gibt es dann schon viele flexible Möglichkeiten zur körperlichen Bewegung, auch an frischer Luft. Ich meine so Dinge wie eine Fahrradtour usw.In Ermangelung einer solchen gehe ich jeden Morgen/Abend insgesamt ein paar km zu Fuß zur derzeitigen Arbeitsstelle. Das muss an Bewegung ausreichen.
Ich kann mir ein Array int ar[1] deklarieren und dann mit Indizierung ( ar[1024*1024*1024] ) durchaus gezielt auf Speicher vor/hinter dem Array zugreifen. Wenn ich weiß, wo mein Array liegt (kann ich über den Pointer rauskriegen, in einem linaren Adressraum) und ich weiß, wie groß meine Daten sind (ich kenne mein Programm), dann weiß ich im Normalfall auch, wo die Rücksprungadressen sind und kann diese gezielt überschreiben. Da der Stack mein eigener ist, kannst du dich davor auch nicht schützen: Stack muss les- & schreibbar sein. Stack ausführen ist auch so ne nette Technik, die für Exploits gerne benutzt wird - denn die Übergabeparameter in die Syscalls liegen auch auf dem Stack und so bekommt man Code in den Kernel, ohne dass dieser es merkt.Zitat von: erikMan muss ein Array nicht zwangsläufig von Index 0 bis Index X linear durchlaufen, man kann da auch Lücken lassen die dann eben übersprungen werden. Ist das selbe Problem wie mit den Guard-Pages, wenn Du weißt wo die sind und wie groß die sind dann ist es kein Problem da drüber zu kommen.Wir reden von Buffer-Overflows und das Problem ist ja das du etwas (linear) in den Buffer schreibst, aber davon ausgehst das sich jeder an gewisse Regeln hält was die Größe betrifft und wenn er das nicht macht, wird mehr in den Buffer geschrieben, als der Buffer groß ist. Das geschiet doch aber alles, wie gesagt, linear oder?
Magic Cookies sind mehr als nur eine simple Buffer-Overflow-Erkennung, sie können (wenn die zugrundeliegenden Informationen Position/Wert des Cookies sicher versteckt sind) auch Stack-Angriffe vermeiden. Kostet natürlich Performance.
Gruß,
Svenska

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert



