Błąd śpiączki Cyrixa

Błąd śpiączki Cyrix to wada projektowa procesorów Cyrix 6x86 (wprowadzonych w 1996 r.), 6x86L i wczesnych 6x86MX , która umożliwia nieuprzywilejowanym programom zawieszenie komputera.

Odkrycie

Według Andrew Balsy, mniej więcej w czasie odkrycia błędu F00F w Intel Pentium , Serguei Shtyliov z Moskwy znalazł lukę w procesorze Cyrix podczas opracowywania sterownika dysku IDE w asemblerze . Alexandr Konosevich z Omska dalej badał błąd i był współautorem artykułu z Uwe Post w niemieckim magazynie technologicznym c't , nazywając go „ukrytym błędem CLI” (CLI to instrukcja, która wyłącza przerwania w architekturze x86 ). Balsa, jako członek listy mailingowej jądra Linuksa , potwierdził, że następujący program w C (który używa wbudowanego języka asemblera specyficznego dla x86 ) może zostać skompilowany i uruchomiony przez nieuprzywilejowanego użytkownika:

       
 

   
  
  
  
  
  
 bez  znaku  c  [  4  ]  =  {  0x36  ,  0x78  ,  0x38  ,  0x36  };  int  main  ()  {  asm  (  " movl $c, %ebx  \n  "  "ponownie: xchgl (%ebx), %eax  \n  "  " movl %eax, %edx  \n  "  " jmp ponownie  \n  "  );  } 

Wykonanie tego programu czyni procesor całkowicie bezużytecznym, dopóki nie zostanie ponownie uruchomiony, ponieważ wchodzi on w nieskończoną pętlę , której nie można przerwać . Dzięki temu każdy użytkownik mający dostęp do systemu Cyrix z tym błędem może przeprowadzić atak typu „odmowa usługi” .

Jest to podobne do wykonania instrukcji Halt and Catch Fire , chociaż błąd śpiączki nie jest jedną konkretną instrukcją.

Analiza

To, co powoduje błąd, nie jest maską przerwania ani jawnym wyłączeniem przerwań. Zamiast tego anomalia w potoku instrukcji Cyrixa uniemożliwia obsługę przerwań na czas trwania pętli; ponieważ pętla nigdy się nie kończy, przerwania nigdy nie będą obsługiwane. Instrukcja xchg jest atomowa , co oznacza, że ​​inne instrukcje nie mogą zmieniać stanu systemu podczas jej wykonywania. Aby zapewnić tę atomowość, projektanci Cyrix sprawili, że xchg jest nieprzerywalny. Jednak z powodu potokowania i przewidywania rozgałęzień kolejny xchg wchodzi do potoku przed zakończeniem poprzedniego, powodując zakleszczenie .

Obejścia

Rozwiązaniem niezamierzonych przypadków błędu jest wstawienie innej instrukcji do pętli, przy czym instrukcja nop jest dobrym kandydatem. Cyrix zasugerował serializację kodu operacji xchg, omijając w ten sposób potok. Techniki te nie będą jednak służyć do zapobiegania celowym atakom.

Błędowi można również zapobiec, wyłączając niejawne blokowanie magistrali, zwykle wykonywane przez instrukcję xchg . Osiąga się to poprzez ustawienie czwartego bitu (maska ​​0x10 ) w rejestrze konfiguracyjnym CCR1 .

Zobacz też

Notatki

  1. ^ xchgl w kodzie źródłowym oznacza Exchange ( Long )

Linki zewnętrzne