Auch wenn folgender Angriff schon seit Jahren bekannt ist und daher etwas in Vergessenheit geraten ist, so zeigte ein aktuelles IoT Hardware Assessment in unserem Hause, dass dieser bei aktuellen IoT-Geräten immer noch brandaktuell ist. Die Rede ist von einer Bootloader-Manipulation, um einen gesetzten Login zum Linux-System zu umgehen.
Wie bereits in früheren Blogbeiträgen erwähnt, ist es (leider) bei aktuellen IoT-Geräten immer noch üblich, eine serielle UART-Schnittstelle auf der Platine zu exponieren.
Die im IoT-Bereich stark vertretene UART Schnittstelle kommt vermehrt bei Linux-basierenden Geräten zum Einsatz und exponiert hier oft eine interaktive System Command-Shell sowie den Boot-Prozess (Bootlog). Oft ist aber der System-Zugang durch ein Passwort geschützt.
In unserem Assessment lag speziell der Fall vor, dass ein OS-Level-Zugang über die Schnittstelle durch ein für uns unbekanntes Passwort geschützt war. Während des Boot-Prozesses wurde allerdings die Info exponiert, dass der Boot-Vorgang durch das Drücken einer Taste auf der Tastatur unterbrochen werden kann. Dies stellte uns eine Interaktion mit dem Bootloader (U-Boot) über eine interaktive sog. Bootloader Shell bereit.
Innerhalb der Bootloader Shell können Bootargumente so manipuliert werden, dass das System beim Fortführen des Boot-Vorgangs den sog. Single-User-Mode ausführt. Der Single-User-Mode ist ein Modus, in dem das Betriebssystem in einem einzelnen Superuser bootet. Es wird hauptsächlich für die Wartung von Mehrbenutzersystemen oder zur Wiederherstellung verwendet und stellt ein großes Sicherheitsrisiko dar. Folgend wurden die Bootargumente zum Starten dieses Modus innerhalb der Bootloader Shell angepasst:
# setenv bootargs „${bootargs} reboot=cold,hard emergency init=/bin/sh
Hier wurden die Bootargumente so erweitert, dass das System den Single-User-Mode startet und beim Ausführen des Init-Prozesses (erster Linux-Prozess, der gestartet wird) eine interaktive Shell bereitgestellt wird (/bin/sh).
Am Anschluss war es lediglich nötig, den Bootprozess fortzuführen:
# run bootcmd
Das System führte nun den Boot-Prozess fort und es wurde eine interaktive Root Shell bereitgestellt, welche es erlaubte, mit vollen Schreib- und Leserechten auf das System zuzugreifen.
In unserem Assessment konnten so sämtliche sensiblen Daten wie Passwörter ausgelesen und Malware wie persistente Backdoors eingespielt werden.