Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial Internet of Things >> Eingebettet

Text Strings: Eine verborgene Sicherheitslücke in eingebetteter Software

Seit vielen Jahren ist die Sicherheit von Desktop-Computern ein Thema. Sobald ein Rechner mit dem Internet verbunden ist, besteht grundsätzlich die Möglichkeit für Angriffe – sei es zum Datendiebstahl, zur Systembeschädigung oder zur Manipulation des Betriebs. Schutzmaßnahmen sind bekannt und weit verbreitet. Eingebettete Systeme schienen lange immun gegen solche Probleme, da sie selten vernetzt waren und ihr Code typischerweise in ROM abgelegt war. Doch das hat sich geändert: Ein großer Teil moderner Systeme ist mit dem Internet verbunden, und es ist gängige Praxis, Code in den RAM zu kopieren und dort auszuführen. Damit wird Sicherheit zu einer wichtigen Designüberlegung bei eingebetteter Software.

Safety vs. Security – ein entscheidender Unterschied

Die englische Sprache ist ein hervorragendes Kommunikationswerkzeug – präzise und nuanciert. Im Alltag sind wir jedoch oft nachlässig und verwenden Begriffe ungenau. Ein klassisches Beispiel: Safety und Security werden fast synonym gebraucht, als seien sie austauschbar. Die beste Definition, die ich kenne, lautet: Safety schützt die Welt vor dem Gerät; Security schützt das Gerät vor der Welt. Mein Thema heute ist Security.

Wann Verschlüsselung unverzichtbar ist

Wenn ein System absolut „kugelsicher“ sein muss, ist industrielle Verschlüsselung gefordert. Diese erfordert normalerweise spezielle Hardware-Unterstützung – verfügbar, aber oft Overkill für Anwendungen, die kein solch hohes Schutzniveau benötigen. In solchen Fällen gibt es Alternativen, die ich hier beleuchten möchte.

Wie Angreifer vorgehen

Gelingt es einem Angreifer, auf den Speicherinhalt eines Geräts zuzugreifen, kann er dessen Funktionsweise analysieren – der erste Schritt zur Manipulation. Code lässt sich disassemblieren, wodurch die Logik offengelegt wird. Ohne Verschlüsselung ist dagegen wenig auszurichten. Als Nächstes durchsucht der Angreifer einen Hex/ASCII-Dump der Daten nach verständlichen Mustern und Strukturen. Genau hier können Vorsichtsmaßnahmen greifen: Auch wenn Verschlüsselung keine Option ist, bietet Obfuskation (Verschleierung) eine Möglichkeit.

Ziel der Datenobfuskation

Ziel ist es, den Angreifer zu verzögern oder abzuschrecken, indem Daten weniger wiedererkennbar gemacht werden. Bei der Durchsicht eines Speicherdumps fallen Textstrings besonders leicht auf – daher fokussiere ich mich darauf.

Strings in C/C++ verschleiern

In C/C++ sind Textstrings normalerweise Byte-Sequenzen mit ASCII-Codes, null-terminiert. Das ist leicht zu erkennen. Ich ändere das: Statt des Null-Terminators wird das erste Byte jedes Strings als Längenangabe genutzt. Die Zeichen werden leicht verfremdet – durch Vertauschen der beiden Nibbles jedes Bytes. Ein Hilfsprogramm nimmt Klartext-Strings entgegen und erzeugt die Deklaration eines Arrays mit passender Initialisierung. Hier die Kernfunktion:

void scramble(int index, unsigned char *input) {
    unsigned char *charpointer, character;
    printf("unsigned char string%d[%d] = {0x%02x,", index, strlen(input)+1, strlen(input));
    charpointer = input;
    while(*charpointer) {
        character = *charpointer++;
        character = ((character & 0x0f) << 4) | ((character & 0xf0) >> 4);
        printf("0x%02x", character);
        if (*charpointer) printf(",");
    }
    printf("}; // \"%s\"\n", input);
}

Übergebe ich dieser Funktion Index 4 und den String „Hello world“, lautet die Ausgabe:

unsigned char string4[12] = {0x0b, 0x84, 0x56, 0xc6, 0xc6, 0xf6, 0x02, 0x77, 0xf6, 0x27, 0xc6, 0x46}; // "Hello world"

Diesen Code kopiere ich in mein Programm und schreibe eine Funktion zum Entschlüsseln bei Bedarf. Statt eines Index könnte man auch einen willkürlichen Namen vergeben, indem man den Parameter index durch einen String ersetzt. Der generierte Code ist durch den Kommentar selbst dokumentierend – doch wenn der Angreifer Zugriff auf Ihren Quellcode hat, sind Sie in Schwierigkeiten, bei denen ich nicht mehr helfen kann.

Entschlüsselung zur Laufzeit

Hier Code zum Entschlüsseln:

void main() {
    unsigned char temp, buffer[50];
    int count = string4[0], index = 0;
    while(count--) {
        temp = string4[index+1];
        temp = ((temp & 0x0f) << 4) | ((temp & 0xf0) >> 4);
        buffer[index] = temp;
        index++;
    }
    buffer[index] = 0;
    printf("-%s-\n", buffer);
}

Alternative Verschleierungsmethoden

Das Vertauschen der Nibbles ist nur eine von vielen Möglichkeiten. Eine andere: Jedes Zeichen um drei Bits nach links rotieren:

unsigned char leftrotate3(unsigned char c) {
    c = (c << 3) | (c >> 5);
    return c;
}

Die gezeigten Techniken arbeiten zeichenweise. Man könnte auch den gesamten String als Bitfolge behandeln und beliebig rotieren. Die Implementierung überlasse ich dem enthusiastischen Leser.

Zusatznutzen: Lokalisierung

Ein Nebeneffekt der zentralen Verwaltung aller Textstrings: Die Erstellung verschiedener Sprachversionen der Software wird deutlich einfacher.

Wichtige Einschränkung

Ich muss betonen: Datenobfuskation ist weit entfernt von kugelsicherer Sicherheit und wird einen ernsthaften Angreifer lediglich verlangsamen. Im Extremfall lässt sich der Entschlüsselungscode disassemblieren. Der Trick besteht darin, die Obfuskation zu einer schwer verfolgbaren Spur zu machen. Benötigen Sie echte hohe Sicherheit, müssen Sie vollständige Verschlüsselung einsetzen.

Eingebettet

  1. Das Klavier: Von antiken Wurzeln zur modernen Meisterschaft
  2. Wie Embedded Systems moderne Fahrzeuginnovation antreiben
  3. Embedded Systems: Grundlagen & praxisnahe Anwendungen
  4. 10 essenzielle Features, die jede 3D-Druck-Workflow-Software bieten sollte
  5. SOAFEE: Cloud-native Architektur für softwaredefinierte Automobilplattformen
  6. DevOps nutzen, um Herausforderungen bei Embedded Software zu meistern
  7. Roboter transformieren Ihre Fabrik: Was Sie wissen müssen
  8. Wie Embedded Software Hardware-Lieferketten für mehr Agilität neu formt
  9. Software-Vernetzung: Schlüsselvorteile für die Smart Factory
  10. Wie Facility-Management-Software religiöse Einrichtungen unterstützt