- p�edchoz� �l�nek - n�sleduj�c� �l�nek - obsah -

Linuxov� noviny Prosinec 1997

Chyba v procesorech Intel Pentium - softwarov� �e�en�

Jan Kasprzak, 21. listopadu 1997

V p�edchoz�m ��sle Linuxov�ch novin byla uve�ejn�na zpr�va o tom, �e byla objevena nov� chyba v procesorech Intel Pentium. Tato chyba umo��uje b�n�mu u�ivateli zablokovat procesor tak, �e je nutno prov�st studen� start po��ta�e. T�to chyb� se za�alo ��kat "F00F bug" podle hodnoty prvn�ch dvou bajt� chybn� instrukce.

Dnes je situace podstatn� lep��. Existuje zp�sob, jak softwarov� danou chybu odst�nit. Stoj� za pov�imnut�, �e k dne�n�mu dni (21. listopadu 1997) byla podle str�nky spole�nosti Intel http://support.intel.com/support/processors/pentium/ppiie/software.htm k dispozici softwarov� z�plata pouze pro Linux a BSDI. (Hovo��m zde o syst�mech s jejich� v�voj��i Intel spolupracoval. Z ostatn�ch syst�m� m� softwarovou z�platu na tuto chybu nap��klad FreeBSD. Na uveden� str�nce jsou zmi�ov�ny tyto syst�my nebo tito v�robci: BSDI, IBM, Linux, Microsoft, NCR, Novell, SCO, Sequent, SunSoft a Unisys.) Ostatn� syst�my v�etn� nap��klad Solarisu a SCO UNIXu maj� p��slu�nou z�platu pouze "ve st�diu v�voje" nebo "test�".

Je zaj�mav�, co se zde p��e o opera�n�ch syst�mech Microsoftu:

"Microsoft has worked closely with Intel to understand and characterize the effects of the recently uncovered Pentium processor erratum, and we're in the process of studying the implementation of potential workarounds in order to meet the needs of our customers," said Moshe Dunie Vice-President Windows Operating Systems Division at Microsoft. "Since this erratum can only be exploited by a program that was developed with malicious intent and deliberately uses this illegal instruction, following common-sense computing practices, such as not downloading or running executables from unknown sources, can protect a user from this problem."

"Microsoft a Intel t�sn� spolupracovali ve snaze pochopit ned�vno odhalenou chybu procesoru Pentium a ur�it jej� dopad. Pr�v� te� studujeme r�zn� mo�nosti jak chybu obej�t, abychom co nejl�pe vy�li vst��c pot�eb�m na�ich z�kazn�k�", �ekl Moshe Dunie, viceprezident divize Windows Operating Systems ve firm� Microsoft. "Vzhledem k tomu, �e tato chyba m��e b�t vyu�ita pouze programem, kter� byl naps�n se zl�m �myslem a z�m�rn� pou��v� tuto nedovolenou instrukci, sta�� k ochran� u�ivatel� p�ed t�mto probl�mem chovat se podle zdrav�ho rozumu, t�eba nestahovat a nespou�t�t programy z nezn�m�ch zdroj�."

Tedy Microsoft se z�ejm� vzdal my�lenky na to, �e by jeho opera�n� syst�my mohly b�t n�kdy nasazeny ve v�ceu�ivatelsk�m prost�ed�.

Nyn� se budu v�novat mechanismu, jak�m chybn� instrukce pravd�podobn� pracuje a navrhovan�m softwarov�m �e�en�m. Samoz�ejm� nen� v sil�ch jednoho �lov�ka pochopit mili�ny tranzistor� v Pentiu, ale z chov�n� CPU p�i t�to chyb� lze leccos odpozorovat. Popisovan� mechanismy se tedy sna�� odhadnout, co se v CPU p�ibli�n� d�je p�i v�skytu t�to instrukce. Nekladu si ��dn� n�roky na spr�vnost n��e uveden�ch mechanism�, nicm�n� s jejich vyu�it�m se poda�ilo chybu izolovat a odst�nit.

