Abo
  • IT-Karriere:

Linux-Abstürze: Fehlerhafter Zufallsbefehl auf neuen und alten AMD-CPUs

Einige Linux-Systeme booten auf AMDs neuen Ryzen-Prozessoren nicht und haben auf alten APUs Probleme mit dem Suspend. Der Grund ist eine fehlerhafte Implementierung des Zufallszahlengenerators der CPU, den Systemd aufruft. Systemd arbeitet aber völlig korrekt, das Problem liegt in der CPU.

Artikel veröffentlicht am , /
Fehler beim Zufall: Einige AMD-Prozessoren implementieren den rdrand-Befehl falsch.
Fehler beim Zufall: Einige AMD-Prozessoren implementieren den rdrand-Befehl falsch. (Bild: Diacritica, Wikimedia Commons/CC-BY-SA 3.0)

Ein Bug in AMD-CPUs führt zu Abstürzen beim Booten von manchen Linux-Distributionen. Schuld daran ist ein Fehler bei der rdrand-Funktion, einem Prozessorbefehl zur Erzeugung von Zufallszahlen. Neuere Versionen von Systemd rufen diesen Befehl auf.

Stellenmarkt
  1. Sky Deutschland GmbH, Unterföhring bei München
  2. Compana Software GmbH, Feucht

Mit dem rdrand-Befehl kann eine Anwendung von der CPU eine Zufallszahl anfordern. Der Befehl gibt dabei eine Zahl zurück und meldet außerdem, ob der Befehlsaufruf erfolgreich war. Das Problem auf AMDs Ryzen 3000: Der Prozessor gibt statisch die Zahl -1 als Zufallswert zurück, meldet aber gleichzeitig, dass der Aufruf erfolgreich war.

Systemd ruft rdrand auf und verlässt sich auf korrektes Verhalten

Neuere Versionen von Systemd rufen die rdrand-Instruktion auf und stürzen ab, wenn mehrfach keine Zufallszahlen zurückgegeben werden. Eingeführt wurde das im Juli 2018 und ist dann in die Systemd-Version 240 eingeflossen. Das erklärt auch, warum das Problem nur mit bestimmten aktuellen Linux-Distributionen auftaucht. Das jüngste Ubuntu 19.04 etwa nutzt Systemd 240 und ist betroffen, die ältere Version 18.10 nutzt Systemd 239 und stürzt nicht ab.

Doch auch wenn das Problem erst durch Systemd ausgelöst wird, der Fehler liegt eindeutig in der CPU selbst. Denn Systemd verwendet die Funktion völlig korrekt und geht davon aus, dass es einen Zufallswert erhält, wenn der Prozessor ein erfolgreiches Ausführen des Befehls meldet.

Wir haben das Verhalten der AMD Ryzen-CPUs getestet und konnten den Bug für die aktuelle 3000er-Generation nachvollziehen. Beim Aufruf eines kleinen Test-Programms, das nur die rdrand-Funktion aufruft und das Resultat ausgibt, erhielten wir bei mehreren Aufrufen immer den codierten Wert von -1 und eine Bestätigung, dass der Befehl erfolgreich ausgeführt wurde. Auf älteren Generation der Zen-Architektur, also den Ryzen 1000 und 2000, tritt der Fehler nicht auf und der Befehl liefert wie gewünscht eine Zufallszahl.

Probleme auch mit alten AMD-CPUs

Ein älterer Kernel-Bug weist darauf hin, dass das Problem auch in älteren AMD-Prozessoren auftauchen kann. Laut diesem Bugreport, der bereits 2014 erstellt wurde, gab es Probleme mit dem rdrand-Befehl bereits bei einem Prozessor aus der Jaguar-Reihe von AMD. Auch die initiale Fehlermeldung im Bugtracker von Systemd verweist auf ältere APUs von AMDs Carrizo-Reihe mit Puma-Architektur. Bei den älteren CPUs betrifft der durch Systemd ausgelöste Fehler den Meldungen zufolge jedoch nicht direkt den Boot, sondern zunächst wohl nur den Ruhezustand (Suspend).

