Perché il sistema operativo moderno alloca gli indirizzi statici o perché l'ASLR è ancora necessario?

1

Ho una domanda su ASLR che alloca indirizzi randomizzati per cose. Sulla base della mia comprensione (che potrebbe essere errata), un sistema operativo moderno ha meccanismi di gestione della memoria piuttosto complicati e sembra davvero stimolante allocare lo stesso indirizzo per lo stesso programma ogni volta. In altre parole, per intuizione, mi sembra che l'indirizzo randomizzato dovrebbe essere il comportamento predefinito e allocare l'indirizzo statico richiederebbe un certo sforzo.

Questa comprensione è completamente sbagliata? Oppure il sistema operativo alloca uno spazio indirizzo separato per ogni processo in modo che in ogni spazio indirizzo il processo ottenga sempre il suo comodo indirizzo statico per impostazione predefinita?

    
posta ios learner 14.12.2018 - 03:08
fonte

1 risposta

2

La maggior parte dei sistemi moderni ha una unità di gestione della memoria o MMU. La MMU è responsabile della traduzione di indirizzi fisici in indirizzi virtuali. Questo è usato per dare ad ogni processo la sua memoria virtuale privata. L'indirizzo X di un processo non corrisponde a quello di un altro processo X. Ciò migliora le prestazioni, la sicurezza e riduce il rischio di arresti anomali, ma ha anche il vantaggio di essere utilizzabile per implementare ASLR. Mentre i dati possono essere inseriti in indirizzi non casuali nella memoria fisica, il sistema è libero di posizionare i dati ovunque desideri nella memoria virtuale di un processo.

Quando un processo viene creato per la prima volta, l'unica vera memoria a cui ha accesso è lo stack, che è limitato e non è pensato per essere usato per scopi generali. Ogni volta che è richiesta una quantità di memoria non banale, il processo deve utilizzare lo heap . L'unico modo per farlo è quello di richiedere memoria dal kernel tramite una chiamata di sistema. Questa chiamata di sistema contiene alcuni argomenti che specificano la quantità di memoria che desidera, il tipo di memoria, ecc. La chiamata restituisce l'indirizzo di base di una memoria appena allocata della dimensione specificata. Una delle cose che ASLR fa è che questo indirizzo di base sia imprevedibile. Quando ASLR è disabilitato, la memoria allocata viene collocata in posizioni prevedibili.

ASLR fa molto più che randomizzare la base della memoria allocata. Quando viene eseguito un binario, il linker dinamico lo connette a tutte le librerie condivise di cui ha bisogno. Sebbene una determinata libreria sia conservata in un solo posto nella memoria fisica, il sistema è in grado di tradurla in un indirizzo virtuale per ogni processo che la utilizza. Questa traduzione degli indirizzi viene eseguita per motivi di efficienza, ma ASLR ne fa un ulteriore uso assicurandosi che l'indirizzo virtuale sia casuale. Un eseguibile appositamente compilato come Eseguibile indipendente dalla posizione (PIE) può chiamare le funzioni della libreria anche se il l'indirizzo di base della biblioteca è randomizzato.

Questo non è tutto ASLR, e alcuni sistemi operativi incentrati sulla sicurezza (OpenBSD, HardenedBSD, Linux con patch grsecurity / PaX, ecc.) usano una forma di ASLR che fa anche di più.

    
risposta data 14.12.2018 - 04:37
fonte

Leggi altre domande sui tag