-[ 0x06 ]-------------------------------------------------------------------- -[ Microcodigo]-------------------------------------------------------------- -[ by nomellames ]----------------------------------------------------SET-26- La actualizacion del Microcodigo en chips Intel 0. Disclaimer Esto solo es educativo. Las actualizaciones del microcodico estan bajo el copyright de Intel, y no deben ser usadas bajo ningun otro proposito que para que el que fueron creadas, es decidir, modificaciones legitimas del microcodigo. Yo no he modificado el microcodigo, y en ningun caso he infringido el copyright. 1. Introduccion A pesar de que mi especialidad es wardriving, mi primer articulo es sobre la actualizacion del microcodigo en maquinas Intel (Intel microcode updates). Y asi mis queridas amigas (espero que me lean solo chicas, y solteras. Mi direccion esta mas abajo) os preguntareis que tiene que ver esto con la seguridad informatica, y como vas a conseguir hackear con esto la cuenta de hotmail de tu novia(o). Pues el caso es que el susodicho microcodigo esta encriptado, con lo cual solo Intel puede actualizar el microcodigo. En el caso de que alguien consiguiera desencriptar el microcodigo, podriamos meter nuestro propio microcodigo en el chip. Supongo.... Para que ? Con que objetivo ? Pues como en muchas ocasiones por pura diversion, ....con que derecho Intel nos esconde algo ?. Tambien tenemos otros motivos, Si Intel quiere esconder algo, ... sera por algo ? Tal vez la respuesta es simplemente que los chicos de Intel se aburren y hacen estas cosas por puro deporte y ganas de hacer trabajar las neuronas, pero dudamos de que esto sea cierto, por tanto tiene que existir una razon,....razonable. Como podreis comprobar, este es el tipico articulo-provocador que con tanto frecuencia y escaso exito se empenyan en publicar los alegres chicos de SET y sus secuaces. Queremos comprobar si hay alguien interesado y con tiempo libre para estudiar el problema. Pero a ver, demos un poco de informacion,... 1.1 que es eso del microcodigo? El microcodigo que inyectas en el chip sirve para actualizar las microinstrucciones. Me explico: En el mundo de la arquitectura de ordenadores hay dos corrientes, una arquitectura RISC, y otra la arquitectura CISC. La arquitectura RISC consta de instrucciones simples, mientras que en CISC las intrucciones son mas complejas. En CISC dirias al ordenador : "Hackea la cuenta de mi abuela y mi tia". En RISC dirias al ordenador: "Hackea. La cuenta. mi abuela. Hackea. La cuenta. Mi tia" RISC es usado por arquitecturas como ARM y Sparc. CISC es usado por x86 ( o sea, el PC de tu casa). Cual es mejor...bueno, eso es otra historia. El caso es que de alguna manera, en los x86, esas "Instrucciones largas" han de ser mapeadas a instrucciones mas pequenyas que el ordenador pueda entender. Las actualizaciones del microcodigo cambia ese mapeo, o las microinstrucciones finales, no estoy seguro. Con ello, Intel se ahorra dinero cuando hay un bug, llamado en nomenclatura Intel "Errata". Y son muchos Bugs. Sino, haced un search sobre "processor Specification Update" en la pagina de Intel. Un caso clasico fue el bug de la coma flotante en el primer Pentium, que puede ser resuelto con los microcodigos (Usare microcodigo solo a partir de ahora en vez de actualizacion del m...porque me canso). El microcodigo esta explicado en el capitulo 8, seccion 10 de IA-32 Intel Architecture Software developers manual Volume 3: Systems programming guide. Lo podeis bajar de la pagina de Intel. Esta compuesto por 2048 bytes of data, 48 bytes componen la cabecera, y los restantes 2000 son el verdadero microcodigo. Los microcodigos estan encriptados, o al menos "firmados" digitalmente. Si intentas meter un microcodigo a tu ordenador que ha sido retocado, el procesador lo rechazara. Aun mas, si el microcodigo no pertence a el chip especificado al cual esta destinado, el chip tambien rechazara el microcodigo. 2. Como puedo meter un nuevo microcodigo en mi ordenador? Normalmente la BIOS se encarga de eso. Tambien hay una utilidad por ahi que permite instalar el microcodigo desde windows usando unos ficheros que INTEL pone a disposicion de los usuarios gratuitamente,....cosa logica ya que asi nosotros nos encargamos de hacer el trabajo que ellos debieran haber hecho. Os imaginais una revision de todos los chips defectuosos tipo automovil ? No, no sonyeis, esto en el mundo de los procesadores nunca va a pasar. No se. A mi Windows no me gusta. lo siento. O sea que se poco del tema. Afortunadamente, Linux me gusta, y en Linux si puedes actualizar el microcodigo de forma facil y sencilla. Como? Si tienes un Kernel 2.4.X, al instalar el kernel puedes seleccionar la opcion de usar microcodigos. Creo que en RedHat esta seleccionado por defecto. En tu distribucion de linux, haz make menuconfig y seleccionatodos todos los /dev/cpu que veas. Luego tienes que coger el fichero ASCII con todos los microcodigos eso lo puedes recoger de: http://www.urbanmyth.org/microcode/ Los ficheros contienen todos los microcodigos, ademas de un controlador para el driver. Leeros el help del controlador para ver como funciona 3- Pero como funciona el driver? Es bastante simple. Os pongo el pseudocodigo, y luego explico las intrucciones Mira la cabecera Si no es el codigo para este chip o el checksum es incorrecto Salta al siguiente microcodigo del fichero Si es entonces Imicializa los registros para llamar a WRMSR EAX contiene la direccion del microcodigo EDX contiene cero ECX contiene 79h Llamar WMSR (hemos actualizado el microcodigo) Inicializa los registros para llamar a WRMSR EAX contiene 0 EDX contiene cero ECX contiene 8bh Llamar WMSR (Hemos borrado lo que habia en el MSR 8bh) Inicializar los registros para llamar a CPUID EAX contiene 1 CPUID Inicialiar los registros para llamar RDMSR ECX contiene 8bh Llamar RDMSR A ver: Los registros MSR (Model Specific registers) son usados internamente por el procesador para diversas funciones. Estos registros estaban bastante undocumentados, hasta que fueron sacados a la luz de una forma un tanto rocambolesca que no voy a explicar aqui, pero que podeis buscar en la web (google: MSR and appendix H). O sea que al final Intel se vio forzado a documentarlos. Yo de vosotros echaria una vistazo al tema. Los MSR pueden ser leidos y escritos usando RDMSR y WRMSR. Una lista completa de los MSR puede ser encontrada en http://chip.ms.mff.cuni.cz/~pcguts/cpu/msr.txt O sea que lo que hacemos es escribir en el MSR 79h, que es donde hacemos la modificacion del microcodigo. Luego reseteamos otro registro, el 8bh y llamamos a CPUID. CPUID es una instruccion que nos ayuda a conocer nuestro amigo el procesador. Nos devuelve diversas cosas, entre ellas que familia.tipo/stepping de procesador tienes. Facilmente lo podreis encontrar en http://microcodes.sourceforge.net/CPUID.htm Pero ademas, si le pasamos las intrucciones adecuadas, CPUID nos escupira el microcodigo que lleva dentro en 8bh. Si el codigo en 8bh es el mismo que has metido en 79h, felicidades! tienes un nuevo microcodigo. En /var/log/messages o usando la instruccion dmesg|tail 10 aparecera el nuevo microcodigo, si es correcto, como explico mas abajo. 4- Mi aportacion Bueno, pues para ver si el microcodigo estaba realmente encriptado, he modificado el driver para que no mire la cabecera, es decir, lo de Si no es el codigo para este chip o el checksum es incorrecto Salta al siguiente microcodigo del fichero Me lo como. EL bicho metera lo que sea. Desafortunadamente, a nivel de chip el microcodigo es rechazado si: 1-No es el indicado para la familia/stepping 2-Ha sido modificado O sea, que definitivamente hay un mecanismo de seguridad dentro del chip. La gente rumorea que este mecanismo debe ser sencillo, o sino necesitariamos un numero elevado de puertas que seria prohibitivo. He analizado un pelin los microcodigos y los que van destinados a -Celeron los 2000 bytes son diferentes para todo los microcodigos. -Pentium Pro los 1136 bytes son basura, puedes modificarlos y el microcodigo entrara igual, la parte final es igual para todos los microcodigos -Pentium II y III los ultioms 1056 bytes son basura. Puedes modificarlos y el microcodigo entrara igual, la parte final es igual para todos los microcodigos Los nuevos drivers e instrucciones de como meterlos lo podeis encontrar en: http://microcodes.sourceforge.net Ademas he modificado en controlador, o sea que podeis enviar el microcodigo que deseis, no el que intel os manda. Si quereis envia pura mierda, para probar, usando mi controlador ejecutad: dd if=/dev/urandom of=/dev/cpu/microcode bs=2048 count=1 Si teneis el driver de Tigran Aviazan, aparecera un "No microcode found!" Sino aparecera algo asi como "microcode updates" pero el microcodigo sera el mismo que el anterior, es decir, que el driver lo ha pasado pero el chip no ha tragado. 5- TODO Analisis criptografico de los microcodigos, ataque de fuerza bruta (tratar de meter un numero elevado de microcodigos "forjados" Dormir Bueno, esto ha sido un rollo importante. Cualquier duda, queja o interes a nomellames@hotmail.com Encriptado con mi llave si la informacion es importante. Por favor, no me encripteis chorradas. Mejor, no me envias mails con chorradas. A proposito, mi proximo articulo sera sobre wardribing y sera mas divertido.... La clave PGP esta en el apartado 0x0E llaves PGP. *EOF*