View Single Post
Old 03-01-2018, 13:58   #64
paranoic
Senior Member
 
Iscritto dal: May 2000
Città: Torino
Messaggi: 1649
Quote:
Originariamente inviato da WarDuck Guarda i messaggi
Da quello che ho letto velocemente in giro la cosa sembra molto più grave.

Qui si parla di una falla che consentirebbe a programmi che girano in user space di accedere alla memoria kernel space.

Per capire il problema bisogna comprendere come viene gestita la memoria nei sistemi operativi moderni.

Questa viene tipicamente "virtualizzata" dal sistema operativo, ovvero gli indirizzi di memoria fisici della RAM vengono tipicamente mascherati e si utilizzano indirizzi virtuali che alla bisogna vengono tradotti nei corrispondenti fisici.

Per fare un esempio si possono avere due processi che hanno nel proprio spazio di indirizzi lo stesso indirizzo virtuale A, ma che viene tradotto in indirizzi fisici diversi (A->B oppure A->C).

Nei sistemi operativi moderni la memoria viene gestita in gruppi contigui di bytes chiamate pagine (tipicamente si usano pagine da 4096 bytes). Questo perché così facendo è più efficiente effettuare la traduzione degli indirizzi virtuali in indirizzi fisici (basta tradurre il numero di pagina).

Dunque il sistema operativo tiene per ogni processo una tabella (in realtà più di una, ma è per far capire il concetto), detta tabella di paginazione che mappa gli indirizzi virtuali agli indirizzi fisici. La traduzione effettiva degli indirizzi può essere effettuata in software oppure in hardware (MMU). Per velocizzare le traduzioni esiste una cache, detta TLB che tiene le ultime traduzioni virtuale->fisico.
Altrimenti per ogni accesso ad un dato in memoria sarebbero necessari altri accessi in memoria (per scoprire la traduzione dell'indirizzo).
Ogni volta che viene effettuato un cambio di contesto dallo scheduler (quindi cambia il processo in esecuzione) è necessario cambiare le tabelle di paginazione e di conseguenza fare un flush delle cache TLB perché altrimenti il nuovo processo si troverebbe con le vecchie (ed errate) traduzioni.

Per questioni di efficienza in Linux (ma penso anche in altri OS) ogni processo tiene nelle proprie tabelle di paginazione una parte degli indirizzi virtuali associati ad indirizzi fisici del kernel. Questo perché al cambio di modalità (per esempio quando si effettua una chiamata di sistema) il kernel si trova già con le tabelle di paginazione del processo e quindi non è necessario effettuare un flush delle cache TLB.

Ci si affida ai meccanismi di protezione hardware per impedire che il processore in user mode possa accedere a quegli indirizzi. Se questa protezione viene meno tutti i processi potrebbero tendenzialmente accedere alla memoria del kernel.

La patch che stanno sviluppando dovrebbe rimuovere il mapping degli indirizzi del kernel dalle tabelle di paginazione dei processi, quindi adesso quando viene effettuata una chiamata di sistema sarebbe necessario cambiare tabelle di paginazione e di conseguenza effettuare un flush delle cache TLB, motivo per cui si perde molto in prestazioni.

Qualche link:
https://en.wikipedia.org/wiki/Kernel...able_isolation
https://lwn.net/Articles/738975/
Ottima e dettagliata descrizione. Bravo
__________________
Ciao a tutti
paranoic è offline   Rispondi citando il messaggio o parte di esso
 
1