Hallo Hans, Ich will mich nicht mit fremden Federn schmücken :-). In meinem Archiv liegt noch diese Email von Holger Dyroff rum (Datum 27.11.97). Ciao, Klaus 1. Der Intel Pentium "F00F"-Bug =============================== Intel-Bezeichnung: "Invalid Operand with Locked CMPXCHG8B" Erratum Es handelt sich um einen Fehler des Pentium-Prozessors selbst, ist also kein Fehler im Betriebssystem: Die Fehlerbehandlung einer legalen Anweisung mit illegalem Operanden unter Buslock-Bedingungen wird vom Prozessor nicht korrekt durchgefuehrt, der ausfuehrende Prozess wird nicht abgebrochen. Stattdessen wird der Prozessor komplett angehalten. Mit folgendem trivialen Programm kann dieses Verhalten sehr einfach demonstriert werden: ---------------------------------------- char x[5]={0xf0,0x0f,0xc7,0xc8,0x00}; main() { void(*f)() = x; (*f)(); } ---------------------------------------- Der String x[5]={} entspricht dem Maschinenbefehl "LOCK CMPXCHG8B EBX". Betroffen von diesem Fehler sind nur original Intel Pentium und Pentium MMX Prozessoren. Die neueren Prozessoren Pentium Pro, Pentium II sowie die Prozessoren anderer Hersteller (AMD, Cyrix) sind von dem Fehler nicht betroffen. Der Fehler ("F00F"-Bug) wurde nach den ersten beiden Bytes der problematischen Instruktion benannt. Der Fehler ist sehr schwerwiegend, da er es einem normalen, nicht-privilegierten Benutzer gestattet, das komplette System zum Absturz zu bringen; fuer die Ausfuehrung des problematischen Befehls sind keinerlei besondere Rechte (Superuser) noetig. Als eines der ersten Betriebssysteme verfuegt Linux ueber einen Workaround fuer diesen Prozessor-Fehler: Dabei wird ein Teil der IDT (Interrupt Descriptor Table) auf einen virtuellen Speicherbereich gelegt, der physikalisch nicht vorhanden ist. Bei Ausfuehrung der fehlerhaften Anweisung kann nun der Prozessor nicht sofort die normale Behandlungsroutine ausfuehren (durch die der Fehler zum Tragen kommen wuerde), sondern es wird ein Page Fault erzeugt, dessen Bearbeitung korrekt funktioniert. In dieser Bearbeitungsroutine kann nun der eigentliche Grund fuer die Exception ermittelt und entsprechend reagiert werden (Abbruch des betreffenden Programms durch "illegal instruction"). Mittlerweile hat sich herausgestellt, dass sogar eine noch etwas elegantere Moeglichkeit existiert, den Fehler abzufangen: Bei Eintreten der Fehler-Bedingung versucht der Prozessor, schreibend auf die IDT zuzugreifen, was im normalen Betrieb nur bei der Initialisierung geschieht. Es ist daher hinreichend, die IDT readonly zu setzen, um bei Ausfuehrung des problematischen Opcodes eine funktionierende Fehlerbehandlung zu erzwingen. Dadurch entfaellt das nachfolgende Anpassen des Instruction Pointers, was fuer das Verwenden von Debuggern essentiell ist. Die neue Version des Workarounds duerfte in die naechste Kernelversion einfliessen, da sie aeusserst einfach zu implementieren ist. 2. "Teardrop" ============= Beim sogenannten "Teardrop"-Bug handelt es sich um einen Fehler im TCP/IP Subsystem verschiedener Betriebssysteme (neben Linux sind auch Windows 95 und Windows NT betroffen), dessen Auswirkungen noch dramatischer sind als die des F00F-Bugs, da ein potentieller Angreifer nicht einmal ein Login auf dem Rechner benoetigt; schon die Tatsache, dass der Rechner mittels TCP/IP erreichbar ist (im Internet oder in einem lokalen Netz), ist hinreichend, um den Rechner zum kompletten Crash zu bringen. Der Bug besteht darin, dass eine bestimmte Fragmentierung von IP-Paketen nicht korrekt sonderbehandelt wird; als Folge ueberschreibt sich Linux bei Eintreffen geeigneter IP-Pakete fast den gesamten eigenen Speicher, was zu einem sofortigen Neu-Booten bzw. Anhalten des Systems fuehrt. Vor allem Linux-Rechner, die als Firewall oder WWW-Server im Internet eingesetzt werden, sollten daher unter allen Umstaenden mit einem korrigierten Kernel ausgestattet werden. Der eigentliche Bugfix ist ein Einzeiler und kann in jedem bestehenden Kernel "nachgeruestet" werden: ------------------------------------------------------------------------ diff -urN linux/net/ipv4/ip_fragment.c linux-teardrop/net/ipv4/ip_fragment.c --- linux/net/ipv4/ip_fragment.c Fri Nov 22 10:58:34 1996 +++ linux-teardrop/net/ipv4/ip_fragment.c Tue Nov 25 12:06:03 1997 @@ -375,7 +375,7 @@ fp = qp->fragments; while(fp != NULL) { - if(count+fp->len > skb->len) + if(fp->len < 0 || count+fp->len > skb->len) { NETDEBUG(printk("Invalid fragment list: Fragment over size.\n")); ip_free(qp); ----------------------------------------------------------------------- Neben diesen beiden Fehlern wurden im Kernel 2.0.32 eine Reihe weiterer Fehler behoben, so dass generell zu einem Upgrade auf diese Kernelversion geraten werden muss. Ihr S.u.S.E. Team!
Hans Klein <hans.klein@net-con.net> Wednesday, 25 November 1998, 14.40 >>>
Hallo, weiss jemand wie sich normalerweise der Bug F0 0F auswirkt ? Linux scheint das nicht recht viel auszumachen, aber hat die lage zumindest erkannt :-) Ich hab zwei 120er Pentiums da beide mit dem Bug !! und servus Hans K. /* <A HREF="http://www.RegiONline.net"><A HREF="http://www.RegiONline.net</A">http://www.RegiONline.net</A</A>> */ /* Infos unter: */ /* <A HREF="mailto:info@regionline.net">mailto:info@regionline.net</A> */ -- Um aus der Liste ausgetragen zu werden, eine Mail an majordomo@suse.com schicken, mit dem Text: unsubscribe suse-linux
participants (1)
-
debesk@bfi.avnet.com