Inkriminovanou instrukci s opera�n�m k�dem f0 0f c7 by bylo mo�n� zapsat jako lock cmpxchg8b s adresovac�m m�dem, kter� nen� pro tuto instrukci platn�. Tato instrukce je "t�m�� leg�ln�". Co to znamen�? Na to, �e jde o neplatnou instrukci, a �e by se tedy m�la vyvolat p��slu�n� v�jimka, procesor p�ijde a� pom�rn� pozd�, kdy� u� je prov�d�n� instrukce uvnit� CPU v pokro�il�m stavu. Tento stav se vyzna�uje t�m, �e procesor u� zamknul datovou sb�rnici, jak mu p�ikazuje instruk�n� prefix lock. A zde pr�v� nast�v� probl�m. Procesor zjist�, �e instrukce je neplatn�, a chce vyvolat p��slu�n� p�eru�en�. Toto v prvn� �ad� znamen� pod�vat se do tabulky p�eru�en� (IDT, Interrupt Description Table), na kter� adrese za��n� obsluha p�eru�en� "neplatn� instrukce". Pokus o p��stup k IDT ale sel�e, proto�e CPU m� zam�enou sb�rnici! N�kde v tomto m�st� se procesor zastav�.

Jak takovouto chybu o�et�it? K p��stupu na sb�rnici nedoch�z�, pokud se p��slu�n� ��st IDT pr�v� nach�z� v prim�rn� cache procesoru. Prvn� a nejstar�� softwarov� z�platy na tuto chybu fungovaly tak, �e zajistily, aby se v cache objevil ovlada� pro obsluhu v�jimky "neplatn� instrukce" (nap��klad vykon�n�m n�jak� skute�n� neplatn� instrukce), a pak zamkly obsah cache. Toto fungovalo, ale v�kon procesoru bez prim�rn� cache klesl a� n�kam k pr�m�rn�m procesor�m 486.

Pozd�j�� �pravy vyu��valy toho, �e jin� v�jimky maj� obsluhu zam�en� sb�rnice vy�e�eny l�pe ne� v�jimka "neplatn� instrukce". Pokud se nap��klad str�nka IDT, ve kter� byl vektor p�eru�en� "neplatn� instrukce", nenach�z� v opera�n� pam�ti, Pentium toto rozpozn� a vyvol� v�jimku ��slo 8 - "dvojit� v�padek" (double fault). Jak tohoto ale dos�hnout? Sta�� zarovnat za��tek IDT tak, aby prvn�ch sedm polo�ek IDT (pro v�jimky 0 a� 6, p�i�em� "neplatn� instrukce" m� ��slo 6) bylo v jedn� str�nce a ostatn� byly v n�sleduj�c� str�nce pam�ti. Tedy aby tabulka IDT za��nala t�sn� p�ed koncem str�nky. D�le je nutno upravit obsluhu v�jimky ��slo 8 tak, aby byla schopna analyzovat situaci a p��padn� zavolat v�jimky ��slo 0 a� 6. A posledn� v�c je ozna�it prvn� str�nku IDT jako neplatnou.

