RustIEC nieuwsbrief (September 2024)
Welkom bij de tweede nieuwsbrief van het RustIEC project. In deze nieuwsbrief geven we u updates over de voortgang van de RustIEC-teams.
RustIEC demo op IMEC'S Wireless Community event
Op Woensdag 9 oktober 2024, te IMEC - Leuven (12u - 19u), zullen we de resultaten van RustIEC tonen over het veilig ingebed programmeren in Rust. We zullen een draadloze versie demonstreren van het pong-spel dat we tijdens onze embeddded workshop presenteerden. Het hoofdonderwerp van IMEC's Wireless Community event is Secure over-the-air firmware updates of IoT devices, maar de scope is breder dan dat alleen.
Inschrijven kan via Wireless Community Workshop.
Rust Embedded Operating Systems en Frameworks
Het VUB-team heeft Overview of Rust Embedded Operating Systems and Frameworks ingediend bij het MDPI Sensors journal, dat aanvaard werd voor publicatie. De paper focust op verschillende Rust-gebaseerde besturingssystemen en frameworks, waaronder Tock, Hubris, RTIC en Embassy. Het toont het potentieel van Rust als high-level taal, zonder in te boeten aan low-level controle of performantie, waardoor embedded systemen betrouwbaarder en veiliger worden. Elk besturingssysteem brengt iets unieks, van realtime mogelijkheden tot op maat gemaakte hardware-abstracties, om de uitdagingen van moderne ingebedde apparaten aan te gaan.
Het eerste deel van de paper behandelt de basisprincipes van het ingebedde Rust-landschap, waarbij wordt uitgelegd hoe Rust kan worden gebruikt om firmware voor microcontrollers te schrijven. Het legt ook de voordelen uit van het gebruik van asynchrone Rust voor ingebedde systemen, waardoor een efficiëntere en gestructureerde manier wordt aangeboden om met randapparatuur te communiceren. Ook de belangrijkste onderdelen van een ingebed besturingssysteem worden besproken, zoals hoe taken worden gepland, hoe processen communiceren, hoe te communiceren met hardware, en tot slot hoe deze besturingssystemen en frameworks netwerken ondersteunen.
Het laatste deel van de paper biedt een evaluatie van de interrupt- en planningslatentie voor elk van de verschillende besturingssystemen en frameworks. De resultaten tonen aan dat Rust gebaseerde besturingssystemen en frameworks lage latenties kunnen bereiken, waardoor ze geschikt zijn voor real-time toepassingen. Ook de geheugenvereisten van elk besturingssysteem wordt vergeleken.
Crabstick: een schaakengine in Rust
Thibaut en Ruben van het VUB-team hebben een schaakengine in Rust gebouwd genaamd Crabstick. Dit hobbyproject is nog in ontwikkeling, maar speelt al een aardig potje schaak. Je kunt tegen Crabstick spelen op Lichess.
De Lichess-integratie is een interessante casestudy van hoe je Rust kunt integreren met een webservice: Crabstick is geïmplementeerd als een Kubernetes-service, en kan worden opgeschaald om meerdere spellen tegelijk te verwerken. Elk spel wordt afgehandeld door een aparte worker-implementatie, die communiceert met de hoofdbeheerder via een REST API. De worker-implementatie is geïmplementeerd als een Actix-actor, en stelt de spellen bloot aan Prometheus.
Figuur 1: Crabstick statistieken in Prometheus, waarbij het aantal spellen over de tijd wordt weergegeven.
U kan al eens rondkijken in de Crabstick broncode. We plannen op een later moment een meer uitgebreid rapport betreffende user space Rust tools en technieken.
Verder in de bres
Gedurende de RustIEC-projectperiode heeft Rust meer tractie gekregen dan ooit tevoren. Het zijn niet langer alleen grote bedrijven zoals Google, Android en Mozilla die hun positieve ervaringen met het gebruik van Rust delen, ook overheden raken betrokken. Het Witte Huis adviseert nu dat nieuwe code niet geschreven zou moeten worden in geheugenonveilige talen zoals C en C++, maar in plaats daarvan ontwikkeld zou moeten worden in geheugenveilige talen zoals Rust.
C naar Rust vertalen
Zowel de academische wereld als de industrie maken grote vorderingen in het verminderen van de uitdagingen van het gebruik van Rust in software op systeemniveau. Een domein waar we tijdens RustIEC veel tijd aan hebben besteed en dat vooral aan belangstelling wint, is het automatisch vertalen van C naar Rust. Het Translating All C to Rust(TRACTOR) programma geïntroduceerd door de Defense Advanced Research projects Agency (DARPA) is een indicatie van de groeiende interesse. Hanliang Zhang et al., Jaemin Hong, Jaemin Hong et al., en Mehmet Emre et al. stellen oplossingen voor gebaseerd op programma-analyse, terwijl Momoko Shiraishi, Hasan Ferit Eniser, en Yoshiki Takashima oplossingen voorstellen gebaseerd op machinaal leren. Beide invalshoeken hebben hun voor- en nadelen. Terwijl programma-analysetechnieken gericht zijn op het vertalen van zeer specifieke codepatronen, is het zeer onwaarschijnlijk dat de code voor en na de transformatie semantisch veranderd is. Aan de andere kant zijn machine learning-benaderingen holistischer en kunnen ze hele codebasissen bestrijken. Ze hebben echter wel een prijs en dat is semantische gelijkwaardigheid. Er is een aanzienlijke kans dat de code na de transformatie niet meer compileert, of dat het nieuwe programma compleet ander gedrag vertoont. De toekomst zal daarom waarschijnlijk een huwelijk zijn tussen de twee invalshoeken, samen met een uitgebreide verificatie van het resulterende programma.
Terwijl TRACTOR streeft naar volledig geautomatiseerde vertalingen, hetzij met programma-analyse of AI, of een combinatie van beide, hebben we onderzocht welke hulpmiddelen we kunnen bieden totdat een betrouwbare en bruikbare volledig geautomatiseerde vertaler beschikbaar is. Hoewel we geloven dat een volledig geautomatiseerde vertaler de toekomst is, is het niet te zeggen hoe lang het zal duren voordat een dergelijk programma betrouwbaar kan werken op echte infrastructuur. In de tussentijd stellen we een semi-geautomatiseerd hulpmiddel voor dat vertalingen voorstelt in volgorde van belangrijkheid voor een ontwikkelaar die dan beslist of die wijzigingen de semantiek behouden. Hoewel dit betekent dat er meer handmatig werk nodig is, komt dit voorstel ook met meer garanties voor het behoud van de semantiek.
C en Rust interoperabiliteit
Hoewel het onmogelijk blijft om hele codebases volledig te vertalen van C naar geheugenveilig Rust, is het gebruik van C en Rust samen een must. Gelukkig is Rust ontworpen met C interoperabiliteit in gedachten, dus het is een grotendeels opgelost probleem. Het hoe van de zaak is beantwoord, maar of we het überhaupt moeten doen werd niet gevraagd tijdens RustIEC. Deze vraag is opgedoken in recente literatuur. De zorg die is onderzocht door Michalis Papaevripides et al. en Samuel Mergendahl et al. is dat geheugenfouten in geharde C-code die niet kunnen worden geëxploiteerd en die worden doorgegeven aan Rust-code, kunnen worden gebruikt om de geheugenveilige Rust-code te exploiteren. Sinds deze aanval is geformuleerd hebben Inyoung Bang et al., Peiming Liu et al., Hussain Almohri, Paul Kirth en Elijah Rivera geheugenscheidingstechnieken voorgesteld zodat de mogelijk beschadigde C data nooit Rust data kan beschadigen. Deze beschermingen hebben nog steeds enkele nadelen, verwarrende aanvallen worden niet gedekt en, nog belangrijker, de huidige gereedschappen zijn prototypes, dus nog niet klaar voor de industrie.
Vertaling en interoperabiliteit in de echte wereld
We hebben de Rust voor Linux kernel als case study gebruikt om te zien hoe de introductie van Rust in een C code base in de echte wereld gebeurt. Op het front van het vertalen van C naar Rust, kozen de maintainers van de Rust for Linux kernel ervoor om een herontwerp te maken bij het vertalen, in plaats van een één op één vertaling te maken. Meer impactvol dan dat waren de grote API- en ontwerpwijzigingen tijdens de duur van het RustIEC project, die we hebben besproken tijdens de gebruikersgroepbijeenkomst op 5 juni. De Rust voor Linux kernel lijkt zich echter te stabiliseren en nieuwe Rust functies worden langzaam maar gestaag toegevoegd aan de mainline Linux kernel. Een twistpunt dat lijkt te blijven bestaan is hoe de Rust en C code moeten interfacen, aangezien er weinig semantische definities beschikbaar zijn voor de C API. Daarom lijkt op het gebied van interoperabiliteit tussen C en Rust het grootste probleem de communicatie te zijn tussen de nogal los van elkaar staande C en Rust beheerders en, in ieder geval voorlopig, geen beveiligingsproblemen.
Vragen of Suggesties?
Heeft u vragen of suggesties voor het RustIEC-team, aarzel dan niet om contact met ons op te nemen:
- Algemene vragen over het RustIEC project: An Braeken en Kris Steenhaut
- Technische vragen over Web, Cloud en Async: Ruben De Smet
- Technische vragen over Embedded Rust: Thibaut Vandervelden en Diana Deac
- Technische vragen over Automatische vertaling en Linux kernel drivers: Stijn Volckaert en Alicia Andries