C'è qualche distro Linux o patch del kernel che cancella uno spazio di memoria del processo dopo che il processo è terminato?

9

Un'applicazione gira su un PC integrato alimentato a batteria, accessibile ad un pubblico ristretto, che memorizza i segreti nella RAM. Per prevenire gli attacchi di avvio a freddo e il furto del PC per estrarne i segreti, dispone di sensori a prova di temperatura. Se viene rilevata manomissione, l'applicazione esiste (ma non cancella tutta la memoria del processo prima di eseguirla). Non posso cambiare questo comportamento.

Il kernel di Linux cancella di default la memoria di processo rilasciata? Qualunque distribuzione Linux lo fa? C'è una patch per farlo?

Con la pulizia intendo il riempimento zero o la riscrittura a più passaggi.

    
posta SDL 10.09.2013 - 22:36
fonte

2 risposte

10

Linux azzera (cioè riempie di zeri) tutte le pagine della memoria non quando vengono rilasciate, ma quando vengono date a un altro processo. Pertanto, nessun processo può ottenere estratti di dati da un altro processo. Tuttavia, le pagine manterranno il loro vecchio contenuto finché non saranno riutilizzate. Non sono a conoscenza di alcuna patch che esegue l'azzeramento alla versione della pagina ( Modifica: come @ user2313067 indica nella sua risposta, PaX patch offre questa opzione, ad un costo che può o non può essere un problema su un dato sistema); in generale, sarebbe dannoso per le prestazioni perché riempirebbe le cache con gli zeri, sfrattando dati più "utili" (e questo non conterebbe lo spazio di swap, che probabilmente manca al tuo dispositivo integrato, ma la maggior parte dei sistemi Linux là fuori ha swap) .

È possibile forzare una sorta di eliminazione dei dati semplicemente allocando ogni pagina possibile da un altro processo. Qualcosa del genere:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int
main(void)
{
    for (;;) {
        void *x = malloc(2000);
        if (x == NULL) {
            break;
        }
        memset(x, 'T', 2000);
    }
    return 0;
}

Se si esegue questo programma come root , quindi afferra tutta la memoria disponibile e la riempie (per forzare l'allocazione effettiva), uscendo solo quando non è rimasta memoria. È necessario eseguire root perché il kernel riserva le ultime pagine a root .

Nota che riempire la memoria attiva le condizioni OOM , a quel punto il kernel si sente autorizzato a riprendere i processi per fare qualche stanza Ciò accade solo quando non è rimasta alcuna pagina libera, ovvero lo stato che si desidera raggiungere (nessuna pagina libera a sinistra significa che tutte le vecchie pagine sono state riallocate e quindi azzerate). È una specie di suicidio per il sistema operativo, perché il codice di gestione di OOM può uccidere alcuni processi essenziali (non ci cerca , ma hey, questi sono solo euristiche). Tuttavia, questo sembra appropriato nel tuo caso: se viene rilevata la manomissione, il dispositivo non ha altra scelta tranne sventramento onorevole .

Quindi devi solo lanciare la tua applicazione critica in un wrapper (un semplice script) che avvia il programma di cui sopra quando l'applicazione critica si chiude (presumibilmente a causa di manomissioni rilevate).

    
risposta data 10.09.2013 - 23:19
fonte
5

Grsecurity ha PAX_MEMORY_SANITIZE per fare ciò. Vedi l'opzione su questa pagina .

    
risposta data 11.09.2013 - 21:17
fonte

Leggi altre domande sui tag