HeadlinesBriefing HeadlinesBriefing.com

Rust: Lebensdauer-Umgehung durch Kovarianz

Hacker News •
×

Ein Bericht auf Hacker News beschreibt einen Soundness-Fehler in Rust, durch den sich die Lebensdauer-Anforderungen einer Struktur über eine kovariante Feldzuweisung umgehen lassen. Der Verfasser teilt ein kleines Programm, das einen Wrapper-Typ Q<T> verwendet. Dieser enthält einen Option<T> und eine Drop-Implementierung. Die Drop-Implementierung verschiebt den enthaltenen Wert in ein statisches Mutex<Vec<Box<dyn Any + Send>>>, was für einen geliehenen Wert, der nicht für 'static lebt, eigentlich unmöglich sein sollte.

Im Beispiel wird ein lokaler String per Referenz in einem inneren Gültigkeitsbereich dem Wrapper zugewiesen. Die Leihe sollte daher enden, wenn dieser Bereich geschlossen wird. Da das Feld des Wrappers kovariant ist, akzeptiert der Compiler die Zuweisung, und die Referenz kann anschließend über die Lebensdauer der lokalen Variable hinaus gespeichert werden. Das Programm kompiliert und gibt unzusammenhängende Speicherinhalte aus, anstatt abgelehnt zu werden.

Unter AddressSanitizer stürzt das Programm mit einem stack-use-after-scope-Fehler ab. Das bestätigt, dass die hängende Referenz tatsächlich dereferenziert wird. Laut Bericht lässt sich das Problem in aktuellen Nightly-Builds sowie in stabilen Versionen bis mindestens 1.85.0 reproduzieren. Der Beitrag enthält Links zu Compiler-Explorer-Beispielen mit und ohne Sanitizer.

Der Fund deutet auf eine Soundness-Lücke hin, die entsteht, wenn Varianz mit Drop-basierter Speicherung zusammenwirkt. Solche Probleme stufen die Rust-Maintainer als hohe Priorität ein, denn sicherer Code darf niemals undefiniertes Verhalten hervorrufen.

Quelle: Hacker News · Zusammengefasst von HeadlinesBriefing