Tu e altre 3 persone state studiando per un test, usando gli stessi appunti.
Dici "Devo andare, ho bisogno di fare una copia di questi appunti per me stesso che posso annotare... fammi fare una copia!"
Prendi gli appunti sulla fotocopiatrice, li copi, modifichi l'originale , quindi prendi l'originale modificato ritorno al resto del gruppo. Quella versione modificata è cattiva; hai modificato alcune risposte in modo che fossero sbagliate.
Il resto del gruppo rimane a studiare una brutta versione delle note, mentre tu porti a casa la versione buona.
Superi il test.
Falliscono.
L'unica sfumatura tra questo esempio e Dirty COW è che in Dirty COW dovresti essere consegnato l'originale; il kernel fa la copia per te. Ma c'è una race condition che ti dà erroneamente accesso all'originale quando ne chiedi una copia. "Race condition" significa "puoi entrare di soppiatto in qualcosa a cui non dovresti avere accesso."
Non sono un esperto di kernel Linux, ma ho familiarità con i concetti coinvolti e ho letto il commento di Linus e il diff. Ci proverò:forse le persone possono correggermi se sbaglio e risolveremo le cose insieme.
Copy On Write è un concetto di memoria interna in cui, principalmente per motivi di prestazioni, le operazioni che creano una copia di una sezione di memoria non ottengono effettivamente la propria copia a meno che e fino a quando non apportano modifiche a quella memoria - a quel punto, rapidamente fai la loro copia, apporta la modifica a quella e restituiscila a loro. Il vantaggio è che non devi fare il lavoro di creazione della copia a meno che e fino a quando non la cambino effettivamente:più veloce, meno utilizzo della memoria, migliore memorizzazione nella cache.
Il bug qui è nel codice che fa quella copia. Sembra che ci sia una race condition in quella copia (o addirittura nella contabilità attorno a quella copia). Una condizione di competizione si verifica quando due diversi processi o thread accedono alla stessa risorsa e si calpestano l'un l'altro. In questo caso, ciò che accade è che la memoria viene contrassegnata come scrivibile prima che venga effettivamente copiata:se due thread lavorano a stretto contatto l'uno con l'altro, il secondo può sfruttare il flag scrivibile e scrivere effettivamente nella memoria originale, non la copia.
L'exploit è che ciò consente a un processo di elevarsi ottenendo l'accesso in scrittura alla comprensione da parte del kernel. Il kernel sa su quale utente è in esecuzione ogni processo:prendendo una copia di quella memoria che il kernel sta usando per memorizzare quelle informazioni usando Copy On Write, quindi usando questo Dirty COW bug, possono effettivamente scrivere le informazioni dell'utente nella copia del kernel . Quindi scrivono che il processo viene eseguito come root... e quindi possono fare qualsiasi cosa.
Il programma demo lo utilizza per scrivere su un file scrivibile solo da root, ma avrebbe potuto fare letteralmente qualsiasi cosa. La correzione consisteva nel separare un nuovo flag che indicava che stavano eseguendo un CopyOnWrite, invece di utilizzare il flag Write per entrambi.