rust
Derfor valgte Microsoft å skrive en ny sikkerhetskomponent med språket Rust
Særlig tre egenskaper var viktige.
Microsoft valgte programmeringsspråket Rust da selskapet skulle lage en sentral sikkerhetskomponent i selskapets Azure IoT Edge-plattform.
Komponenten, som kalles for IoT Edge Security Daemon, er utgitt som åpen kildekode og fungerer som en kommunikasjonsformidler mellom runtime-delen til Azure IoT Edge og mange vertstjenester, inkludert maskinvarebaserte kryptografienheter som Hardware Security Modules (HSM) og Trusted Platform Modules (TPM).
Sikkerhet, fart og C-funksjoner.
Siden modulen skal fungere som tilgangskanalen til HSM- og TPM-brikkene i vertsenheten, er det viktig at modulen er sikker. Samtidig er det behov for høy ytelse.
Det sistnevnte gjorde det ifølge utviklerteamet uaktuelt å bruke språk som benytter «garbage collection», altså en form for automatisk minnehåndtering, eller språk som kjøres i en egen runtime, slik som Microsofts egen .Net CLR (Common Language Runtime). Det ville gå for mye utover ytelsen.
Programmeringsspråk som C og C++ gir en langt mer forutsigbar ytelse og kontroll, men faren for at det oppstår sårbarheter på grunn av minnefeil, er en helt annen med C og C++ enn med språk som benytter automatisk minnehåndtering. Dermed var de lite egnet for en modul hvor sikkerheten er høyt prioritert.
Et tredje krav for modulen var at den skulle kunne kommunisere med HSM- og TPM-maskinvaren via et C Application Binary Interface (ABI). Dermed måtte det å laste delte objekter og DDL-er, samt å gjøre kall til C-funksjoner, være enkelt å få til.
Rust
Løsningen fant Microsoft i Rust.
Allerede i sommer kom Microsoft Security Response Center (MSRC) med et blogginnlegg hvor Rust presenteres som et godt alternativ for sikker systemprogrammering.
Rust er et temmelig ungt språk. Den ble offentliggjort i 2010, men den første stabile utgaven kom først i 2015. Språket er opprinnelig designet av Graydon Hoare i Mozilla Research. Mozilla har tatt det i bruk i deler av Firefox.
Rust er lagt for å skrive applikasjoner som har høy ytelse. Målet er at det skal være like raskt som C++ i det fleste sammenhenger.
På plattformene hvor det støttes, avhenger standardbiblioteket til Rust ifølge MSRC av libc, altså C-standardbiblioteket, akkurat som C og C++.
Samtidig har utviklerne finkornet kontroll over når og hvor mye minne som allokeres.
– Det dette betyr når det gjelder rå ytelse, kontroll og forutsigbarhet, er at Rust, C og C++ kan tenkes på med tilsvarende vilkår, skriver MSRC.
Minnesikkert
Det som primært skiller Rust fra C og C++, er det skal være fullstendig minnesikkert. I C og C++ kan det oppstå en rekke ulike typer minnefeil, inkludert bufferoverflytsfeil og minnelekkasjer.
Dette skal ikke være mulig i Rust. Ifølge MSRC er problemer med minnesikkerheten årsaken til rundt 70 prosent av alle sikkerhetsproblemer som MSRC tildeler en CVE (Common Vulnerabilities and Exposures).
– Dette betyr at dersom programvaren hadde blitt skrevet i Rust, hadde 70 prosent av disse sikkerhetsproblemene sannsynligvis ha blitt eliminert, skriver MSRC.
Før Microsoft gjorde IoT Edge Security Daemon fullt tilgjengelig, engasjerte selskapet en ekstern sikkerhetsleverandør til å utføre penetrasjonstesting på programvaren. Ingen ble funnet i den delen som var skrevet i Rust.
Utfordringer
Det er ikke bare enkelt å ta i bruk et så nytt programmeringsspråk. Få av utviklerne i det aktuelle teamet hadde erfaring med språket fra før, men etter fire til seks uker hadde de fleste begynt å levere ikke-trivielle bidrag til Rust-delen av kodebasen.
Økosystemet rundt Rust kan på ingen måte sammenlignes med det til de mest etablerte språkene, noe som ofte betyr at flere komponenter må bygges fra bunnen av.
I tillegg er verktøyene for redigering og debugging langt fra på høyde med det man finner til for eksempel i C# og Java. Ifølge IoT Platform-teamet opplevde utviklerne blant annet at Visual Studio Code-utvidelsen Rust Language Server (RLS) var notorisk ustabil.
Opplevelsene skal likevel være såpass positive at Azure IoT-teamet har valgt å bruke Rust også i andre prosjekter. Dette gjelder blant annet flere nettskytjenester som nå er under aktiv utvikling.