Im Linux-Kernel wurde eine Schwachstelle (CVE-2021-33624) entdeckt, die es ermöglicht, die eBPF-Subsystem zur Umgehung von Schutzmaßnahmen gegen Spectre-ähnliche Schwachstellen zu nutzen. Diese ermöglichen es, den Inhalt des Speichers zu ermitteln, indem Bedingungen für die spekulative Ausführung bestimmter Operationen geschaffen werden. Für einen Spectre-Angriff ist eine bestimmte Befehlsequenz im privilegierten Code erforderlich, die zu einer spekulativen Ausführung von Instruktionen führt. Durch Manipulation der für die Ausführung von BPF-Programmen übergebenen Eingaben kann das Erzeugen solcher Instruktionen in eBPF erreicht werden, was zu einer泄漏 des Speichers des Kernels und beliebiger Bereiche des physischen Speichers über seitliche Kanäle führen kann.
Die Schwachstelle resultiert aus Mängeln im Verifikator, der zur Identifizierung von Fehlern und unzulässiger Aktivität in BPF-Programmen verwendet wird. Der Verifikator durchläuft mögliche Ausführungswege des Codes, überspringt jedoch Verzweigungsoptionen, die aus der Sicht der Semantik der Befehlssatzarchitektur unzulässig sind. Bei der Ausführung des BPF-Programms können solche Verzweigungsoptionen, die vom Verifikator nicht berücksichtigt wurden, vom Prozessor falsch vorhergesagt und spekulativ ausgeführt werden. Beispielsweise berechnet der Verifikator bei der Analyse der „load“-Operation, dass in der Instruktion ein Register mit einer Adresse verwendet wird, dessen Wert immer innerhalb definierter Grenzen liegt, aber ein Angreifer kann Bedingungen schaffen, unter denen der Prozessor versucht, spekulativ eine Operation mit einer Adresse auszuführen, die nicht den Prüfbedingungen entspricht.
Das Problem tritt seit der Veröffentlichung des Kernels 4.15 auf und wurde in Form von Patches (1, 2, 3, 4) behoben. In den Distributoren bleibt die Schwachstelle jedoch weiterhin ungepatcht (Debian, RHEL, Ubuntu, Fedora, SUSE, Arch).
Zusätzlich kann auf die Auswirkungen von Schutzmaßnahmen gegen Spectre-Schwachstellen auf die Leistung hingewiesen werden. In der Notiz werden die Ergebnisse der Optimierung des Debuggers rr (Record and Replay) zusammengefasst, der damals von Mozilla zur Fehlersuche bei schwierig reproduzierbaren Bugs in Firefox entwickelt wurde. Durch das Caching von Systemaufrufen, die zur Überprüfung der Existenz von Verzeichnissen verwendet werden, konnte die Ausführungszeit der Operation „rr sources“ für ein Testprojekt von 3 Minuten 19 Sekunden auf 36 Sekunden verkürzt werden.
Der Optimierungsautor wollte überprüfen, wie sich die Leistung nach Deaktivierung des Spectre-Schutzes ändert. Nach dem Booten des Systems mit dem Parameter „mitigations=off“ betrug die Ausführungszeit von „rr sources“ ohne Optimierung 2 Minuten 5 Sekunden (1,6-mal schneller), während es mit Optimierung 33 Sekunden (9 % schneller) benötigte. Interessanterweise reduzierte die Deaktivierung des Spectre-Schutzes nicht nur die Ausführungszeit des Codes auf Kernel-Ebene um das 1,4-fache (von 2m9s auf 1m32s), sondern auch die Ausführungszeit im Benutzerspeicher um die Hälfte (von 1m9s auf 0m33s), vermutlich aufgrund der reduzierten Effizienz des CPU-Caches und der TLB-Flushes bei aktiviertem Spectre-Schutz.
Quelle: opennet.ru
