Programmiersprache Rust: AWS-Wettbewerb für mehr Sicherheit der Standard-Library
Mittels Crowdsourcing will AWS die Standard-Library von Rust auf Schwachstellen und undefiniertes Verhalten untersuchen.
Amazon Web Services (AWS) hat einen Wettbewerb gestartet, der die Sicherheit der Rust-Standard-Library überprüft. Einzelne Herausforderungen verifizieren unterschiedliche Bereiche der Rust-Bibliotheken.
Die Rust Foundation, die sich um die Entwicklung der Programmiersprache kümmert, unterstützt den Wettbewerb.
Rust ist vor allem wegen seiner Memory-Safety-Konzepte beliebt. Die Vorgaben verhindern typische Speicherfehler, die für einen Großteil der Schwachstellen in Software verantwortlich sind.
Unsafe Rust muss nicht unsicher sein, kann aber
In der Low-Level-Programmierung, beispielsweise für direkte Interaktionen mit dem Betriebssystem, kommt Rust dabei jedoch an seine Grenzen. Als Ausweg existiert das Keyword unsafe
, das unter anderem das Verbot aufhebt, Raw Pointer zu dereferenzieren.
Unsafe Rust heißt nicht, dass der Code unsicher ist, aber dass einige Memory-Safety-Konzepte nicht greifen. So kann die Dereferenzierung eines Raw Pointer zu undefiniertem Verhalten führen, falls der Code den Zeiger vorher nicht ausreichend überprüft.
Neben als unsafe
gekennzeichneten Funktionen bietet Rust sogenannte Safe Abstractions: Eine Funktion gilt als sicher, obwohl sie unsafe
-Code enthält. Dabei ist die Funktion selbst dafür verantwortlich, dass der interne unsafe
-Block nicht zu undefiniertem Verhalten führt. Ein ausführliches Beispiel findet sich in der Rust-Dokumentation.
Es gibt viel zu tun
Laut AWS hat die Standardbibliothek von Rust etwa 35.000 Funktionen, von denen 7500 als unsafe
gekennzeichnet sind. Weitere 3000 sind Safe Abstractions. Bei der Core-Library von Rust mit etwa 21.000 Funktionen zählt AWS 7000 als unsafe
markierte und zusätzlich 1700 Safe Abstractions.
In den letzten drei Jahren wurden 57 Issues zur Sicherheit der Rust-Standard-Libary gestartet, und es gab 20 CVE-Einträge (Common Vulnerabilities and Exposures).
Der von AWS gestartete Wettbewerb setzt auf Crowdsourcing, um die Sicherheit der Standard-Library zu verbessern.
Belohnungen für abgeschlossene Herausforderungen
Eine Reihe von Challenges dient dazu, einzelne Bereiche der Library zu überprüfen. Für erfolgreich abgeschlossene Herausforderungen zahlt AWS finanzielle Belohnungen, deren Höhe der Blogbeitrag nicht näher beziffert.
Als Beispiel für eine Herausforderung führt der Beitrag die "Challenge 10: Memory safety of String" auf, um die Safe Abstraction der insert
-Funktion von std::string::String
zu überprüfen:
pub fn insert(&mut self, idx: usize, ch: char) {
assert!(self.is_char_boundary(idx));
let mut bits = [0; 4];
let bits = ch.encode_utf8(&mut bits).as_bytes();
unsafe {
self.insert_bytes(idx, bits);
}
}
Dabei gilt es die Implementierung der im unsafe
-Block verwendeten Funktion insert_bytes
zu verifizieren:
unsafe fn insert_bytes(&mut self, idx: usize, bytes: &[u8]) {
let len = self.len();
let amt = bytes.len();
self.vec.reserve(amt);
unsafe {
ptr::copy(self.vec.as_ptr().add(idx), self.vec.as_mut_ptr().add(idx + amt), len - idx);
ptr::copy_nonoverlapping(bytes.as_ptr(), self.vec.as_mut_ptr().add(idx), amt);
self.vec.set_len(len + amt);
}
}
Jede Herausforderung hat eine Liste von Kriterien, die erfolgreich überprüft werden müssen, um die Sicherheit zu gewährleisten. AWS listet in seinem Blogbeitrag einige Tools aus, die sich auf unterschiedliche Weise eignen, die Funktionen zu verifizieren.
Ein Rust-Fork für die Tests
Für den Wettbewerb hat AWS ein GitHub-Repository erstellt, das sowohl die Challenges als auch einen Fork der Standard-Library aufweist. Dieser Fork dient explizit nicht als Alternative zu den offiziellen Rust-Releases, sondern nur dazu, die Herausforderungen durchzuführen.
Weitere Details lassen sich dem AWS-Blog und der Ankündigung der Rust Foundation entnehmen.
(rme)