Sie und 3 weitere Personen lernen für einen Test und verwenden dieselben Notizen.
Sie sagen:"Ich muss gehen, ich muss eine Kopie dieser Notizen für mich selbst machen, damit ich sie markieren kann ... lass mich eine Kopie machen!"
Du gehst mit den Notizen zum Kopierer, kopierst sie, veränderst das Original , und nehmen Sie dann das modifizierte Original zurück zum Rest der Gruppe. Diese modifizierte Version ist schlecht; Sie haben einige Antworten so verändert, dass sie falsch sind.
Der Rest der Gruppe lernt mit einer schlechten Version der Notizen, während Sie die gute Version mit nach Hause nehmen.
Sie bestehen den Test.
Sie scheitern.
Die einzige Nuance zwischen diesem Beispiel und Dirty COW ist, dass Sie in Dirty COW sollten nicht sein übergab das Original; der Kernel erstellt die Kopie für Sie. Aber es gibt eine Rennbedingung, die Ihnen fälschlicherweise Zugriff auf das Original gibt, wenn Sie nach einer Kopie fragen. "Race Condition" bedeutet "Sie können sich Zugang zu etwas verschaffen, zu dem Sie keinen Zugang haben sollten."
Ich bin kein Linux-Kernel-Experte, aber ich bin mit den beteiligten Konzepten vertraut und habe Linus 'Kommentar und das Diff gelesen. Ich werde es versuchen - vielleicht können mich die Leute korrigieren, wenn ich es falsch mache, und wir werden die Dinge gemeinsam durchgehen.
Copy On Write ist ein internes Speicherkonzept, bei dem Operationen, die eine Kopie eines Speicherabschnitts erstellen, hauptsächlich aus Leistungsgründen keine eigene Kopie erhalten, es sei denn, sie nehmen eine Änderung an diesem Speicher vor - an diesem Punkt sind Sie schnell Machen Sie ihre Kopie, nehmen Sie die Änderung daran vor und geben Sie sie ihnen zurück. Der Vorteil besteht darin, dass Sie die Arbeit zum Erstellen der Kopie nicht erledigen müssen, es sei denn, sie wird tatsächlich geändert - schneller, weniger Speicherverbrauch, besseres Caching.
Der Fehler hier liegt im Code, der das Kopieren durchführt. Es scheint, dass es in dieser Kopie (oder tatsächlich in der Buchhaltung um diese Kopie herum) eine Race Condition gibt. Eine Racebedingung tritt auf, wenn zwei unterschiedliche Prozesse oder Threads auf dieselbe Ressource zugreifen und aufeinander zugehen. In diesem Fall wird der Speicher als beschreibbar gekennzeichnet, bevor er tatsächlich kopiert wird. Wenn zwei Threads sehr eng miteinander arbeiten, kann der zweite das beschreibbare Flag nutzen und tatsächlich in den ursprünglichen Speicher schreiben, nicht die Kopie.
Der Exploit besteht darin, dass sich ein Prozess dadurch selbst erhöhen kann, indem er Schreibzugriff auf das eigene Verständnis des Kernels erhält. Der Kernel weiß, unter welchem Benutzer jeder Prozess ausgeführt wird - indem er eine Kopie des Speichers nimmt, den der Kernel verwendet, um diese Informationen mit Copy On Write zu speichern, und dann diesen Dirty COW-Bug verwendet, können sie die Benutzerinformationen tatsächlich in die eigene Kopie des Kernels schreiben . Also schreiben sie, dass der Prozess als root ausgeführt wird.. und dann können sie alles tun.
Das Demoprogramm verwendet dies, um in eine Datei zu schreiben, die nur von Root beschreibbar ist, aber es hätte buchstäblich alles tun können. Die Lösung bestand darin, ein neues Flag zu trennen, das besagt, dass sie ein CopyOnWrite durchführen, anstatt das Write-Flag für beide zu verwenden.