Vita huset vill ha minnessäker programmering, men vad är det?

By rik

Viktiga punkter

  • USA:s regering förespråkar användningen av minnessäkra språk som Rust för att minska säkerhetsproblem i programkod.
  • Äldre, lågnivåspråk som C har risk för felaktig kod vilket kan leda till säkerhetsincidenter.
  • Minnessäkra alternativ som Rust erbjuder automatiserad minneshantering och felundvikande funktioner.

En myndighet i USA har utfärdat en rekommendation att programmerare bör prioritera minnessäkra språk som Rust och Java. Men vad gör dem mer attraktiva och varför är det av vikt?

Vad kommunicerar Vita huset?

Den 26 februari uppmanade Vita husets kontor för National Cyber ​​Director (ONCD) utvecklare att använda minnessäkra programmeringsspråk, med Rust som ett framträdande exempel.

Enligt ONCD:

Vi har som nation både möjligheten och skyldigheten att minska sårbarheterna inom cybersäkerhet och förhindra att hela kategorier av säkerhetsfel hamnar i det digitala landskapet. Detta kräver en övergång till minnessäkra programmeringsspråk.

Varför är detta viktigt?

ONCD, som etablerades 2021, rapporterar direkt till presidenten och ger råd i frågor som rör cybersäkerhet. USA:s ställningstagande har potential att influera teknologivärlden globalt.

Många betydande säkerhetsincidenter har sin grund i problem med minneshantering. Äldre lågnivåspråk ger utvecklare stor kontroll, men ökar samtidigt risken för att kodfel får allvarliga konsekvenser.

Användningen av minnessäkra språk – som Rust, Python och JavaScript – har dock ökat över tid. ONCD:s uttalande motiveras sannolikt av att äldre språk som C har funnits så pass länge att deras kod är en integrerad del av den infrastruktur och programvara vi använder dagligen.

Hur ser ett osäkert språk ut?

Osäker kod behöver inte vara komplex eller skrämmande vid första anblicken. Här är ett simpelt exempel i C:

#include <stdio.h>
int main (void) {
    int arr[3] = { 0, 0, 0 };
    printf("%d\n", arr[3]);
    return 0;
}

Detta är ett klassiskt exempel på en bugg som kan leda till en buffer overflow-attack. Utvecklaren har ignorerat det faktum att arrayer i C (och många andra språk) är nollindexerade, vilket innebär att det första elementet finns vid arr[0] och så vidare. Försöket att komma åt arr[3] är därmed ett misstag, som dock C tillåter:

Värdet vid arr[3] refererar till en legitim minnesadress, men som inte tillhör arrayen. Denna adress kan ha lagrat vilket värde som helst och konsekvenserna av att försöka komma åt eller skriva till det kan variera från en programkrasch till en allvarlig säkerhetsincident. Många hackare har historiskt exploaterat liknande buggar.

Trots att C-kompilatorn varnar för felet, kompilerar den fortfarande koden till en körbar fil. Utvecklaren har friheten att bortse från varningar eller till och med dölja dem med kompilatorflaggor. C tillåter att man ”skjuter sig själv i foten”, medan språk som Rust helt saknar den möjligheten.

Hur ser minnessäker kod ut?

I ett minnessäkert språk som Rust är den typen av problem helt enkelt omöjliga. Samma program i Rust ser ut så här:

fn main() {
    let arr: [u32; 5] = [0;3];
    println!("{}", arr[3]);
}

Även om koden är syntaktiskt korrekt, kommer Rust inte att kompilera den:

Kompilatorn påtalar problemet och genererar ingen körbar fil. Rust hindrar dig effektivt från att köra koden.

Rust erbjuder många andra skyddande funktioner, som smarta pekare för att automatiskt hantera minne och undvika problem med null-pointers.

Bör jag byta språk?

Varje programmeringsspråk har sitt syfte, så man bör inte kategoriskt undvika något, även om rådet kommer från högt uppsatt håll. Även om man kan välja att specialisera sig på ett språk, är det värdefullt att ha kunskap om många för att ha fler alternativ.

Minnessäkerhet är en funktion hos många moderna språk, så det är bra att vara bekant med åtminstone ett. C har sina användningsområden, men säkrare alternativ finns som reducerar riskerna för fel. Om du letar efter ett effektivt språk med goda skyddsmekanismer är Rust ett utmärkt val.