Fedora vuole attivare automaticamente una delle protezioni hardware più interessanti contro gli attacchi che manipolano il flusso di esecuzione dei programmi. Il progetto riguarda Shadow Stack, una protezione hardware disponibile sui processori x86-64 più recenti che registra in un’area di memoria separata gli indirizzi ai quali il processore deve tornare dopo aver eseguito una funzione. Se un attacco prova a modificarli, la CPU rileva la differenza e blocca l’esecuzione.
L’obiettivo iniziale indicava Fedora 45, ma la pianificazione è cambiata: il Fedora Engineering and Steering Committee ha approvato l’intervento spostandone l’introduzione predefinita per Fedora 46, attesa nel 2027.
Il rinvio non ridimensiona l’importanza tecnica della modifica. Fedora prepara da tempo il terreno: già dal 2018 la distribuzione compila gran parte dei pacchetti con le opzioni necessarie a inserire nei file ELF i metadati relativi alle protezioni CET: durante la compilazione aggiunge ai file eseguibili le informazioni che indicano al sistema quali funzioni di sicurezza hardware supportano.
La maggioranza dei binari distribuiti tramite i repository ufficiali contiene già le informazioni richieste; l’impatto prestazionale previsto risulta trascurabile nei normali carichi di lavoro. Rimangono però alcuni nodi legati ai driver proprietari, alle estensioni Python distribuite come wheel, al codice scritto in assembly e ai componenti caricati dinamicamente. Proprio tali incompatibilità hanno contribuito allo spostamento della funzione da Fedora 45 a Fedora 46.
Come funziona una Shadow Stack
Quando un programma richiama una funzione, il processore deve ricordare l’indirizzo dal quale riprendere l’esecuzione al termine della funzione stessa. Tale indirizzo di ritorno finisce normalmente nello stack del processo. Se una vulnerabilità consente di sovrascrivere la memoria, un aggressore può tentare di alterarla e indirizzare la CPU verso sequenze di istruzioni scelte ad arte.
Shadow Stack aggiunge un secondo archivio degli indirizzi di ritorno, separato dallo stack ordinario e protetto direttamente dall’hardware. Durante un’istruzione CALL, la CPU inserisce l’indirizzo sia nello stack normale sia in quello “ombra”. Eventuali differenze che dovessero emergere in un momento successivo indicano una possibile manipolazione: il processore genera un errore control-protection fault invece di proseguire verso l’indirizzo compromesso.
La funzione di sicurezza Shadow Stack nasce soprattutto per contrastare la tecnica Return-Oriented Programming, spesso abbreviata in ROP. Un attacco ROP non deve necessariamente introdurre nuovo codice eseguibile nella memoria del processo. Riutilizza invece piccole sequenze di istruzioni già presenti nel programma o nelle librerie caricate, dette gadget, concatenandole attraverso indirizzi di ritorno manipolati.
Quali processori possono usare la protezione
Fedora indica come riferimento i processori Intel Core di undicesima generazione e successivi, insieme alle CPU AMD basate su Zen 3 o architetture più recenti. Il supporto concreto dipende comunque dalla combinazione tra processore, firmware, kernel e modalità di esecuzione.
La presenza della stringa user_shstk in /proc/cpuinfo segnala che hardware e kernel offrono il supporto per Shadow Stack nello spazio utente.
Anche la dimensione della Shadow Stack segue regole precise: per il thread principale, Linux riserva un’area collegata al limite dello stack ordinario, con un tetto massimo di 4 GB.
La parte più delicata non riguarda i programmi interamente costruiti dai repository Fedora, ma le applicazioni che caricano componenti esterni. Il loader deve verificare l’intera catena delle dipendenze: basta un solo oggetto privo della proprietà SHSTK per impedire l’attivazione della protezione all’avvio.
In tale situazione il comportamento rimane generalmente conservativo. Se una libreria incompatibile fa già parte delle dipendenze iniziali, il processo continua a funzionare senza Shadow Stack.
Una difesa importante, ma non risolutiva
Shadow Stack non corregge buffer overflow, use-after-free o errori di gestione della memoria. Impedisce però che alcune vulnerabilità si trasformino facilmente in un dirottamento del flusso di controllo basato sulla modifica degli indirizzi di ritorno.
Un aggressore può ancora cercare altre strade: corrompere puntatori, sfruttare salti indiretti, manipolare dati “cruciali” o concatenare primitive che non dipendono dal meccanismo che regola l’utilizzo degli indirizzi di ritorno.
Per tale ragione, Shadow Stack non può sostituire le altre difese già presenti nel sistema. Deve affiancarsi ad ASLR, che rende meno prevedibile la posizione del codice in memoria; alle pagine non eseguibili, che impediscono di avviare istruzioni da aree destinate ai dati; agli stack canary, che aiutano a rilevare alcune sovrascritture dello stack; alla fortificazione delle librerie e alla Control-Flow Integrity, che introducono ulteriori controlli sulle operazioni più esposte. Resta poi essenziale correggere rapidamente le vulnerabilità: queste tecniche possono ostacolare lo sfruttamento di un errore, ma non eliminano l’errore stesso.
La scelta di Fedora resta significativa perché sposta una protezione hardware dalla disponibilità teorica all’uso quotidiano. Salvo ulteriori cambiamenti, Fedora 46 dovrebbe attivarla automaticamente sui sistemi x86-64 compatibili, proteggendo i processi che presentano una catena di dipendenze interamente conforme.