
Exploit für CVE-2021-3679 und Dokument zur Behebung
Dies ist ein Proof-of-Concept-Programm, um einen Logikfehler in rb_per_cpu_empty zu beweisen. Programme, die auf den Fehler treffen, werden in einer Kernelspace-Busy-Deadloop in tracing_read_pipe hängen und können nicht mit UNIX-Signalen (einschließlich SIGKILL) angehalten oder beendet werden.
Obwohl es ein ähnliches Verhalten (Deadloop & CPU-Auslastung) wie der Fehler der seq_buf_used-Berechnung zeigt, der in Linux 4.5 behoben wurde, soll dieses Programm die Existenz eines anderen Fehlers beweisen, der eine völlig andere Ursache hat und vermutlich in Kerneln der Versionen 3.10 bis 5.14-rc1 existiert (siehe auch POC-Ausführungsergebnis).
HAFTUNGSAUSSCHLUSS: Dieses Proof-of-Concept-Programm kann Ihr Linux zum Stillstand bringen, viel Strom verbrauchen und kann bei Aktivierung nicht mit UNIX-Signalen beendet werden. Verwendung auf eigene Gefahr.
Diese Pakete oder Befehle müssen vor der Ausführung des Proof-of-Concept-Skripts installiert sein.
gcc
realpath
nm
Bash und Zeichenfolgenverarbeitungsbefehle wie awk und grep werden ebenfalls benötigt und sind wahrscheinlich in Ihren Distributionen enthalten.
Obwohl es sich um ein Bash-Skript handelt, ist der Teil des Codes, der den uprobe angibt, plattformabhängig (wir können $argN in uprobe nicht verwenden), und wir unterstützen i386, x86_64, arm und aarch64. Fügen Sie gerne Ihre eigene Plattformunterstützung hinzu.
Um das Proof-of-Concept auszuführen, führen Sie einfach den folgenden Befehl mit Root-Rechten aus:
./rbdetonate

Wenn der Fehler durch das Proof-of-Concept ausgelöst wird, wird ein dd-Prozess gestartet, der einen ganzen CPU-Kern verbraucht, und er kann nicht allein mit UNIX-Signalen wie SIGKILL beendet werden.
Der bash-Prozess des rbdetonate-Skripts kann beendet werden, aber das Senden des SIGINT-Signals kann ihn je nach bash-Implementierung entweder beenden oder nicht. Und neuere Versionen von bash können nur dann durch SIGINT beendet werden, wenn der gestartete dd-Prozess läuft.

Das rbdetonate-Skript könnte beendet werden und Nothing buggy has been detected ausgeben, wenn es nach mehreren Versuchen keinen dd-Prozess erstellen kann. Dies könnte jedoch einige Zeit dauern, da wir 8192 Mal wiederholen.
Kommentar: Dieser Fehler existiert theoretisch in allen Versionen mit Userspace-Tracing-Funktion (>=3.10), aber ältere Kernelversionen haben den uprobe in vielerlei Hinsicht nicht richtig zum Laufen gebracht. Es wäre dankbar, wenn Sie uns helfen könnten, sein Verhalten zu korrigieren.
A: Führen Sie einfach den Befehl echo > /sys/kernel/debug/tracing/instances/rbdetonate/trace mit Root-Rechten aus. Dies sollte das Programm aus der Deadloop holen.
A: Nein. Die hier verwendeten Build-Tools dienen nur zum Erstellen des rbwrite-Programms, das deterministische Ergebnisse liefert, indem es in unseren entworfenen Schritten einfach auf Ringbuffer-Seiten auf CPU#0 schreibt.
Trivialerweise kann für dieses Proof-of-Concept auch eine kompilierte Version des rbwrite-Programms wie ein Code verwendet werden, und die Adresse des Tracepoints könnte danach abgerufen werden.
Für die Verwendung des Linux-Tracings, wenn Ihnen das Rauschen durch Anwendungen nichts ausmacht, erzeugt das Hinzufügen von Kprobe-Tracepoints zu Syscalls und Kernelfunktionen ebenfalls Ereignisse. Aber für das Proof-of-Concept könnte dies Undeterminismus einführen und wird nicht bevorzugt.
| Version | Reproduziert | Screenshot |
|---|
| 5.14.0-rc2-00479-g86020194bc7e (Fix version) | N | 5.14.0-rc2-00479-g86020194bc7e.png |
| 5.14.0-rc2-00478-g2734d6c1b1a0 (5.14.0-rc2) | Y | 5.14.0-rc2-00478-g2734d6c1b1a0.png |
| 5.4.0-77-generic | Y | 5.4.0-77-generic.png |
| 4.4.0-142-generic | Y | 4.4.0-142-generic.png |