Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial Internet of Things >> Ingebed

Tekststrings: Een verborgen kwetsbaarheid in embedded-software

Al jaren is de beveiliging van desktopcomputers een zorg. Zodra een machine met het internet verbonden is, bestaat er intrinsiek een mogelijkheid voor aanvallen. Dergelijke inbraken kunnen gericht zijn op datastaling, systeemschade of het wijzigen van de werking. Beschermingsmaatregelen zijn bekend en breed toegepast. Embedded-systemen leken altijd immuun voor dergelijke problemen, omdat ze zelden in een netwerk stonden en hun code normaal in ROM zat. Dat is veranderd. Een groot deel van de moderne systemen is met het internet verbonden en het is gangbare praktijk om code naar RAM te kopiëren en daaruit uit te voeren. Dit betekent dat beveiliging nu een belangrijk ontwerpsoverweging is bij embedded-software.

Veiligheid versus beveiliging

De Engelse taal is een uitstekend communicatiemiddel. Het is een zeer expressieve taal die communicatie met grote precisie en nuance mogelijk maakt. In de alledaagse taal zijn we echter lui en gebruiken we woorden vaak niet met 100% nauwkeurigheid. Het voorbeeld dat ik in gedachten heb, is de manier waarop safety en security bijna uitwisselbaar worden gebruikt, alsof ze synoniemen zijn. De beste definitie die ik ooit hoorde, luidt ongeveer als volgt: veiligheid is het proces van de wereld beschermen tegen het apparaat; beveiliging is het apparaat beschermen tegen de wereld. Beveiliging is mijn onderwerp voor vandaag.

Wanneer encryptie overkill is

Als een systeem echt volledig kogelvrij moet zijn, is industriële encryptie vereist. Dit vereist normaal specifieke hardware-ondersteuning, die wel beschikbaar is, maar voor toepassingen waar zulke hoge beveiliging niet nodig is, kan het overkill worden geacht. In dergelijke gevallen zijn er andere opties en die wil ik verkennen.

Hoe een hacker toegang krijgt

Als een hacker toegang krijgt tot de geheugengegevens van een apparaat, kan hij beginnen te begrijpen wat het doet en hoe. Dat is de eerste stap om de werking te veranderen. Code kan gedisassembleerd worden, waardoor de logica onthuld wordt. Zonder encryptie is er weinig te doen om dit te voorkomen. De volgende stap die de hacker kan nemen, is een hex/ASCII-dump van de data bekijken om te zien wat er zinvol is. Ze zoeken naar patronen en herkenbare structuren. Hier kunnen voorzorgsmaatregelen genomen worden. Hoewel encryptie geen optie mag zijn, is obfuscatie (verstoring) wel een mogelijkheid.

Doel van data-obfuscatie

Het doel van data-obfuscatie is de hacker te vertragen of af te schrikken door de data minder herkenbaar te maken. Bij het scannen van een memory dump zijn tekststrings een van de makkelijkste dingen om te ontdekken. Daarom richt ik me hierop.

Tekststrings in C/C++

In C/C++-code zijn tekststrings normaal gewoon reeksen bytes met ASCII-codes, afgesloten door een null-byte. Dat is heel gemakkelijk te herkennen, dus ik verander het. In plaats van de null-terminator wordt de eerste byte van elke string een lengte-indicator. De karakters van de string krijgen hun data iets gewijzigd, om ze minder herkenbaar te maken – alles wat ik doe is de twee nibbles van elke byte omwisselen. Ik heb een hulpprogramma nodig waarin ik de platte tekststrings invoer en dat de declaratie voor een array met de juiste initialisatie genereert. Hier is de kernfunctie van dat hulpprogramma:

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);
}

Als ik deze functie een index van 4 en de string "Hello world" (oorspronkelijk, hé?) doorgeef, is de output:

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

Ik kan dit in mijn code kopiëren en plakken, en dan hoef ik alleen een functie te schrijven om de tekst te de-obfusceren wanneer ik het wil tonen. In plaats van elk een indexnummer te geven, kan ik het een willekeurige naam geven door de parameter index te vervangen door een string. Let op dat de gegenereerde code enigszins zelf-documenterend is, omdat de commentaar de string in leesbare vorm toont, maar dit verschijnt natuurlijk alleen in de broncode. Als de hacker toegang heeft tot uw broncode, zit u in zoveel problemen dat ik niet meer kan helpen!

De-obfuscatie code

Hier is code om het de-obfuscatieproces te illustreren:

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);
}

Het omwisselen van nibbles in elke byte is een van de vele manieren waarop de scrambling gedaan kan worden. Een andere mogelijkheid is bijvoorbeeld elk teken drie bits naar links te roteren. Hier is code die dat doet:

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

De obfuscatiemethoden die ik heb uiteengezet, scramblen de string op karakterbasis. Het is ook mogelijk dingen met de hele string te doen. Bijvoorbeeld: behandel de string als een lange reeks bits en roteer het een willekeurig aantal posities naar links. Ik laat de codering van dit algoritme aan de meer enthousiaste lezer over.

Het is de moeite waard op te merken dat een neveneffect van het lokaliseren van alle tekststrings is dat het maken van verschillende softwareversies voor andere talen heel eenvoudig wordt.

Ik moet herhalen en benadrukken dat data-obfuscatie ver is van kogelvrij en een ernstige hacker op het hoogste niveau alleen kan vertragen. Als niets anders, kan de de-obfuscatiecode gedisassembleerd worden. De truc met deze techniek is om de obfuscatie een lastig te volgen spoor te maken. Als u echt meer beveiliging nodig heeft, moet u kijken naar volledige encryptie.

Ingebed

  1. De Piano: Van Oude Wortels tot Moderne Meesterwerk
  2. 10 Essentiële Functies Die Elke 3D-Print Workflow Software Moet Bieden
  3. Hoe 3D-printen en Software Digitale Transformatie in Productie Drijven
  4. Robots Transformeren Je Fabriek: Wat Je Moet Weten
  5. Ingesloten Software Herbouwt Hardware Toeleveringsketten voor Grotere Agiliteit
  6. Software-interconnectie: sleutelvoordelen voor slimme fabrieken
  7. Hoe faciliteitsbeheersoftware godsdienstige instellingen versterkt
  8. Hoe Embedded Systemen Moderne Voertuiginnovatie Drijven
  9. Embedded Systemen: Fundamenten en Praktische Toepassingen
  10. SOAFEE: Een cloud-native architectuur die software-gedefinieerde automotive-platforms empowert
  11. DevOps Inzetten om Uitdagingen in Embedded Software te Overwinnen