Offenbar blieb das Problem aber lange unentdeckt, da nur wenige Programme rdrand direkt aufrufen. Üblicherweise verwenden Anwendungsprogramme die Zufallsfunktionen des Kernels wie /dev/urandom oder den getrandom-Syscall. Der Kernel verwendet selbst zwar auch rdrand, er nutzt dessen Ausgabe aber nur als eine von vielen Zufallsquellen, um den Zufallszahlengenerator des Betriebssystems zu betreiben. Das hat auch den Grund, dass einige Entwickler nicht darauf vertrauen, dass die CPU korrekte Zufallszahlen liefert.

Die Probleme fallen wohl erst jetzt in größerem Maße auf, weil Systemd den rdrand-Befehl direkt nutzt. Inzwischen ist in Systemd ein Workaround eingeführt worden, der dazu führt, dass unsinnige Werte (0 oder -1) vom Zufallszahlengenerator verworfen werden.

Besonders kurios an dem Fehler ist, dass der Befehl auf den älteren Ryzen-Chips wie gewünscht funktioniert und damit auch aktuelle Linux-Distribution mit dem aktuellen Systemd problemlos booten. Sowohl auf den Vorgänger-Chips als auch auf den Nachfolgern treten jedoch die beschriebenen Probleme auf. Ein korrekter Fix wäre vermutlich über den CPU-Microcode möglich, dieser müsste aber direkt von AMD kommen.



Anzeige
Spiele-Angebote
  1. 229,00€
  2. 34,99€
  3. (-78%) 11,00€
  4. (-80%) 6,99€

mambokurt 12. Jul 2019

https://www.golem.de/news/ryzen-3000-amd-behebt-fehlerhaften-zufall-durch-bios-update...

mambokurt 12. Jul 2019

https://www.golem.de/news/ryzen-3000-amd-behebt-fehlerhaften-zufall-durch-bios-update...

mambokurt 12. Jul 2019

Faktisch ist das richtig, die sind an der Stelle noch nicht einsatzfähig. Wenn du...

arthurdont 11. Jul 2019

...auch wenn deren Code hier ohne den CPU-Bug problemlos funktionieren würde. Nur ein...

freebyte 11. Jul 2019

Das passiert an kritischen Stellen schon (für viel Aufwand und Geld), aber in der Masse...


Folgen Sie uns
       


Samsung Galaxy Fold - Hands on (Ifa 2019)

Das Galaxy Fold scheint gerettet: Samsungs Verbesserungen zeigen sich aus, wie unser erster Test des Gerätes zeigt.

Samsung Galaxy Fold - Hands on (Ifa 2019) Video aufrufen
Sonos Move im Test: Der vielseitigste Lautsprecher von Sonos
Sonos Move im Test
Der vielseitigste Lautsprecher von Sonos

Der Move von Sonos überzeugt durch Bluetooth und ist dank Akku und stabilem Gehäuse vorzüglich für den Außeneinsatz geeignet. Bei den Funktionen ist der Lautsprecher leider nicht so smart wie er sein könnte.
Ein Test von Ingo Pakalski

  1. Update für Multiroom-Lautsprecher Sonos-App spielt keine lokalen Inhalte mehr vom iPhone ab
  2. Smarter Lautsprecher Erster Sonos-Lautsprecher mit Akku und Bluetooth
  3. Soundbars Audiohersteller Teufel investiert in eigene Ladenkette

IAA 2019: PS-Wahn statt Visionen
IAA 2019
PS-Wahn statt Visionen

IAA 2019 Alle Autobosse bekennen sich auf der IAA zur Nachhaltigkeit, doch auf den Ständen findet man weiterhin viele große, spritfressende Modelle. Dabei stellt sich die grundsätzliche Frage: Ist das Konzept der Automesse noch zeitgemäß?
Eine Analyse von Dirk Kunde


    Programmiersprache: Java 13 bringt mehrzeilige Strings mit Textblöcken
    Programmiersprache
    Java 13 bringt mehrzeilige Strings mit Textblöcken

    Die Sprache Java steht im Ruf, eher umständlich zu sein. Die Entwickler versuchen aber, viel daran zu ändern. Mit der nun verfügbaren Version Java 13 gibt es etwa Textblöcke, mit denen sich endlich angenehm und ohne unnötige Umstände mehrzeilige Strings definieren lassen.
    Von Nicolai Parlog

    1. Java Offenes Enterprise-Java Jakarta EE 8 erschienen
    2. Microsoft SQL-Server 2019 bringt kostenlosen Java-Support
    3. Paketmanagement Java-Dependencies über unsichere HTTP-Downloads

      •  /