
Il bug F00F è un difetto di progettazione presente nella maggior parte dei processori Intel Pentium, Pentium MMX e Pentium OverDrive (tutti basati sulla microarchitettura P5). Scoperto nel 1997, questo bug può causare il blocco del processore, rendendolo inoperabile fino a quando il computer non viene riavviato fisicamente. Il bug è stato mitigato 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'istruzione non valida con l'istruzione lock CMPXCHG8B".
Descrizione
modificaNell'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.
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 di istruzione illegale (ovvero un istruzione invalida); tuttavia, quando l'istruzione viene eseguita con il prefisso "lock" (ovvero il byte 0xf0, normalmente usato per impedire che due processori modifichino o leggano la stessa cella di memoria risultando in una race condition), 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 mitigazioni temporanee che rilevavano la condizione e impedivano il crash.
Conseguenze
modificaL'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
modificaAnche se una soluzione definitiva richiedeva una revisione dell'hardware o del firmware, sono state proposte diverse soluzioni temporanee che impedivano l'exploit 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.