È possibile leggere la memoria da un altro programma allocando tutto lo spazio vuoto su un sistema?

24

In teoria, se dovessi creare un programma che assegnasse tutta la memoria inutilizzata su un sistema, e continuassi a richiedere sempre più memoria mentre altre applicazioni rilasciavano memoria che non avevano più bisogno, sarebbe possibile leggere la memoria rilasciata di recente da un'altra applicazione? O è in qualche modo protetto dal moderno sistema operativo?

Non ho un'applicazione pratica per questo, sono solo curioso. Mi rendo conto che ci sono alcuni problemi con l'allocazione di "tutta la memoria disponibile" nella vita reale.

Modifica: per chiarire, sto chiedendo specificamente la memoria "Rilasciata", non l'accesso alla memoria che è attualmente allocata da un'altra applicazione.

    
posta ConditionRacer 04.01.2013 - 22:21
fonte

4 risposte

21

No, perché un buon kernel cancella il contenuto della memoria prima che venga emesso in un processo per proteggersi esattamente dal tipo di attacco che proponi.

Sui sistemi Unix, la memoria è allocata ai processi estendendo ciò che viene chiamato il break di programma , che è il limite dello spazio virtualmente indirizzabile che un processo può utilizzare. Un processo dice al kernel che vuole estendere il suo spazio indirizzabile e il kernel lo consentirà se la memoria è disponibile o se la chiamata fallirà se non lo è. (Il nome della chiamata di sistema brk() deriva da questo concetto.)

In pratica, i grandi blocchi di memoria liberata spesso non si scontrano con l'interruzione del programma, che è ciò che sarebbe necessario affinché un processo restituisca memoria al kernel riducendo la pausa del programma. Questo è, ovviamente, tutto dipende dall'implementazione del tuo sistema di malloc() e free() . Se hai fonti disponibili, ti diranno se la memoria viene mai restituita.

Non ci sono implicazioni sulla sicurezza per malloc() che non sta inizializzando la memoria perché tutto ciò che ha ottenuto tramite brk() sarà stato scrubbato e qualsiasi cosa precedentemente free() d sarà stata scritta con lo stesso processo.

    
risposta data 04.01.2013 - 22:59
fonte
16

Sì, è teoricamente possibile leggere la memoria rilasciata di un altro processo. È stata la fonte di una serie di attacchi di escalation di privilegi nel corso della giornata. Per questo motivo, i sistemi operativi oggigiorno effettivamente azzerano la memoria se precedentemente era stata allocata da un altro processo. La ragione per cui non si vede sempre la memoria azzerata è perché è più efficiente non azzerare la memoria se è stata precedentemente assegnata dallo stesso processo. Il sistema operativo tenta di restituire le pagine di memoria allo stesso processo, se possibile.

    
risposta data 04.01.2013 - 22:48
fonte
2

Qui ci sono diversi livelli che influenzano la risposta.

Se si presuppone un sistema operativo di memoria virtuale moderna, non sarà possibile visualizzare i resti di altri dati di processi nelle pagine che si assegnano.

Quando un processo viene caricato per la prima volta, viene caricata la tabella delle pagine e vengono allocati potenzialmente frame di memoria reale a tali pagine. Come minimo, la tabella delle pagine o la sua tabella supplementare, conterrà una mappa di tutta la memoria che il processo può allocare. Questo è anche il punto in cui viene interrotta l'interruzione del processo iniziale, menzionata sopra.

Sebbene malloc () possa, se il processo è permesso, fare in modo che l'interruzione del processo cambi, aggiungendo più pagine a una pagina di processi (tabella supplementare) per soddisfare la richiesta, il luogo in cui un processo può "ottenere un altro" processo i dati sono al livello di memoria reale inferiore.

In entrambi questi scenari un moderno sistema operativo che utilizza la paginazione della domanda, o allocazione pigra, non sta ancora assegnando memoria fisica (frame). Il sistema operativo sta semplicemente "prendendo appunti" su quale memoria virtuale per quel processo è considerata valida. La memoria effettiva viene assegnata solo quando necessario.

La memoria fisica oi frame vengono allocati a un processo quando la pagina virtuale viene realizzata e mappata in una tabella di pagine dei processi È qui che esiste il potenziale per l'esposizione dei dati. Questo succede durante un errore di pagina. L'esposizione è dovuta al fatto che un precedente processo potrebbe aver utilizzato lo stesso frame ei suoi dati sono stati abbandonati o scambiati, per lasciare spazio alla richiesta di memoria fisica corrente. Il sistema operativo deve fare attenzione a garantire che i dati dei processi di richiesta siano scambiati correttamente o che il frame sia cancellato (azzerato) prima di riprendere il processo. Questo è anche menzionato sopra come un problema "vecchio ma risolto".

Ciò rende alquanto irrilevante se la memoria degli altri processi è stata "rilasciata" o meno. Un'altra memoria "rilasciata" dei processi risiede ancora nelle pagine assegnate a quel processo e di solito non vengono mappate fino alla fine del processo, in quanto verranno semplicemente scambiate quando la memoria si scarica o sono altrimenti sfrattati. malloc () e free () gestiscono la memoria virtuale assegnata al processo a livello (utente).

Nella tua domanda, il tuo processo, continua a richiedere sempre più memoria, in teoria, spingendo tutti gli altri processi fuori dalla memoria. In realtà, ci sono strategie di allocazione dei frame, globali e locali, che possono influenzare anche la risposta. È probabile che il processo costringerà le proprie pagine fuori dalla memoria prima che sia consentito il sovraccarico del sistema operativo e di tutti gli altri processi. Anche se questo va oltre la tua domanda iniziale.

Tutto ciò è discutibile in un sistema come MS-DOS. MS-DOS (e altri sistemi più semplici) non usano la memoria virtuale (da soli) e potresti facilmente spingere e pungere su altri dati "processi".

Alcune buone referenze, che potrebbero essere più facili da comprendere rispetto al codice sorgente di Linux, sarebbero un buon libro di testo sui sistemi operativi, Operating Systems Concepts di Silberscatz, Gavin e Gange, o Operating Systems Design di Andrew Tanenbaum. Anche qualcosa come Nachos di Berkeley o Pintos di Stanford sono piccoli sistemi operativi costruiti per l'apprendimento e hanno queste stesse idee al loro interno.

    
risposta data 05.01.2013 - 22:27
fonte
-1

No, questo non permetterà ad un altro programma di leggere la memoria di un altro grazie alla magia di paging . In questo modo, l'utilizzo della memoria totale può superare la RAM fisica scaricando parti di esso sull'hard disk.

Inoltre, la memoria massima che un processo può allocare è arbitrariamente limitata dal sistema operativo (fino a 4 concerti per un'architettura a 32 bit), dopo di che la successiva chiamata alloc restituirà un errore di memoria insufficiente.

    
risposta data 04.01.2013 - 22:27
fonte

Leggi altre domande sui tag