Hoppa till innehållet

Cyrix coma

Från Wikipedia
Cyrix 6x86Lprocessor i kapsling från IBM

Cyrix coma (även kallad dold CLI-bugg) är en bugg som drabbade Cyrix 6x86-, 6x86L- och tidiga 6x86MX-processorer. Buggen tillät användare utan speciella systemprivilegier att exekvera kod som fick processorn att gå in i en ändlös och ej avbrytbar loop.

Introduktion

[redigera | redigera wikitext]

Ungefär samtidigt som F00F-buggen i Intels Pentium-processorer tillkännagjordes upptäckte ryssen Serguei Shtyliov i Moskva en felaktighet i en Cyrixprocessor medan han utvecklade en drivrutin för IDE i assembler. Andrew Balsa, då prenumerant på en mailinglista om Linux kernel, undersökte problemet närmare och skapade sedan detta program i datorspråket C, som kunde kompileras och exekveras av vanliga användare:

 static unsigned char c[4] = {0x36, 0x78, 0x38, 0x36};
 main()
 {
  asm ("movl $c, %ebx\n\t"
  "again: xchgl (%ebx), %eax\n\t"
  "movl %eax, %edx\n\t"
  "jmp again\n\t");
 }

Implikationerna var precis lika långtgående som F00F-buggen, i det att buggen innebar att vem som helst som hade tillstånd att exekvera kod på ett system med en drabbad Cyrix 8x86 processor enkelt kunde låsa hela systemet. För ett nätverk med sådana system kunde det innebära att hela nätverket slutade fungera.

Hur buggen framkallas

[redigera | redigera wikitext]

Maskininstruktionen XCHGL ovan står för "EXCHANGE LONG". Denna instruktion, som i kodexemplet ovan byter innehållet i adressen som pekas på av %ebx med innehållet i %eax, låser bussen och tillåter inga avbrott medan instruktionen körs. Arkitekturen i dessa processorer använder sig av cache för instruktioner i kombination med kommandoförutseende pipeline. Detta får jmp och movl-instruktionerna att exekveras under denna busslåsning. Detta innebär att även om processorregistren visar att avbrottshanteringen inte stängts av kommer avbrott inte att kallas och processorn fastnar i en ändlös slinga.

Externa länkar

[redigera | redigera wikitext]