2016-11-04 2 views
0

Wir wussten, dass für die sichere Probleme, sollten wir copy_to_user()/copy_from_user() verwenden, wenn wir Speicherkopie zwischen User-Space und Kernel-Space tun wollen.Kann ich sagen copy_to_user()/copy_from_user() ist ein memcpy mit access_ok()?

Meine Frage ist, so dass die memcpy() sollte eine bessere Leistung als copy_to_user()/copy_from_user() haben? Da memcpy() nichts unternommen hat, um das System zu schützen, habe ich Recht?

Wenn wir über sichere Probleme nicht kümmern, können wir verwenden memcpy() anstelle von copy_to_user()/copy_from_user() eine bessere Leistung zu bekommen? (Es ist eine schlechte Idee, ich weiß, nur fragen, ob es richtig ist)

Antwort

1

Eine Antwort: Nein, weil Sicherheitsfragen im Kernel nie irrelevant sind.

memcpy() insbesondere ist eine schlechte Funktion zu verwenden, da das dritte Argument eine signierte ganze Zahl ist. Wenn der Benutzer den Wert dieses dritten Parameters in irgendeiner Weise beeinflussen kann, öffnen Sie sich für schwerwiegende Haftungsfragen, wenn jemand versucht, eine negative Anzahl von Bytes zu kopieren.

Viele eine ernsthafte Pufferüberlauf Fehler wurden aufgrund der signierten-ness von memcpy()

Eine andere Antwort: Nein, weil copy_to_user() und copy_from_user() nicht nur access_ok() tun. Diese ersten beiden Funktionen stellen sicher, dass die Kopie, die Sie gerade erreichen möchten, erfolgreich ist oder fehlerhaft ausgeführt wird. Dies ist nicht, was access_ok() für Sie tut. Die Dokumentation für access_ok() sagt ausdrücklich, dass diese Funktion nicht, dass der Speicher garantiert Zugriffe erfolgreich sein wird tatsächlich:

Note that, depending on architecture, this function probably just 
checks that the pointer is in the user space range - after calling 
this function, memory access functions may still return -EFAULT. 

Zum Beispiel meine jüngste Quellcode hat, für x86, Laufzeit überprüft, dass geht über access_ok(): https://lwn.net/Articles/612153/

Noch eine dritte Antwort: memcpy() wahrscheinlich nicht viel effizienter ist. Sie könnten hier und da ein paar Anweisungen im Prinzip speichern, aber diese Anweisungen zum Einrichten und Überprüfen werden vernachlässigbar sein, wenn Sie mehr als nur die kleinsten Datenmengen kopieren.

Verwandte Themen