2017-11-15 3 views
0

Ich schreibe einen ioctl-Treiber, der Daten im Userspace lesen und schreiben muss. Zur Visualisierung ist hier ein typisches Argument, das in einem Treiberaufruf geht:Sicherer Umgang mit Userspace-Zeigern in einem Treiber?

typedef struct { 
unsigned int* src; 
unsigned int* dst; 
unsigned int buffer_size; 
unsigned int key[8]; 
} aes_data 

Ich bin nicht sehr gut versiert in wie virtuellen Speicher funktioniert, aber ich denke, es gibt hier ein Risiko ist. Der Userspace-Prozess könnte einen Zeiger auf Speicher bereitstellen, den er nicht besitzt. Die angegebene Puffergröße könnte ebenfalls einen Überlauf in den Speicher eines anderen Prozesses verursachen. Wie gehe ich verantwortungsvoll mit diesen Userspace-Zeigern in meinem Treiber um?

+1

Sind Ihnen die Funktionen 'copy_to_user' und 'copy_from_user' des Kernels bekannt? Wenn nicht, ist es Zeit, etwas über sie zu lernen. Denn der Zugriff (Lesen/Schreiben) des Benutzerspeichers sollte nur mit bestimmten Funktionen (und einigen Variationen davon) erfolgen. – Tsyvarev

+0

Ich habe sie benutzt, aber mir war nicht bewusst, dass das alles ist. Das Schreiben, wo immer der Benutzer es mir sagt, ohne explizite Überprüfung meines Teiles, erschien ziemlich rücksichtslos :) – Fadeway

+0

'copy_to_user' und' copy_from_user' machen grundlegende Überprüfungen und sie konnten die Kopie nicht beenden. –

Antwort

1

Wie gehe ich verantwortungsvoll mit diesen Userspace-Zeigern in meinem Treiber um?

Sie nicht, einfach weil es keine Möglichkeiten gibt zu überprüfen, ob die Zeiger auf etwas Gültiges zeigen. Der Benutzer von ioctl() muss die richtigen Parameter angeben. Wenn sie das nicht schaffen, dann haben sie Glück.

Verwandte Themen