2016-03-25 2 views

Antwort

1

Sie sollten die Userspace-Zeichenfolge immer kopieren, wenn Sie vom Kernel aus darauf zugreifen.

Angenommen, die Userspace-Anwendung hat mehrere Threads. Man ordnet String auf Heap zu und übergibt es an Ihr Kernelmodul. Der andere Thread gibt gleichzeitig die zugewiesene Zeichenfolge frei.

Dann kann die folgende Situation eintreten:

  • erste User-Space-Thread übergibt die Zeichenfolge
  • Kernel Kernel validiert Zeichenfolge in Ordnung zu sein mit strlen_user(user_str)
  • Sekunden User-Space-Thread befreit String Speicher
  • Kernel startet Arbeiten mit besagtem String

Das kann zu diffe führen miete unerwünschte Folgen einschließlich Kernel Panic.

Verwenden Sie also strncpy_from_user() Funktion zum Kopieren von Zeichenfolge aus dem Benutzerbereich und arbeiten Sie nur mit Kopie danach.

+0

Außerdem könnte ** das Kopieren ** der Zeichenfolge zu einer [TOCTOU-Race-Bedingung] (https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use) führen, je nachdem, wofür die Zeichenfolge verwendet wird. Wenn die Zeichenfolge beispielsweise verwendet wird, um eine zu öffnende Datei zu identifizieren, und der Kernel eine benutzerdefinierte Zugriffsüberprüfung durchführt und anschließend die Zeichenfolge aus dem Benutzerbereich zum Öffnen der Datei verwendet, kann das User-Space-Programm den Inhalt dazwischen ändern das Überprüfen und Öffnen. Zum Beispiel, nachdem der Kernel-Code seine benutzerdefinierte Prüfung zum Öffnen von '/ tmp/my_work_file 'durchführt, ersetzt der User-Space-Prozess ihn durch'/etc/shadow'. –

+0

(Forts.) Sie haben das grundsätzlich abgedeckt, aber ich wollte die möglichen Konsequenzen hervorheben. –

+0

@AndrewHenle, Ja, das ist ein gutes Beispiel, danke. –

Verwandte Themen