Come il Paging Aumenta la Sicurezza del Sistema: Isolamento della Memoria e Controllo Accessi
Paging—lo schema di gestione memoria che divide memoria virtuale e fisica in pagine a dimensioni fisse—è una primitiva di sicurezza fondamentale nei kernel OS moderni (Linux, Windows, macOS, *BSD, hypervisori). Ecco come impone sicurezza.
1. Isolamento della Memoria (Separazione Processi)
- Ogni processo ha spazio indirizzo virtuale privato (es. 128 TB su x86-64)
- Le tabelle pagine mappano pagine virtuale → frame fisici univocamente per processo
- Il Processo A non può indirizzare la memoria del Processo B — nessuna traduzione valida esiste
- Sconfigge: Buffer overflow → lettura/scrittura arbitraria, info leak, iniezione codice
2. Permessi a Livello Pagina (ACL Hardware-applicate)
Ogni Voce Tabella Pagine (PTE) contiene bit:
| Bit | Nome | Funzione di Sicurezza |
|---|---|---|
| P | Present | Pagina mappata? Se 0 → page fault |
| R/W | Read/Write | Scrittura protetta codice, dati di sola lettura |
| U/S | User/Supervisor | Accesso Ring 3 vs Ring 0 — memoria kernel protetta |
| NX/XD | No-eXecute | DEP: Stack/heap non eseguibili → ferma iniezione codice |
| Dirty/Accessed | Tracciamento | Copy-on-write, working set, decisioni swap |
3. Separazione Kernel/Spazio Utente
- Il kernel mappa tutta la memoria fisica nell'alta metà (ffff8000`00000000+)
- I processi utente mappano solo le proprie pagine nella bassa metà
- Bit U/S = 0 per pagine kernel → accesso user-mode = page fault (#PF) → SIGSEGV / BSOD
- KPTI (Kernel Page Table Isolation) mitiga Meltdown smappando il kernel in modalità utente
4. Contenimento Buffer Overflow
- Overflow stack sovrascrive pagine stack adiacenti → colpisce pagina guardia (P=0) → #PF
- Overflow heap: metadati allocatore in pagine separate, possono essere di sola lettura
- ASLR + Paging = indirizzi base randomizzati per mapping — exploit necessitano info leak prima
5. Page Fault come Telemetria di Sicurezza
- #PF su pagina NX → tentativo esecuzione codice su dati (shellcode, ROP)
- #PF su pagina U/S=0 → processo utente tocca memoria kernel
- #PF su pagina P=0 → accesso a memoria liberata/non mappata (use-after-free)
- Hypervisori/EPP (Intel PT, AMD IBS) tracciano #PF per rilevamento anomalie
6. Virtualizzazione Sicura (Second Level Address Translation — SLAT)
- Intel EPT, AMD RVI, ARM Stage-2: Guest physical → Host physical
- Hypervisor controlla entrambi i livelli di tabella pagine
- VM escape richiede rompere due livelli di traduzione + validazione hypervisor
- Crittografia memoria (SEV-SNP, TDX) aggiunge chiavi di crittografia per VM nelle tabelle pagine
7. Funzioni di Hardening Avanzate
- Bit WP (Write Protect) in CR0: Kernel impone sola lettura sulle proprie pagine
- SMEP/SMAP: CPU blocca esecuzione/accesso kernel di pagine utente
- PKU (Protection Keys for Userspace): 16 domini, registro per thread (PKRU)
- MTE (Memory Tagging Extension, ARMv8.5+): Tag 4 bit in byte superiore puntatore + granula
Sommario
Il paging trasforma memoria fisica (condivisa, non protetta) in memoria virtuale (isolata, con permessi, controllabile). È la fondazione hardware per: isolamento processi, minimo privilegio, DEP, ASLR, KPTI, virtualizzazione e sicurezza memoria. Senza paging, i modelli di sicurezza moderni collassano.