Ja. Abgesehen von den Systemen, in denen Pufferüberläufe zu erfolgreichen Exploits führen, sind vollständige Erklärungen zu Pufferüberläufen immer eine gute Möglichkeit, um zu demonstrieren, wie Sie über Sicherheit denken sollten. Anstatt sich darauf zu konzentrieren, wie die Anwendung ausgeführt werden soll, sollten Sie prüfen, was getan werden kann, um die Anwendung zu entgleisen.
Unabhängig von der Stapelausführung und der Anzahl der installierten schreienden Kanarienvögel ist ein Pufferüberlauf ein Fehler . All diese Sicherheitsfunktionen ändern einfach die Konsequenzen des Fehlers: Anstelle einer Remote-Shell kommt es "nur" zu einem sofortigen Anwendungsabsturz. Sich nicht um Anwendungsabstürze zu kümmern (insbesondere um Abstürze, die remote ausgelöst werden können), ist bestenfalls eine sehr schlampige Programmierung. Nicht auf meiner Uhr!
Der Vollständigkeit halber verhindern nicht ausführbare Stapel und Kanarienvögel keine Pufferüberläufe. Sie haben nur einige der einfachen Möglichkeiten zum Ausnutzen von Pufferüberläufen deaktiviert. Beim herkömmlichen Pufferüberlauf wird die Rücksprungadresse durch einen Zeiger auf schädlichen Code ersetzt, der als Teil der Daten geladen wird, die den Puffer überlaufen haben. Der Schadcode wird ausgeführt, wenn die Funktion zurückgegeben wird. Der nicht ausführbare Stapel bedeutet, dass der Angreifer seinen Code nicht auf dem Stapel platzieren kann (er muss einen Sprung in einen Bibliothekscode veranlassen, z. B. die Implementierung von execve ()
in der Standardbibliothek ). Der Kanarienvogel verhindert, dass die Rücksprungadresse verwendet wird, wenn ein Stapelpuffer übergelaufen ist (vorausgesetzt, der Überlauf ist "einfach": ein zusammenhängender Datenblock). Der Überlauf kann jedoch auch einige andere Daten überschreiben, einschließlich Funktionszeiger (insbesondere im Kontext von C ++).