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 proveremo - forse le persone possono correggermi se ho sbagliato e faremo le cose insieme.
Copy On Write è un concetto di memoria interna in cui, principalmente per motivi di prestazioni, le operazioni che fanno una copia di una sezione di memoria non ottengono la propria copia a meno che e fino a quando non apportano una modifica a quella memoria - a quel punto , fai rapidamente la loro copia, apporta la modifica e restituiscilo a loro. Il vantaggio è che non devi eseguire il lavoro di creazione della copia a meno che e fino a quando non lo cambi effettivamente: più veloce, meno utilizzo della memoria, migliore memorizzazione nella cache.
Il bug qui è nel codice che esegue la copia. Sembra che ci sia una condizione di competizione in quella copia (o effettivamente nella contabilità intorno a quella copia). Una condizione di competizione si verifica quando due diversi processi o thread accedono alla stessa risorsa e si scontrano l'uno sull'altro. In questo caso, ciò che accade è che la memoria è contrassegnata per essere scrivibile prima di essere effettivamente copiata - se due thread lavorano strettamente l'uno con l'altro, il secondo può sfruttare il flag scrivibile e scrivere effettivamente nella memoria originale, non la copia.
L'exploit è che questo consente a un processo di innalzarsi da solo ottenendo l'accesso in scrittura alla comprensione del kernel stesso. Il kernel sa a quale utente sta lavorando ogni processo - prendendo una copia di quella memoria che il kernel sta usando per memorizzare quelle informazioni usando Copy On Write, quindi usando questo bug di Dirty COW, possono effettivamente scrivere le informazioni dell'utente nella copia del kernel stesso . Quindi scrivono che il processo viene eseguito come root .. e quindi possono fare qualsiasi cosa.
Il programma dimostrativo usa quello per scrivere su un file scrivibile solo da root, ma potrebbe aver fatto letteralmente qualsiasi cosa. La correzione era di separare una nuova bandiera dicendo che stavano facendo un CopyOnWrite, invece di usare il flag Write per entrambi.