Rust: bis zu 2500 Projekte durch Bibliothek Hyper für DoS verwundbar

Enthält die to_bytes-Funktion von Hyper keine Längenbeschränkung, so lassen sich schnell DoS-Attacken ausführen. Abhilfe schafft die offizielle Doku.

In Pocket speichern vorlesen Druckansicht 240 Kommentare lesen
Lock,With,Chain,On,A,Computer,Keyboard,-,3d,Illustration

(Bild: peterschreiber.media/Shutterstock.com)

Lesezeit: 3 Min.

Projekte, die auf der Rust-Bibliothek Hyper basieren, können leicht für DoS-Angriffe anfällig sein. Schwachstelle ist die Funktion to_bytes, mit der sich der Body einer HTTP-Request oder -Response in einen einzelnen Bytes-Buffer kopieren lässt. Bisher sind Entwickler nicht verpflichtet, die Länge des kopierten Bodys zu beschränken, was Angreifer ausnutzen können, um Prozesse zum Absturz zu bringen.

Das Sicherheitsteam des Softwareherstellers JFrog fand heraus, dass auch große Rust-Projekte wie Axum und Salvo das Problem übersehen hätten. Aktuell ist Hyper mit über 68 Millionen Downloads die beliebteste HTTP-Bibliothek für Rust. Laut dem Community-Depository crates.io sind derzeit 2595 Projekte von Hyper abhängig, darunter auch die größten, Rust-basierten HTTP Klienten und Server reqwest und warp.

Hyper dient bei Rust als Baustein zum Implementieren von HTTP-Servern und -Clienten. Die Bibliothek enthält Methoden zum Beantworten von Anfragen, zum Parsen von Request-Bodys und zum Erzeugen von HTTP-Antworten. Zwar beschreibt bereits die Doku, dass die Funktion body::to_bytes ohne das Prüfen der kopierten Größe daherkommt, das Team von JFrog vermutet jedoch, dass viele Entwickler den Hinweis ignoriert hätten. Eine einzelne HTTP-Anfrage mit so vielen Daten, dass der Body den ganzen Speicher des Empfängers belegt, würde normalerweise von Proxies, CDNs oder Firewalls gestoppt.

Allerdings ist es bei Hyper möglich, das Problem mit kleinen Paketen auszunutzen. Wenn die Funktion to_bytes mehr als einen Chunk an Daten erwartet, erzeugt sie einen Vektor, der der Länge des zu lesenden Bodys entspricht. Die Länge des Vektors bestimmt sich dabei über den Content-Length-Header, dessen Wert Angreifer einfach so hoch setzen können, dass der Prozess beim Erzeugen des Vektors abstürzt. Da HTTP-Server oft Daten aus nicht vertrauenswürdigen Quellen empfangen, ist eine solche Attacke vorstellbar. Das betrifft alle Projekte, die Hyper oder darauf basierende Frameworks nutzen.

Zwar ist eine Längenbeschränkung bei to_bytes nicht Pflicht, die offizielle Doku von Rust, das seit kurzem neben C offizielle Kernelsprache von Linux ist, liefert aber neben der Warnung vor dem Problem auch gleich eine Lösung mit. Über das Prüfen der content-length lassen sich die oben beschriebenen Angriffe leicht abwehren. Die Doku liefert folgendes Beispiel:

use hyper::{body::HttpBody};

let response = client.request(request).await?;

const MAX_ALLOWED_RESPONSE_SIZE: u64 = 1024;

let response_content_length = match response.body().size_hint().upper() {
    Some(v) => v,
    None => MAX_ALLOWED_RESPONSE_SIZE + 1 // Just to protect ourselves from a malicious response
};

if response_content_length < MAX_ALLOWED_RESPONSE_SIZE {
    let body_bytes = hyper::body::to_bytes(response.into_body()).await?;
    println!("body: {:?}", body_bytes);
}

Das von JFrog aufgezeigte Problem ist nicht das erste Mal, dass Hyper für DoS-Angriffe verwundbar ist. Bereits 2014 und 2015 gab es Probleme mit der Länge von Request Headern. Die ursprüngliche Warnung vor der Schwachstelle und eine genauere Erläuterung findet sich im Blog von JFrog.

(pst)