Pentium F00F bug

Il bug F00F è un difetto di progettazione presente nella maggior parte dei processori Intel Pentium, Pentium MMX e Pentium OverDrive (tutti basati sull'architettura microarchitettura P5). Scoperto nel 1997, questo bug può causare il blocco del processore, che smette di funzionare fino a quando il computer non viene riavviato fisicamente. Il bug è stato aggirato grazie agli aggiornamenti del sistema operativo.
Il nome F00F è una abbreviazione per la sequenza esadecimale F0 0F C7 C8, che rappresenta una delle istruzioni coinvolte nel difetto. Formalmente, il bug viene anche chiamato "bug dell'operando non valido con l'istruzione CMPXCHG8B bloccata".
Descrizione
[modifica | modifica wikitesto]Nell'architettura x86, la sequenza di byte F0 0F C7 C8 rappresenta l'istruzione "lock cmpxchg8b eax" (blocco di comparazione e scambio di 8 byte nel registro EAX). Il bug si applica anche agli opcodes che terminano con C9 fino a CF, che specificano operandi di registro diversi da EAX. L'istruzione F0 0F C7 C8 non richiede privilegi speciali.
Questa codifica di istruzione è invalida. L'istruzione cmpxchg8b confronta il valore nei registri EDX ed EAX con un valore a 8 byte in una posizione di memoria. In questo caso, tuttavia, viene specificato un registro invece di una posizione di memoria, il che non è consentito.
In circostanze normali, ciò causerebbe semplicemente un'eccezione; tuttavia, quando viene utilizzata con il prefisso "lock" (normalmente usato per impedire che due processori interferiscano con la stessa posizione di memoria), la CPU utilizza erroneamente i cicli di bus bloccati per leggere il descrittore dell'handler di eccezione dell'istruzione illegale. Le letture bloccate devono essere abbinate a scritture bloccate, e l'interfaccia del bus della CPU applica questo impedendo altri accessi alla memoria finché non si verificano le scritture corrispondenti. Poiché queste scritture non avvengono, dopo aver eseguito questi cicli di bus, tutta l'attività della CPU si ferma, e la CPU deve essere resettata per recuperare.
A causa della diffusione dei microprocessori Intel, l'esistenza di questa istruzione con privilegi aperti è stata considerata un problema serio al momento della scoperta. I fornitori di sistemi operativi hanno risposto implementando soluzioni temporanee che rilevavano la condizione e impedivano il crash.
Conseguenze
[modifica | modifica wikitesto]L'esecuzione dell'istruzione F00F su un sistema vulnerabile non causa danni permanenti all'hardware; il sistema semplicemente si blocca fino a un riavvio. Tuttavia, la perdita di dati non salvati è probabile se i buffer del disco non sono stati svuotati, se le operazioni di scrittura sui dischi o altre operazioni non atomiche sono state interrotte.
Il bug è stato risolto con la revisione B2 per i processori Pentium di Intel.
Soluzioni temporanee
[modifica | modifica wikitesto]Anche se una soluzione definitiva richiedeva una revisione dell'hardware o del firmware, sono state proposte diverse soluzioni temporanee che impedivano l'esploits di questo bug, prevenendo attacchi di tipo denial-of-service (DoS) sul sistema vulnerabile. Tutte queste soluzioni si basavano sull'interruzione forzata del pattern di accesso alla memoria difettoso responsabile del blocco del processore.
Le soluzioni ufficiali proposte da Intel prevedevano di configurare la tabella dei descrittori di interruzione in modo non naturale, forzando la CPU a emettere un fault di pagina prima di accedere alla memoria contenente il descrittore per l'eccezione di opcode non definito. Questi accessi di memoria aggiuntivi sono stati sufficienti per far sì che l'interfaccia del bus abbandonasse il requisito di blocco che era la causa del bug.
Una seconda soluzione ufficiale proposta da Intel suggeriva di mantenere tutte le pagine presenti in memoria, ma segnando la prima pagina come di sola lettura. In questo caso, la modifica necessaria al gestore dell'eccezione di fault di pagina era minima.
Sono state proposte anche altre soluzioni non ufficiali, che spesso si sono rivelate efficaci e molto più facili da implementare. La soluzione più semplice comportava semplicemente la marcatura della pagina contenente i descrittori di interruzione come non-caché, il che impediva al processore di bloccarsi. Sebbene queste soluzioni non siano state mai approvate ufficialmente da Intel, si sono rivelate funzionali nella pratica.