SET 39 Call For Papers

¿Eres un hacker? Si deseas pasar a formar parte de la historia del hacking hispano, colabora con la próxima edición de SET 39 enviándonos un artículo. No esperes más, esta es tu oportunidad de demostrar lo que sabes. Ayúdanos a construir una revista de hackers para hackers. SET Staff

Microcodigo

      2678

Autor: nomellames
-[ 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*