utvikling
Microsoft: På tide å putte gamle, men populære programmeringsspråk i søppelbøtten
Rust kan løse minneproblemer i C og C++, mener programvaregiganten.
Microsoft Security Response Centre (MSRC) har undersøkt hver eneste sårbarhet i Microsofts programmer siden 2004.
Konklusjonen er klar: Langt de fleste feil handler, som man nok ville forvente, om usikker håndtering av minne i programmene.
Men hva hvis man helt kunne slippe denne typen feil?
Det spørsmålet stiller Gavin Thomas, som er ledende sikkerhetssjef i MSRC, i et blogginnlegg.
Størstedelen av sårbarhetene som rettes og får tildelt et såkalt CVE-sårbarhetsnummer, skyldes at programmererne uforvarende kommer til å legge inn feil i håndteringen av minne i kode skrevet i C og C++.
Når Microsoft øker sin kodebase og benytter mer open source-programvare i sin kode, blir problemet ikke bedre – men verre. Andre produsenter som også jobber med C og C++ opplever det samme.
Det finnes minnesikre språk som C# og Java, men C og C++ kan noen triks som de sikre språk ikke kan tilby i helt samme omfang.
C++ har nemlig ting ved seg som gjør det attraktivt og i visse tilfeller uunngåelig.
Språket er forrykende hurtig, det kan kjøre med begrenset minne- og diskforbruk, det er et modent språk, har forutsigbar kjøring og dets plattformuavhengighet er nesten uten sidestykke. Det krever heller ikke nødvendigvis installasjon av andre biblioteker eller komponenter.
En ideell løsning er etter Gavin Thomas' mening et språk som kombinerer de sikkerhetsgarantier som et .Net-språk som C# gir, med den effektivitet som C++ kan by på.
Ett av de mest lovende nyere systemspråk som oppfyller disse kravene, er Rust. Dette er et programmeringsspråk opprinnelig oppfunnet av Mozilla, for å skape en raskere og mer stabil Firefox-nettleser.
Sikker minnehåndtering med eierskap til variable
Rust har en ambisjon om å være en slags sikker C ved hjelp av bestemte språkkonstruksjoner.
I Rust er det eierskap på verdier. Man kan tenke på det som at man eier eller låner ut verdier. Når man kaller en funksjon med parametre, overfører man eierskapet på en datastruktur. Etter funksjonskallet kan datastrukturen ikke lenger brukes av kallet, for eierskapet er borte. Det er kompilatorens såkalte «borrow checker» – låne-sjekker – som passer på at reglene overholdes.
En måte å tenke på dette på er som at man sender eierskapet til verdier rundt, og det er veldig annerledes enn i de fleste andre språk, hvor man kan gjøre hva man har lyst til – så lenge variabelen er innenfor samme «scope».
En annen operasjon i Rust er det å «låne» en verdi. I stedet for å overføre eierskap til en funksjon, kan programmereren overføre en referanse som kan være kun les eller les og skriv (immutable og mutable). Hvis referansen kun kan leses, kan kallet likevel få lov til å lese. Og når funksjonen er ferdig med sitt arbeid, har kallet igjen full kontroll over verdien.
Det hele betyr at inne kan frigis automatisk uten problemer, når en variabel faller ut av scope, altså når programkjøringen når den siste klammeparentesen i en kodeblokk. Det betyr også at samtidige tråder ikke uforvarende kommer til å endre variabelens verdi, med uforutsigbar programoppførsel som resultat.
Det er dette som gjør koden sikrere og mer stabil, samt enklere å feilsøke.
Moderne C++ har en mulighet som tilsvarer Rusts eierskap, med navnet «smart pointers», men til forskjell fra Rust er det veldig lett å slippe å bruke den. I Rust skal det stå «unsafe» i koden før man kan unngå de strenge reglene.
Det betyr også at en enkel datastruktur som en «linked list» ikke kan lages i Rust uten «unsafe», da sirkulære referanser er forbudt av låne-sjekkeren.
Masse verktøy, men problemet er et annet sted
Det finnes massevis av verktøy som kan hjelpe utviklere med å skrive sikker kode. Det dreier seg om statiske analyseverktøy som kan være komplekse og vanskelige å lære å bruke, samt såkalte «fuzzing»-teknikker som gir store mengder program-krasjer som deretter skal analyseres.
Det finnes også mange veiledninger og retningslinjer som skal veilede utviklerne. Men det er kanskje en bedre måte å komme frem til sikrere programmer på, mener Gavin Thomas.
Kjernen i en utviklers arbeid er ikke å bekymre seg for sikkerhet, men å skrive kode som fører til ny funksjonalitet i et program. Her kan et sikkert språk som Rust brukes til noe. Det er ett av de mest lovende nye språk til systemprogrammering, lyder vurderingen:
– Kanskje er det på tide å kaste ut de usikre, gamle språkene og gå over til et moderne og mer sikkert systemprogrammeringsspråk? avslutter Gavin Thomas, og lover at sikkerhetsbloggen i fremtiden vil kikke mer på den rolle Rust kan spille i Microsofts verden.
Artikkelen er levert av vår samarbeidspartner Version2.dk, en del av Teknologiens Mediehus.