Viktige punkter
- Det Hvite Hus oppmuntrer til bruk av minnesikre språk som Rust for å minimere sikkerhetsproblemer i kode.
- Eldre, lavnivåspråk som C representerer en risiko for feilaktig kode, noe som kan føre til sikkerhetsbrudd.
- Minnesikre språk, som Rust, tilbyr automatisk minnehåndtering og funksjoner for å forhindre feil.
En amerikansk myndighet har anbefalt at utviklere bør prioritere minnesikre språk som Rust og Java. Men hvorfor er disse bedre og hva betyr det egentlig?
Hva sier Det Hvite Hus?
Den 26. februar uttalte Det Hvite Hus gjennom sitt kontor, National Cyber Director (ONCD), at programvareutviklere burde ta i bruk minnesikre programmeringsspråk, som for eksempel Rust.
Som nasjon har vi både evnen og ansvaret til å redusere angrepsflaten i cyberspace, og forhindre at hele grupper av sikkerhetsfeil kommer inn i det digitale økosystemet. Dette krever at vi adresserer det komplekse spørsmålet om overgang til minnesikre programmeringsspråk.
Hvorfor er dette viktig?
ONCD, som ble etablert i 2021, rapporterer direkte til presidenten og gir råd om cybersikkerhet og relaterte saker. USAs politiske beslutninger har ofte en innvirkning på hele teknologisektoren.
Mange av de alvorligste sikkerhetssårbarhetene har sin opprinnelse i minnehåndteringsproblemer. Eldre lavnivåspråk gir utviklere stor kontroll, men øker også risikoen for at feil i koden kan få alvorlige konsekvenser.
Bruken av minnesikre språk som Rust, Python og JavaScript har lenge vært økende. ONCD kommer sannsynligvis med denne kunngjøringen fordi mindre sikre språk som C har vært i bruk så lenge at deres gamle kode nå er dypt forankret i infrastrukturen og mye av programvaren vi bruker daglig.
Hvordan ser et usikkert språk ut?
Usikker kode ser ikke alltid truende eller komplisert ut. Ta for eksempel dette enkle C-programmet:
#include <stdio.h> int main (void) { int arr[3] = { 0, 0, 0 }; printf("%d\n", arr[3]); return 0; }
Dette er et typisk eksempel på en feil som kan føre til et bufferoverløpsangrep. Utvikleren har glemt at arrays i C (og de fleste andre språk) er nullindekserte, som betyr at det første elementet er arr[0], og så videre. Forsøket på å få tilgang til arr[3] er en feil, men en som C vil tillate:
Verdien ved arr[3] er en gyldig minneadresse, akkurat som alle andre, men den tilhører ikke arrayet. Enhver verdi kan lagres der, og konsekvensene av å få tilgang til eller skrive til den kan variere fra et programkrasj til en alvorlig sikkerhetshendelse. Mange hackere har utnyttet slike feil historisk sett.
Selv om C-kompilatoren genererer en advarsel, produserer den også en kjørbar fil. En utvikler står fritt til å ignorere advarsler, og til og med skjule dem ved hjelp av kompilatorflagg. C vil fremdeles tillate at du «skyter deg selv i foten», mens språk som Rust ikke vil tilby deg et våpen i det hele tatt.
Hvordan ser minnesikker kode ut?
I et minnesikkert språk som Rust eksisterer ikke det samme problemet. Her er det samme programmet, skrevet i Rust:
fn main() { let arr: [u32; 5] = [0;3]; println!("{}", arr[3]); }
Selv om denne koden er syntaktisk gyldig, vil Rust nekte å kompilere den:
Kompilatoren forklarer problemet og nekter å generere en kjørbar fil. Rust lar deg rett og slett ikke kjøre denne koden.
Rust har mange flere sikkerhetsfunksjoner i tillegg til dette. Den inkluderer for eksempel smarte pekere for å håndtere minne automatisk og forhindre null-peker-dereferencing.
Bør jeg bytte språk?
Hvert programmeringsspråk har et spesifikt formål, så du bør være forsiktig med råd om å unngå enkelte språk fullstendig, selv om det kommer fra presidenten. Selv om du kanskje velger å spesialisere deg på ett bestemt språk, er det alltid nyttig å lære flere for å utvide dine muligheter.
Minnesikkerhet er en funksjon i mange moderne språk, så det kan være lurt å være kjent med minst ett av dem. C har sine bruksområder, men det finnes sikrere alternativer som kan forhindre uhell. Spesielt hvis du ser etter et effektivt språk med gode sikkerhetsmekanismer, er Rust et must.