Ich bin neu in der Kernel-Programmierung und verwirrt darüber, wie Sie mit Daten im Benutzerspeicher umgehen sollten. Wenn ich bestätige, dass der Rückgabewert strlen_user(user_str)
ungleich Null ist, ist es in Ordnung, user_str an printk
zu übergeben, oder sollte ich immer user_str
in den Kernelspeicher kopieren?Ist es in Ordnung, Strings vom Benutzerspeicher an printk zu übergeben?
0
A
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.
Verwandte Themen
- 1. ist es in Ordnung, Mitgliedsvariablen als Parameter an Elementfunktionen in C++ zu übergeben?
- 2. Reagieren: Ist es in Ordnung, eine Komponente durch die Requisiten an eine andere Komponente zu übergeben?
- 3. Python - Ist es in Ordnung, selbst an eine externe Funktion zu übergeben
- 4. Ändern der Benutzerspeicher-Schutzflags vom Kernelmodul
- 5. Ist es in Ordnung, einen Durchgang vom Hauptfaden durchzuführen?
- 6. Ist es in Ordnung, mit() zu verwenden?
- 7. Send printk zu seriell
- 8. Ist es in Ordnung, injizierte EntityManager an die Hilfsklassen von EJB Bean zu übergeben und sie zu benutzen?
- 9. Ist es in Ordnung, downcast?
- 10. Ist es in Ordnung, einige IDs in HTML zu zeigen?
- 11. Formatspezifizierer für printk loff_typen?
- 12. F #: Ist es in Ordnung, Theorembeweiser zu entwickeln?
- 13. Core Data Vererbung: Ist es in Ordnung, dies zu tun?
- 14. Ist es möglich, interpolierte Strings als Parameter an eine Methode zu übergeben?
- 15. Ist es möglich, URL-Parameter an Google Play zu übergeben? (Pass query strings)
- 16. Ist es in Ordnung und sicher mit Verweisen auf Konstruktor übergeben zu arbeiten - Java
- 17. Ist es in Ordnung, divs in einer Tabellenzelle zu verschachteln?
- 18. Ist es in Ordnung HTML in HTML-Attribute zu setzen?
- 19. Ist es in Ordnung, Singleton DAO-Objekte zu haben?
- 20. Ist es in Ordnung, mehrere Dispatcher.BeginInvoke zu haben?
- 21. Ist es in Ordnung, widersprüchliche Einschränkungen in Xcode zu ignorieren?
- 22. ist es in Ordnung, Variable durch die URL in Phonegap zu übergeben?
- 23. Ist es möglich, Argumente vom Typ sprintf an eine Perl-Funktion zu übergeben?
- 24. Ist es in Ordnung, Signale und Steckplätze mehrmals zu verketten?
- 25. Wann ist es in Ordnung, "abgeschlossene" Gerätetests zu ändern?
- 26. Strings an eine make-Datei übergeben
- 27. Ist es in Ordnung, RabbitMQ `/` VHost zu löschen?
- 28. Ist es möglich, Daten an PostgreSQL-Trigger zu übergeben?
- 29. mehrere Strings an Ruby übergeben starts_with?
- 30. Ist es besser, Superklasseninstanzen an den Konstruktor zu übergeben?
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'. –
(Forts.) Sie haben das grundsätzlich abgedeckt, aber ich wollte die möglichen Konsequenzen hervorheben. –
@AndrewHenle, Ja, das ist ein gutes Beispiel, danke. –