Eine Sicherheitslücke in dem Linux Kernel Posix Timer Code hat zur Folge, dass ein lokaler Angreifer an sensitive Informationen des Systems gelangen kann. Ursache hierfür ist ein Speicherfehler in der show_timer()-Funktion, der dazu führt, dass der
Angreifer Systemspeicherbereiche auslesen kann.
Der Fehler entsteht durch ein Out-of-Bounds-Problem beim Verarbeiten der
sigevent->sigev_notify-Variable in der show_timer()-Funktion. Der Eintrag in dieser Variable wird für die Ausgabe in /proc/<$PID>/timers verwendet. Hierzu verwendet die show_timer()-Funktion ein String Array, um den Inhalt der sigevent->sigev_notify-Variablen in einen benutzerfreundlichen String umzuwandeln. Allerdings wird die Variable im Kernel Code nicht genau kontrolliert, so dass der sigevent->sigev_notify-Wert auf einen Eintrag ausserhalb des Arrays zeigen kann, wodurch es zu dem Out-of-Bounds-Fehler kommt.
Eigentlich sollte die good_sigevent()-Funktion sicherstellen, dass sigevent->sigev_notify einen vernünftigen Wert hat. Gültige Werte sind:
SIGEV_NONE, SIGEV_SIGNAL, SIGEV_THREAD und (SIGEV_SIGNAL SIGEV_THREAD_ID).
Allerdings akzeptiert die Funktionen zufällige Werte sobald SIGEV_THREAD_ID
nicht gesetzt ist. Dies kann der Angreifer ausnutzen, um beliebige Werte in
diese Variable zu schreiben, und so den Out-of-Bounds-Fehler auszulösen. Auf
den Timer selbst hat dies keinen Einfluss, aber es führt zu der Schwachstelle
im show_timer()-Code.
