
CVE-2023-6931 Kernel-Panik-PoC
Kernel Panic PoC für CVE-2023-6931
CVE-2023-6931 ist eine Schwachstelle in perf_event, die zu einem Heap-Pufferüberlauf führt, verursacht durch einen Integer-Überlauf im read_size einer Gruppe.
perf_events ist ein vom Linux-Kernel bereitgestelltes Framework zur Leistungsüberwachung und -analyse. Dieses Framework ermöglicht die Verfolgung verschiedener leistungsbezogener Daten, die sowohl von Hardware- als auch von Softwarekomponenten generiert werden.
perf_event_open Systemaufruf
Eine Schnittstelle, die es dem Benutzerbereich ermöglicht, Leistungsereignisse im Kernel zu konfigurieren und zu steuern.
Sie wird verwendet, um Ereignisse zu erstellen, zu gruppieren, zu steuern oder Daten von Ereignissen zu lesen./proc/sys/kernel/perf_event_paranoid muss 1 oder niedriger sein.ulimit -n überprüft und geändert werden.CONFIG_PERF_EVENTS muss gesetzt sein.Die Schwachstelle entsteht durch einen Integer-Überlauf im read_size einer Gruppe. Die Funktion perf_event_validate_size führt eine Validierung des read_size durch. Allerdings überprüft die Art und Weise, wie read_size validiert wird, nur den read_size des aktuellen Ereignisses.
Der entscheidende Punkt ist, dass während jeder Validierung nur das aktuelle Ereignis validiert wird, während vorherige Ereignisse nicht validiert werden. Wenn PERF_FORMAT_GROUP für den Gruppenleiter gesetzt ist, kann bereits das Hinzufügen eines aktuellen Ereignisses den read_size des Gruppenleiters erhöhen.
Dies führt letztendlich zu einem Problem in perf_read_group. Die Berechnung von event->read_size basiert auf dem read_format des Gruppenleiters, multipliziert mit nr_siblings. Da die Variable read_size ein 2-Byte-u16 ist, beträgt der maximale Wert 0xffff.
Um dies auszunutzen, erstellt der Angreifer zunächst ein Gruppenleiterereignis mit allen möglichen read_format-Optionen. Anschließend werden zahlreiche Geschwisterereignisse erstellt. Diese Geschwister setzen nur PERF_FORMAT_TOTAL_TIME_RUNNING im read_Format, um keine Validierungsprobleme in perf_event_validate_size zu verursachen. Dadurch wird der Wert von nr_siblings extrem groß, aber da jedes Geschwisterereignis einzeln validiert wird, gibt es in dieser Phase keine Probleme.
Wenn perf_read_group in diesem Zustand aufgerufen wird, steigt der read_size des Gruppenleiters weiter an, da PERF_FORMAT_GROUP gesetzt ist. Dies führt schließlich zu einem Integer-Überlauf, und kzalloc weist einen sehr kleinen Puffer zu. Da die tatsächliche Anzahl der Ereignisse jedoch sehr groß ist, kommt es zu einem Heap-Pufferüberlauf, der eine Kernel-Panik verursacht.