Ausnutzung von Nullreferenzen im Linux-Kernel
Kürzlich wurde bekannt gegeben, dass Forscher des Google Project Zero-Teams eine Methode entwickelt haben, um Schwachstellen im Linux-Kernel auszunutzen, die durch die Dereferenzierung des NULL-Zeigers entstehen.
Bislang wurden Kernelprobleme im Zusammenhang mit der Dereferenzierung von NULL-Zeigern nicht ausreichend beachtet , da es als unrealistisch galt, solche Probleme in Angriffe umzuwandeln , die zu einer Rechteausweitung oder zur Ausführung eigenen Codes führen könnten (das Abbilden nicht privilegierter Prozesse in den unteren Bereich des Adressraums ist verboten).
In der Regel führen solche Fehler zur Generierung von Oops-Warnungen durch den Kernel, woraufhin die problematischen Aufgaben abgeschlossen und der Zustand wiederhergestellt werden, ohne dass das System angehalten werden muss.
Die neue Angriffsmethode basiert auf der Behandlung von "oops"-Zuständen , die zu einer Erhöhung des Wertes des Referenzzählers (refcount) führen können, was wiederum einen Überlauf des Zählers und die Freigabe des mit dem Referenzzähler verbundenen Speichers zur Folge haben kann.
In diesem Fall wird die Ausnutzung auf Manipulationen reduziert, die für Use-after-Free-Angriffe typisch sind (es entsteht eine Situation, in der der Referenzzähler des Objekts Null wird, Speicher freigegeben wird, aber tatsächlich funktionierende Links vorhanden sind, die auf freigegebenen Speicher verweisen).
Wenn der Linux-Kernel aktuell innerhalb eines Prozesskontexts eine Nullreferenz auslöst, erzeugt er einen Oops , der sich von einer Kernelpanik unterscheidet. Eine Kernelpanik tritt auf, wenn der Kernel feststellt, dass es keine sichere Möglichkeit gibt, die Ausführung fortzusetzen, und daher die gesamte Ausführung abbrechen muss. Bei einem Oops hingegen stoppt der Kernel nicht die gesamte Ausführung; stattdessen versucht er, sich bestmöglich zu erholen und die Ausführung fortzusetzen.
Die Dereferenzierung eines NULL-Zeigers wird hier verwendet, um den Zustand "oops" kontrolliert zu erzeugen. Das Problem besteht darin, dass etwa 232 "oops"-Statusaufrufe erforderlich sind, um einen 32-Bit-Refcount-Überlauf zu erreichen.
Aus praktischer Sicht benötigt man etwa acht Tage kontinuierlicher Erzeugung von Fehlerzuständen (OOP-Zuständen), um mit dem vorgeschlagenen Exploit einen Angriff durchzuführen. Im Erfolgsfall ermöglicht der Exploit die Ausführung Ihres Codes auf Kernel-Ebene.
Die im Exploit verwendete NULL-Zeiger-Dereferenzierung wurde im Oktober behoben, aber da ähnliche Probleme nicht ungewöhnlich sind und zuvor als Fehler und nicht als Schwachstellen behandelt wurden, werden die Entwickler dem Linux-Kernel einen allgemeinen Schutz hinzufügen, um Angriffe zu verhindern, die die Generierung von "oops ."
Im Fall einer Task bedeutet dies, den vorhandenen Kernel-Stack zu verwerfen und direkt zu make_task_dead zu gehen, das do_exit aufruft. Der Kernel wird auch ein "Absturz"-Protokoll und eine Kernel-Trace an dmesg senden, die zeigen, in welchem Zustand sich der Kernel befand, als der Fehler auftrat. Dies mag wie eine seltsame Wahl erscheinen, wenn eindeutig eine Speicherbeschädigung aufgetreten ist; Die Absicht besteht jedoch darin, Kernelfehler leichter zu erkennen und zu protokollieren, unter der Philosophie, dass ein laufendes System viel einfacher zu debuggen ist als ein heruntergefahrenes.
Kernel 6.2 enthält insbesondere Änderungen zur Begrenzung der maximalen Anzahl von „Oops“ . Nach Erreichen dieses Grenzwerts, der standardmäßig auf 10 Oops festgelegt ist (dieser Wert kann bei Bedarf über den Parameter `oops_limit` geändert werden), leitet der Kernel einen Übergang in den „Panic“-Zustand ein, gefolgt von einem Neustart. Dadurch wird verhindert, dass die zum Zurücksetzen des Referenzzählers auf Null erforderliche Anzahl an Iterationen durchgeführt werden kann.
Geplant ist auch, die Einschränkung auf bereits veröffentlichte, aber noch unterstützte Kernel-Zweige sowie Kernel-Pakete gängiger Distributionen zu übertragen.
Wenn Sie schließlich mehr darüber erfahren möchten , finden Sie die Details unter folgendem Link.