E' possibile sfruttare i bug della CPU per attaccare un sistema?

Un ricercatore ha affermato di poter sfruttare alcuni bug presenti nelle CPU Intel per sferrare attacchi in locale o da remoto. Ad ottobre la dimostrazione pratica
di Fabio Gozzo pubblicata il 17 Luglio 2008, alle 08:25 nel canale SicurezzaIntel
113 Commenti
Gli autori dei commenti, e non la redazione, sono responsabili dei contenuti da loro inseriti - info1) scarichi il microcode
2) lo copi in /etc/firmware
3) basta!
ovviamente il kernel dev'essere predisposto per caricare il microcode..se non lo è dovresti ricompilarlo (se non l'hai mai fatto dovresti cercare una guida su google...basta scrivere ricompilazione del kernel e ti esce una pletoria di siti).
In particolare dovresti solo selezionare un opzione "microcode support on intel ecc. ecc." o qualcosa del genere..dovrebbe stare nella scheda di configurazione del processore (dove ti chiede di selezionare la famiglia di processori tanto per intenderci), non puoi sbagliare!
OVVIAMENTE, non si tratta di una memoria flash...è qualcosa di molto più complesso. Il microcode comprende delle istruzioni ad un livello più basso dell'assembly (devono appunto definire il comportamento delle istruzioni assembly) che vengono caricate in una memoria ad alta velocità integrata nel processore.
Infatti le istruzioni a basso livello, anche le più elementari, coinvolgono altre istruzioni, ancora più elementari.
Su http://en.wikipedia.org/wiki/Microcode viene riportato un esempio per capire meglio il funzionamento di queste operazioni.
"For example, a single typical microinstruction might specify the following operations:
* Connect Register 1 to the "A" side of the ALU
* Connect Register 7 to the "B" side of the ALU
* Set the ALU to perform two's-complement addition
* Set the ALU's carry input to zero
* Store the result value in Register 8
* Update the "condition codes" with the ALU status flags ("Negative", "Zero", "Overflow", and "Carry"
* Microjump to MicroPC nnn for the next microinstruction"
http://en.wikipedia.org/wiki/Microcode
Si, questo era chiaro, ma non è riferito alla classe x86
Stò guardando i manuali della documentazione tecnica dell' Intel IA32 e IA64..
ma questa possibilità di update del microcode non la vedo..
Si, questo era chiaro, ma non è riferito alla classe x86
Stò guardando i manuali della documentazione tecnica dell' Intel IA32 e IA64..
ma questa possibilità di update del microcode non la vedo..
Guarda, copio direttamente un pezzo da http://en.wikipedia.org/wiki/Microcode :
* Microsoft Windows also has similar patches, but does generally not label them as such since Windows XP.
* So far [U]only x86[/U] CPUs [U]have microcode patches[/U]. [U]This is unknown with RISC CPUs[/U] as well as general purpose DSPs.
D'altronde nel mio post precedente riportavo il link del del microcode per il p4.
D'altronde nel mio post precedente riportavo il link del del microcode per il p4.
si, ho capito pure questo, ma non mi indica in che modo queste patches entrano nella CPUx86
in pratica, c'è un istruzione o opcode che carica in memoria questo microcodice ?
se si, io nei documenti ufficiali di Intel non li ho trovati..
http://www.intel.com/design/core2du...uo+tab_techdocs
Però non vorrei che la questione si dovesse interpretare invece in modo diverso,
cioè che nel kernel del SO, mediante l'uprgade, sono state eliminate tutte le operazioni
che possono generare un microcodice potenzialmente difettoso...
mah..
in pratica, c'è un istruzione o opcode che carica in memoria questo microcodice ?
se si, io nei documenti ufficiali di Intel non li ho trovati..
http://www.intel.com/design/core2du...uo+tab_techdocs
Però non vorrei che la questione si dovesse interpretare invece in modo diverso,
cioè che nel kernel del SO, mediante l'uprgade, sono state eliminate tutte le operazioni
che possono generare un microcodice potenzialmente difettoso...
mah..
noneee...si tratta di microcodice! Il sistema operativo, il kernel e tutto il resto non centrano niente!! Non ti so dire nella fattispecie che istruzioni vengono coinvolte nell'aggiornamento anche perché non ho un processore intel, in ogni caso non mi sorprende il fatto che non ci sia riferimento nella documentazione del processore..queste sono cose rivolte agli ingenieri che sviluppano microcode, non di certo ad un normale programmatore: il linguaggio utilizzato per le routine del microcode non è nemmeno documentato!!
ah...in linux non ho cartelle etc/firmware....ho lib/firmware...uso ubuntu...ma non credo c'entri la distribuzione
riporto un pezzettino del microcode che ho scaricato per la mia cpu (core 2 duo serie t7000)
0x2f0da1b0, 0x00000001, 0x00000001, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0xbf5ad468, 0xc79f5237, 0xbd53889e, 0x896bfd13,
0x7adc0c8f, 0x44e9e0bc, 0x1a331fc9, 0x00b0f479,
0x53e9ceb3, 0xb14131a4, 0x39fc8310, 0x6993ee0d,
0xdb0c59b4, 0x67f24fd0, 0x63e83516, 0x0a4d411d,
0xb86a4294, 0x72c2edc5, 0xc543c5df, 0x7f3dd290,
Occorre una precisazione...
Un microprocessore moderno ha, per ragioni di complessità, una struttura modulare: è composto da una serie di blocchi funzionali, ognuno dei quali svolge una determinata funzione. Tali blocchi funzionali sono collegati tra loro da percorsi regolati da porte; potete immaginare queste porte come degli interruttori estremamente veloci, pilotati da segnali di abilitazione opportunamente calcolati in base all'istruzione da eseguire. Altri segnali sono destinati a modificare il comportamento dei singoli blocchi: per esempio per usare un sommatore con riporto (full adder) per eseguire una sottrazione bisogna settare il carry (riporto) ed invertire bit a bit il sottraendo (nella logica in complemento a due per invertire il segno di un numero si invertono tutti i suoi bit e si somma uno); in questo caso, quindi, bisogna predisporre due segnali che, rispettivamente, attivino il bit di carry e facciano passare il sottraendo attraverso un invertitore prima di farlo arrivare al sommatore.Tutti questi segnali di controllo provengono da registri interni al processore (invisibili dall'esterno e da non confondersi con i registri comunemente conosciuti) che fungono da buffer per mantenerli attivi.
La domanda cruciale è ora: dove va il processore a prendere le sequenze di bit con le quali caricare questi suoi registri interni?
I processori con un organizzazione logica più semplice, come i risc ed i primi processori cisc, copiano queste sequenze direttamente dai bit delle istruzioni di programma da eseguire o riescono a ricavarle attraverso una semplice decodifica: questa è quella che viene definita logica cablata.
Aumentando il numero di istruzioni, duplicando alcuni dei suddetti blocchi funzionali per poter eseguire calcoli in parallelo (stiamo comunque parlando ancora delle varie parti di una sola cpu non di sistemi multicore, infatti il primo processore intel ad utilizzare due unità di esecuzione degli interi, sia pure non uguali, è stato il pentium) si va incontro ad un aumento di complessita tale da non rendere progettualmente conveniente la realizzazione della logica cablata atta ad eseguire il tutto: centinaia di istruzioni appartenenti a decine di classi diverse, operanti su tipi di dati di dimensione e codifica diverse (interi [8,16,32,64bit], mmx, sse [1,2,3,4], 3dnow, 3dnowext) che magari condividono gli stessi registri e vanno interpretati a seconda del contesto (fpu-mmx). In una situazione del genere tentare di realizzare una unità di esecuzione in logica cablata è inutile: non perché sia impossibile, visto che la progettazione si svolge con l'ausilio di programmi che all'aumentare della complessità non hanno particolari problemi se non quello di richiedere più tempo per sbrogliare il tutto, ma perché la rete di decodifica così ottenuta potrebbe arrivare ad essere più lenta delle unità di esecuzione che deve controllare; questo comporterebbe quindi un serio limite alla frequenza massima di lavoro del processore.
Ed è qui che entra in azione la cosiddetta logica microprogrammata.
Visto che si può affrontare tranquillamente la complessità dell'ottenere tutti i segnali necessari a pilotare l'attivazione e lo stato di tutte le unità di esecuzione e di tutti i percorsi che le uniscono, per ciascuna istruzione, tipo di dato, dimensione dello stesso (ci pensa l'apposito sw) perché non precalcolare il tutto ed inserirlo in una tabella? Geniale!
Ecco ottenuto il microcodice.
Vantaggi? Strutturando opportunamente la tabella la si può gestire come un vero e proprio programma: per ogni riga si può specificare operandi (segnali che attivano la provenienza ed il percorso dei dati sorgenti e destinazione), operatori (segnali che attivano le unità di esecuzione che useranno i dati per produrre il risultato di un'operazione), salti (la prossima istruzione da eseguire si trova alla riga x della tabella), ecc. Per ogni ciclo di clock basta ricopiare le varie parti della riga corrente nei registri che contengono i vari segnali di attivazione ed il gioco è fatto, in una frazione del tempo necessario alla corrispondente logica cablata per ottenere lo stesso rusultato. Il risultato di tutto ciò è che si riporta ad una dimensione gestibile umanamente l'enorme complessità di una moderna cpu con diverse unità di esecuzione che operano in parallelo, esecuzione fuori ordine delle istruzioni, ecc.
Può capitare il caso che non sia conveniente implementare il microcodice di una determinata istruzione: se l'istruzione da eseguire è semplice (vedi la somma di cui all'estratto da wikipedia) e nel formato dell'istruzione assembly sono già disponibili operandi sorgenti e destinazione, oltre ovviamente all'operazione da effettuare, può essere più economico in termini di tempo di esecuzione o numero di transistor impiegati realizzarne la decodifica in logica cablata. Chi di voi mastica un pò di assembly x86 ricorderà che spesso l'insieme di istruzioni inc, jnz era più veloce della singola istruzione loop: ovviamente ciò era dovuto al fatto che le due istruzioni più semplici erano realizzate in logica cablata mentre la loop utilizzava la tabella di microprogramma memorizzata in una rom (e quindi molto più lenta).
Immagino che il sistema attuale non sia troppo dissimile e che ci siano istruzioni semplici realizzate in logica cablata ed istruzioni complesse microprogrammate. Suppongo altresi che ci sia ancora una rom contenente il microcodice che viene 'ricopiato' al reset della cpu in una memoria statica e che pertanto sia aggiornabile dal bios o da un qualsivoglia processo eseguito in ring0 anche durante il funzionamento della cpu.
Tornando in topic realizzare un attacco richiederebbe almeno di conoscere l'esatta mappatura dei vari segnali all'interno della tabella di microprogramma e di aver individuato un intoppo tra una sequenza e l'altra sfruttabile per portare la cpu in una condizione tale da sottometterla ai propri intenti.
ah...in linux non ho cartelle etc/firmware....ho lib/firmware...uso ubuntu...ma non credo c'entri la distribuzione
riporto un pezzettino del microcode che ho scaricato per la mia cpu (core 2 duo serie t7000)
si..il percorso cambia da una distribuzione all'altra..comunque probabilmente ti ho detto una cavolata io, pardon
probabilmente volevi dire dec, jnz..
Oops..
EsattamenteQuante sciocchezze dici ?
so benissimo cos'è il microcodice delle cpu CISC
probabilmente Intel si riserva la documentazione tecnica, e chissà,
magari modificando il microcode riescono pure ad attivare le TXT e il TPA..
Probabilmente nel Bios c'è un istruzione non documentata che permette di caricare
in opcode memory i famosi 2048 byte dell' update.
Mi sembra però che questo update è di tipo "volatile" cioè deve venir ricaricato ad ogni
accensione della CPU...
Devi effettuare il login per poter commentare
Se non sei ancora registrato, puoi farlo attraverso questo form.
Se sei già registrato e loggato nel sito, puoi inserire il tuo commento.
Si tenga presente quanto letto nel regolamento, nel rispetto del "quieto vivere".