Das Ausnutzen von Stapelpufferüberläufen auf einem Arduino


Antworten:


8

Ihre Frage kann auf zwei Arten gelesen werden: DarkCoffee:

Wenn ein bestimmtes Arduino-basiertes Gerät dazu gebracht werden kann, seinen Stapel zu überlaufen, kann es dann ausgenutzt werden?

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.

Gibt es Stapelüberlaufangriffe auf Arduinos im Allgemeinen?

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.


Vielen Dank. Ich habe das INRIA-Angriffspapier gelesen und versuche, dasselbe mit der Arduino-Sprache auf atmega2560 zu tun, aber ich kann die Absenderadresse mit dem avr atmega2560 nicht erreichen. Ich verstehe nicht, wo meine Fehler sind.
DarkCoffee

1
@DarkCoffee: Für diesen Angriff muss unterhalb der C ++ - Ebene gegraben werden. Sie müssen die Firmware zerlegen und den AVR- Assemblersprachencode studieren , um festzustellen, welche Funktionsschwänze nützliche Nebenwirkungen haben. Um jeden einzelnen aufzurufen, müssen Sie eine rohe JMP-Anweisung ausführen . Wenn Sie dann weitere Fragen haben, wenden Sie sich am besten an Stack Overflow.
Warren Young

Ich danke dir sehr. Im Moment versuche ich, eine Sicherheitslücke mit dem Pufferüberlauf zu erstellen. Ich werde über Stack Overflow schreiben. Vielen Dank!
DarkCoffee

5

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.


-1: Harvard-Architektur ist kein perfekter Schutz, wie ich in meiner Antwort hervorhole. Außerdem ist es wahrscheinlich nicht möglich , den festverdrahteten TCP-Stack auf dem WizNet- Chip eines Arduino-Ethernet- Shields anzugreifen. Zumindest ist es unwahrscheinlich, dass der separate CPU-Chip davon betroffen ist.
Warren Young

2

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.


1

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 ...


1
Wenn Sie einen Debugger anschließen, handelt es sich nicht um einen Remote-Exploit: Sie haben physischen Zugriff.
Kaz

2
Exploit bedeutet nicht, das höchste Privileg zu erlangen, sondern lediglich einen Computer dazu zu bringen, nicht autorisierten Code im Namen des Angreifers auszuführen. Exploits müssen niemals einen nicht privilegierten Sicherheitskontext (z. B. den einer Benutzeranwendung auf einem PC) verlassen, um echten Schaden zu verursachen.
Kaz

2
Die Codeausführung ist ein Exploit - ob ein Berechtigungsmodell vorhanden ist oder nicht.
Chris Stratton

0

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.


Hier gibt es einen nützlichen Punkt, aber es ist keine reine Harvard-Architektur. Wenn der Arduino-Bootloader vorhanden ist und Sie ihn auf der seriellen Seite anzeigen können (indem Sie einen Reset verursachen), können Sie alles flashen, was Sie wollen.
Chris Stratton

-1: Entschuldigung, aber Sie verbreiten hier Mythen. AVRs wurden ausgenutzt, und die Harvard-Architektur verhindert im Allgemeinen nicht, dass Stack-Smashing-Angriffe beliebigen Code ausführen. Siehe meine Antwort für Details.
Warren Young

-1

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.


1
Was könntest du damit machen? Angenommen, die eingebettete Karte steuert ein schlüsselloses Zugangssystem. Wenn die Software einen Fehler aufweist, können Sie unbefugten Zugriff erhalten.
Kaz

2
-1: Es gibt viele Dinge in Embedded - Systemen zu nutzen, gibt es viele Angriffe auf sie, und eingebettete Systeme zunehmend verbunden werden. Erst letzte Woche gab es einen gut gemeldeten Fernangriff gegen intelligente Toiletten .
Warren Young

Ja, ich hätte es besser formulieren können. Aber ich habe im Grunde gesagt, dass eine generische Sicherheitslücke für ein bestimmtes Gerät (Arduino) Ihnen nicht unbedingt etwas bringt. Ja, Sie können ein schlüsselloses Zugangssystem oder eine Toilette nutzen, aber die Ansätze wären immens anders, und ein generischer "Pufferüberlauf für Ardunio" würde nicht zutreffen. Ich habe versucht, den Fragesteller dazu zu bringen, die Frage anders anzugehen, nach einem Grund dafür zu suchen und diesen auszunutzen, anstatt zu versuchen, einen Weg zu finden, "alle Dinge" mit einem Prozess anzugreifen.
Kris Bahnsen

Natürlich kauft Ihnen der Angriff etwas: die vollständige Verwaltung des angegriffenen Systems. Was wolltest du mehr? :)
Warren Young

@ WarrenYoung Schnell! Greifen Sie meinen 3D-Drucker-Controller über die USB-serielle Verbindung über meinen mit dem Internet verbundenen PC an und drucken Sie damit phallische Objekte! Haha
Kris Bahnsen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.