las Robert Loves Buch, Kapitel 5 über syscalls, und fand dieses einfache Beispiel etwas fragwürdig:
%Vor%Wie wir sehen, ist "buf" ein Objekt vom Typ "unsigned long" und auf dem Kernel-Stack definiert, d. h. sein Anfangswert ist wahrscheinlich Müll. Wie auch immer ist es gültig, "len" Bytes in den Stapel zu kopieren, wo buf ist, d. H. Es könnte etwas Nützliches überschreiben? Vielleicht ist das nur für dieses spezielle Beispiel in Ordnung?
Es ist sehr fraglich. In der Tat ist es geradezu gefährlich. Ich werde dem Autor den Vorteil des Zweifels hier geben, da sie nur versuchen zu zeigen, wie copy_from_user
und copy_to_user
funktionieren, aber sie hätten wirklich ein Beispiel geben sollen, das nicht so gefährlich war.
Besonders da das Buch lyrisch darüber, wie Sie müssen besonders vorsichtig sein:
Systemaufrufe müssen sorgfältig alle ihre Parameter überprüfen, um sicherzustellen, dass sie gültig sind und legal.The Systemaufruf läuft in kernel-Raum, und wenn der Benutzer ungültige Eingabe in die Kernel ohne Einschränkung kann die Sicherheit und Stabilität des Systems leiden.
und bietet dann eine Möglichkeit für den Benutzer, den Kernel vollständig zu vernichten: -)
Der Text von der Kopie habe ich angegeben:
%Vor%Betrachten wir einen Beispiel-Systemaufruf, der sowohl
copy_from_user()
als auchcopy_to_user()
verwendet. Dieser Syscall,silly_copy()
, ist absolut wertlos; es kopiert Daten von seinem ersten Parameter in seinen zweiten. Dies ist insofern suboptimal, als es eine Zwischen- und Fremdkopie in den Kernraum für keinen Gewinn beinhaltet. Aber es hilft, den Punkt zu veranschaulichen.
Abgesehen von dem katastrophalen Fehler, Parameter nicht zu überprüfen, bin ich ziemlich sicher, dass der letzte Parameter von SYSCALL_DEFINE3
ein Komma fehlt (obwohl das nur ein Tippfehler wäre).
Ein weitaus besseres Beispiel, ohne willkürlichen Speicher zuweisen zu müssen, wäre wie folgt:
%Vor%Jeder, der versucht, diesen Systemaufruf zu implementieren, wäre gut beraten, von diesem speziellen Beispiel in dem Buch wegzukommen, obwohl ich denke, dass er Ihnen zumindest ein gutes Kernel-Debuggerlebnis bietet: -)
Tags und Links c linux-kernel