V p��pad� pokusu o vykon�n� neplatn� instrukce se tedy zavol� v�jimka ��slo 8 "dvojit� v�padek", kter� pak zp�tn� zjist� o co jde a zavol� p��slu�nou v�jimku z intervalu 0 a� 6. Toto m��e ud�lat dv�ma zp�soby. Bu�to zjist� p��slu�nou informaci z chybov�ho slova a pak zavol� p��slu�nou obsluhu jako funkci (co� byl zp�sob, jak�m byla situace �e�ena v Linuxu) nebo se prvn� str�nka IDT namapuje do pam�ti a dan� instrukce se restartuje (samoz�ejm� a� po kontrole, jestli n�hodou ne�lo o instrukci f0 0f c7 cx. Toto byl zp�sob, jak�m doporu�oval chybu izolovat Intel. Prvn� zp�sob m�l probl�my s obsluhou speci�ln�ch p��pad�, jako je nap��klad lad�c� bod na m�st� neplatn� instrukce a podobn�. Lad�c� a krokovac� funkce zde nefungovaly �pln� korektn�. Naproti tomu druh� zp�sob (navrhovan� Intelem) m�l probl�my se samomodifikuj�c�m se k�dem (nap��klad na SMP stroji - dojde k p�eru�en�, namapuje se IDT, ale n�kdo jin� zm�n� zat�m instrukci, na kter� do�lo k p�eru�en� na f0 0f c7 cx. Restartuje se instrukce, ale IDT je namapovan� a procesor se zablokuje). Linus Torvalds napsal na linux-kernel

Charles is right about the problems, although they don't actually apply to the current Linux version of the patch. They _do_ apply to the intel one, exactly because the intel one tries to be more clever, and fails in subtle ways.

Co se t��e t�chto probl�m�, m� Charles pravdu, a�koli se vlastn� nevztahuj� k sou�asn� Linuxov� verzi toho patche. Vztahuj� se ale k Intelovsk� verzi, pr�v� proto, �e ten jejich patch se sna�� b�t chyt�ej�� a nezvl�d� to.
Linus Torvalds

Obslou�en� chyby F00F jedn�m ze dvou v��e popsan�ch zp�sob� st�lo p�ibli�n� 55 takt� p�i vyvol�n� kter�koli z v�jimek 0 a� 6. Z�platy proveden� t�mto zp�sobem se objevily v Linuxu 2.0.32 (vlastn� ji� v pre-2.0.32-4) a 2.1.63.

Jak je vid�t, odstran�n� takov�to chyby popisovan�m zp�sobem nebylo nijak trivi�ln�. Na�t�st� Linus ve spolupr�ci s Intelem vymyslel je�t� lep�� mechanismus odst�n�n� chyby. V CPU se toti� v pr�b�hu vyvol�n� v�jimky pro neplatnou instrukci nejen neresetuje zam�en� sb�rnice, ale tak� n�sleduj�c� p��stup do pam�ti se prov�d� jako read-write p�esn� tak, jak by jej prov�d�la skute�n� instrukce lock cmpxchg8b. Tak�e pokud je IDT namapov�na pouze pro �ten�, dojde k zavol�n� v�jimky "poru�en� ochrany pam�ti". P��slu�n� obslu�n� rutina pak zjist�, �e byl proveden pokus o z�pis do IDT na polo�ku ��slo 6 a detekuje tak jednozna�n� pokus o zneu�it� chyby F00F.

The new workaround actually depends on the Intel bug not only forgetting to clear the "lock" state of the instruction, it also forgets to clear the fact that the instruction tries to do a read-modify-write cycle. So it will not only do the IDT access as a locked cycle, it will do it as a locked cycle that requires write permissions.

Nov� z�plata vlastn� z�vis� na chyb� Intelu, kter� nejen�e zapomene zru�it "lock" stav instrukce, ale tak� zapomene zm�nit informaci o tom, �e se instrukce pokou�� p�istoupit do pam�ti zp�sobem �ti-modifikuj-zapi�. Tak�e procesor nejen�e vykon� p��stup k IDT se zam�enou sb�rnic�, ale je vykon�n zam�en� p��stup vy�aduj�c� nav�c pr�vo z�pisu.
Linus Torvalds

T�mto zp�sobem se kompletn� odst�n� chyba F00F a nav�c tato z�plata nem� ��dn� vliv na v�kon syst�mu (na rozd�l od p�edchoz�ch �e�en�). V sou�asn� dob� je k dispozici z�plata na j�dro 2.0.32 i 2.1.x, vyu��vaj�c� tohoto mechanismu.

Opera�n� syst�m Linux byl jedn�m z prvn�ch, kter� m�ly k dispozici z�platu na hardwarovou chybu Pentia. Tato chyba pro sou�asn� Linux ji� nep�edstavuje ��dn� nebezpe��. *


- p�edchoz� �l�nek - n�sleduj�c� �l�nek - obsah -