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.

In Pocket speichern vorlesen Druckansicht 1 Kommentar lesen
Rostiges Hintergrund mit Rust-Logo mit Bleistift und Zirkel

(Bild: iX)

Lesezeit: 3 Min.
Inhaltsverzeichnis

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.

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.

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.

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.

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)