Ist es möglich, Stapelpufferüberläufe auf einer Arduino-Karte auszunutzen?
Ist es möglich, Stapelpufferüberläufe auf einer Arduino-Karte auszunutzen?
Antworten:
Ihre Frage kann auf zwei Arten gelesen werden: DarkCoffee:
Ja, es ist möglich, einen Stapelüberlauf auf einem Arduino auszunutzen.
Ein möglicher Angriff ist die return-orientierte Programmiermethode , die eine ausreichend komplexe Firmware erfordert. Eine Verteidigung besteht darin, Ihre Firmware so einfach wie möglich zu halten. Es ist höchst unwahrscheinlich, dass die Arduino-Skizze "Hallo Welt" anfällig ist. Das sollte Ihnen jedoch nicht viel Trost sein, da ein LED-Blinker nicht besonders nützlich ist . Nützliche Firmware hat mehr Funktionen und daher mehr Funktionsschwänze, die für die Verwendung in einer abstrakten Maschine geerntet werden müssen.
Das Arduino verfügt auch über einen Bootloader, der von Natur aus die Möglichkeit hat, Firmware zu überschreiben. Es kann möglich sein, es auszunutzen, um vorhandene gutartige, aber anfällige Firmware mit bösartiger Firmware zu überschreiben.
Das Lesen der ersten Seite des INRIA-Angriffspapiers lässt mich glauben, dass beide Ansätze kombiniert werden: Rückgabeorientierte Programmierung, um genügend Code auszuführen, um die Selbstblitzfähigkeit des Mikrocontrollers zu aktivieren, sodass beliebiger Code dauerhaft geladen werden kann.
Mir ist kein Angriff bekannt, der auf allen Arduino-basierten Geräten funktioniert. Auch hier ist die LED-Blinkerskizze "Hallo Welt" wahrscheinlich unverwundbar, einfach weil sie zu trivial ist, um verwundbar zu sein.
Je mehr Code Sie schreiben, desto wahrscheinlicher ist es, dass Sie eine Sicherheitsanfälligkeit erstellen.
Beachten Sie, dass das Schreiben von 5.000 Codezeilen und das Ersetzen von 2 kLOC durch 1.000 neue Zeilen aus Sicherheitsgründen keine Nettoeinsparung von 1 kLOC darstellt. Wenn diese 5 kLOC sicher waren und Sie beim Schreiben einiger der neuen 1 kLOC Fehler gemacht haben, ist dies immer noch eine Sicherheitslücke. Die Moral der Geschichte ist, dass der sicherste Code derjenige ist, der am längsten angestarrt wird, und das bedeutet, ihn so lange wie möglich unverändert zu lassen.
Natürlich sollte jede Sicherheitsanfälligkeit so schnell wie möglich gepatcht werden. Dies ist kein Argument dafür, alte Schwachstellen beizubehalten. Es ist ein Argument gegen das gedankenlose Hinzufügen von Funktionen zu Code, den Sie durch Inspektion, Prüfung und Analyse für sicher halten.
Das Wichtigste ist, dass wir diese Frage nicht mit "Nein" mit nahezu absoluter Sicherheit beantworten können, es sei denn, wir überprüfen ein bestimmtes Arduino-System formell, wie es eingesetzt wird, Anweisung für Anweisung und selbst dann.
Arduinos verfügen über optionale Ethernet-Schnittstellen und andere Formen der Remote-Kommunikation, sodass Remote-Exploits im Konzept möglich sind. Es gibt einen TCP-Stack für das Internetworking, und selbst wenn er klein und einfach ist, kann er Fehler aufweisen.
Aber sind insbesondere Stapelpufferüberläufe möglich? Beachten Sie, dass die Atmel AVR-Prozessoren über eine Harvard-Architektur verfügen. Dies bedeutet, dass sich Code und Daten in separaten Speicherbereichen befinden . Dies schließt Exploits aus, bei denen Code in den Stapel eingefügt und anschließend ausgeführt wird. Eine Adresse, die von einem Angriffsvektor in den Stapel gelegt wird, wird so interpretiert, dass sie sich im Codebereich befindet, während sich die verbleibenden Angriffsvektorbytes, die die schädliche Nutzlast enthalten, im Datenbereich befinden.
Wenn Sie sich ansehen, was normalerweise in x86-Systemen ausgenutzt wird, dh Heap-Überläufe, Stapelüberläufe, seh-Überschreibungen, Formatierungszeichenfolgen usw., gibt es keine so große Angriffsfläche. Mit der möglichen Ausnahme von Formatzeichenfolgen sehe ich keinen dieser Angriffe, da die Architektur dies einfach nicht zulässt.
Wenn Sie an dieser Art von Forschung interessiert sind, würde ich empfehlen, sich mit Takt- und Spannungsstörungen zu befassen. Dies ermöglicht häufig das Extrahieren von Informationen von Geräten, selbst wenn diese gesperrt sind, und das generelle Abhören mit ihnen. Sie können auch eine Differenzleistungsanalyse durchführen, wenn Sie mit den Statistiken vertraut sind. Schließlich sind Timing-Angriffe wahrscheinlich am einfachsten auszunutzen, wenn Sie nach etwas suchen, mit dem Sie beginnen können.
Auf der Hardware-Seite gibt es ein Programm namens Degate, mit dem Chips auf Siliziumebene umgekehrt werden können. Es gab ein paar anständige Konferenzgespräche zu diesem Thema, und Sie werden diese wahrscheinlich lieben.
Es gibt nicht wirklich etwas zu auf einem Embedded - Prozessor wie die ATmega (verwendet für Arduino) ausnutzen , da es nur eine Ausführungsebene (Vollzugriff) und keine fancy stuff wie Intel / AMD CPU Ringschutz (Benutzercode vom Kernel - Code zu halten in Hardware).
Wenn Sie einen Debugger anschließen, erhalten Sie vollen Zugriff auf RAM und Flash, sodass Sie nichts ausnutzen müssen, wirklich ...
Puffer-Exploits mit der Absicht, über Code-Incection zu steuern, funktionieren nur gegen Princeton Architecture, da Datenspeicher und Programmspeicher denselben Speicher verwenden.
Jetzt hat unser mutiger kleiner Atmel eine Harvard-Architektur - sie führt Code aus einem anderen Speicher als Daten aus. Und unser geschickt ausgenutzter Pufferüberlauf kann nur in SRAM schreiben, was nicht ausgeführt werden kann.
Es kann jedoch zum Absturz des Arduino kommen, wenn Sie die Möglichkeit haben, Daten in den Puffer zu übertragen.
Wie Madmanguruman betonte, gibt es auf einem eingebetteten Prozessor in gewisser Weise nichts, was man ausnutzen könnte. Die eigentliche Frage ist, WARUM Sie ein eingebettetes Gerät ausnutzen möchten. Wenn Sie ein eigenständiges Ardunio hätten und etwas ausnutzen könnten, was könnten Sie damit machen?
In modernen PCs erhalten Sie durch das Ausnutzen einer Sicherheitsanfälligkeit meistens Remote-Root-Zugriff, was so ziemlich das ultimative Ziel ist. Ein eingebettetes System verfügt jedoch normalerweise nicht über Dateien, Informationen oder ähnliches, obwohl es Ausnahmen gibt.
Wenn Sie ein eingebettetes System ausnutzen möchten, ist dies normalerweise für einen bestimmten Zweck vorgesehen. Darüber hinaus wird der Exploit fast jedes Mal einzigartig sein. Darüber hinaus werden die meisten eingebetteten Geräte nicht verbunden. Das heißt, Sie benötigen physischen Zugriff auf sie, um etwas zu tun. Und sobald Sie physischen Zugang haben, halten Sie alle Karten und alles kann getan werden. Dies ist einer der seltenen Aspekte des Engineerings, der tatsächlich versucht, eine Lösung für ein Problem zu finden, nicht umgekehrt.