Was sind die Ideen zur Verhinderung von Pufferüberlauf-Angriffen? und ich habe von Stackguard gehört, aber bis jetzt ist dieses Problem vollständig gelöst, indem man Stackguard oder eine Kombination mit anderen Techniken anwendet?
nach dem Aufwärmen, als erfahrener Programmierer
Warum glauben Sie, dass es so ist? schwer zu liefern angemessen Abwehrmechanismen für Pufferüberlauf-Angriffe?
Bearbeiten: Danke für alle Antworten und Sicherheits-Tag aktiv halten:)
Es gibt eine Menge Dinge, die Sie tun können. In keiner bestimmten Reihenfolge ...
Erstens, wenn Ihre Sprachauswahl gleichmäßig aufgeteilt (oder nahezu gleich verteilt) ist zwischen einer, die direkten Speicherzugriff erlaubt und einer, die dies nicht tut, wählen Sie diejenige, die dies nicht erlaubt. Verwenden Sie Perl, Python, Lisp, Java usw. über C / C ++. Dies ist nicht immer eine Option, aber es verhindert, dass Sie sich in den Fuß schießen.
Zweitens, in Sprachen, in denen Sie direkten Speicherzugriff haben, wenn Klassen verfügbar sind, die den Speicher für Sie behandeln, wie std :: string, verwenden Sie sie. Bevorzugen Sie gut trainierte Klassen für Klassen mit weniger Benutzern. Mehr Verwendung bedeutet, dass einfachere Probleme häufiger bei der normalen Verwendung entdeckt wurden.
Drittens, verwenden Sie Compiler-Optionen wie ASLR und DEP. Verwenden Sie alle sicherheitsrelevanten Compileroptionen, die Ihre Anwendung bietet. Dies verhindert zwar keine Pufferüberläufe, hilft aber, die Auswirkungen von Überläufen zu verringern.
Viertens: Verwenden Sie statische Codeanalyse-Tools wie Fortify, Qualys oder den Veracode-Dienst, um Überläufe zu entdecken, die Sie nicht programmieren wollten. Dann repariere das Zeug, das entdeckt wurde.
Fünftens, lernen Sie, wie Überläufe funktionieren und wie Sie sie im Code erkennen. All deine Mitarbeiter sollten das auch lernen. Erstellen Sie eine organisationsweite Richtlinie, die erfordert, dass Benutzer darin geschult werden, wie Überschreitungen (und andere Fehler) funktionieren.
Sechstens, sichere Code-Reviews getrennt von regulären Code-Reviews. Regelmäßige Code-Reviews stellen sicher, dass Code funktioniert, dass er Funktionstests besteht und dass er Codierungsrichtlinien (Einrückungen, Namenskonventionen usw.) erfüllt. Sichere Codeüberprüfungen dienen speziell, explizit und nur dazu, nach Sicherheitsproblemen zu suchen. Sichern Sie Code-Überprüfungen auf allen Code, die Sie können. Wenn Sie Prioritäten setzen müssen, beginnen Sie mit unternehmenskritischem Zeug, Dingen, bei denen Probleme wahrscheinlich sind (wo Vertrauensgrenzen überschritten werden (lernen Sie Datenflussdiagramme und Bedrohungsmodelle kennen und erstellen Sie diese), verwenden Sie Dolmetscher und insbesondere, wo Benutzereingaben weitergegeben werden / gespeichert / abgerufen, einschließlich der aus Ihrer Datenbank abgerufenen Daten).
Siebtens, wenn Sie das Geld haben, mieten Sie einen guten Berater wie Neohapsis, VSR, Matasano, etc., um Ihr Produkt zu überprüfen. Sie werden weit mehr als Überschreitungen finden, und Ihr Produkt wird dafür umso besser sein.
Achten Sie darauf, dass Ihr QA-Team weiß, wie Überschreitungen funktionieren und wie sie getestet werden. QA sollte über Testfälle verfügen, die speziell dafür konzipiert wurden, Überschreitungen aller Eingaben zu finden.
Neuntens, fuzzing. Fuzzing findet in vielen Produkten eine erstaunlich große Anzahl von Überläufen.
Bearbeitet um hinzuzufügen: Ich habe die Frage falsch gelesen. Der Titel sagt: "Was sind die Techniken", aber der Text sagt "warum ist es schwer".
Es ist schwer, weil es so leicht ist, einen Fehler zu machen. Kleine Fehler, wie zB einzelne Fehler oder numerische Konvertierungen, können zu Überläufen führen. Programme sind komplexe Beasts mit komplexen Interaktionen. Wo Komplexität ist, gibt es Probleme.
Oder, um die Frage auf Sie zurückzuwerfen: Warum ist es so schwer, fehlerfreien Code zu schreiben?
Es gibt kein Wundermittel für die Sicherheit: Sie müssen sorgfältig planen, sorgfältig programmieren, Code-Überprüfungen durchführen, testen und dafür sorgen, dass Schwachstellen behoben werden, sobald sie auftreten.
Glücklicherweise ist der spezielle Fall von Pufferüberläufen lange Zeit ein gelöstes Problem . Die meisten Programmiersprachen haben array bounds checking und erlauben es Programmen nicht, Zeiger zu erstellen. Verwenden Sie nicht die wenigen, die Pufferüberläufe zulassen, wie C und C ++.
Dies gilt natürlich für den gesamten Software-Stack, von eingebetteter Firmware bis zu Ihrer Anwendung .
¹ Für diejenigen unter Ihnen, die nicht mit den beteiligten Technologien vertraut sind, kann dieser Exploit es einem Angreifer im Netzwerk ermöglichen, aufzuwachen und die Kontrolle über einen ausgeschalteten Computer zu übernehmen. (Typische Firewall-Konfigurationen blockieren die fehlerhaften Pakete.)
Sie können Analysatoren ausführen, um Probleme zu finden, bevor der Code in Produktion geht. Unsere Memory Safety Checker finden Pufferüberläufe, fehlerhafte Zeigerfehler, Arrayzugriffsfehler und Speicherverwaltungsfehler in C-Code, durch instrumentieren Sie Ihren Code, um im Moment der Entstehung auf Fehler zu achten. Wenn das C-Programm für solche Fehler anfällig sein soll, können Sie einfach die Ergebnisse des Memory Safety-Analyzers als Produktionsversion Ihres Codes verwenden.
In der modernen Ausbeutung sind die großen drei:
Moderne Builds von GCC gelten kanarisch standardmäßig. Nicht alle ASLR sind gleichermaßen erstellt, Windows 7, Linux und * BSD haben einige der besten ASLR. OSX hat bei weitem die schlechteste ASLR-Implementierung, deren Umgehung trivial ist. Einige der am weitesten fortgeschrittene Pufferüberlauf-Angriffe verwenden exotische Methoden, um ASLR zu umgehen. Das NX-Bit ist bei weitem die einfachste Methode, um byapss, Return-to-libc-Angriffe machen es ein Problem für Exploit-Entwickler.
Tags und Links security programming-languages buffer-overflow