Hace 3 años | Por --651134-- a eejournal.com
Publicado hace 3 años por --651134-- a eejournal.com

Un ingeniero húngaro emprendedor, Can Bölük en Verilave, ha hecho algo similar, sondeando el oscuro sistema nervioso de los fabulosamente complejos microprocesadores x86 de Intel. Lo investigan en busca de códigos de operación no utilizados e indocumentados en los conjuntos de instrucciones de los chips. Y está bastante descubierto. Su código está disponible en Github. Si alguna vez ha programado un chip x86 en lenguaje ensamblador, su primer pensamiento podría ser: "No sabía que había códigos de operación sin usar".

Comentarios

l

#18 Creo que se refiere a este.

Tannhauser

#21 Sí, es muy probable.

woody_alien

#18 Sep, libro del Sr. Rosa. Si no sabes de qué va es que eres "joven" lol lol lol

Tannhauser

#51 No te creas, tuve el "Computer SpaceGames" (Daniel Isaaman y Jenny Tyler, 1982) y el "BASIC para niños".

meneandro

#18 Tiene guasa que (dos de) los libros más emblemáticos en la informática sean el del dragón y el del hombre rosa...

noexisto

#6 Yo, que no tengo npi, sí me ha descrito a modo introducirlo problemas que me han parecido Interesantísimas aunque sea a modo general
Tambien es un sub generalista
Para el que lo desconozca DDev (software)

teseo

#6 ¿Estos códigos son o pueden llegar a ser malignos?

woody_alien

#46 Los códigos no pueden ser "malignos" pues la CPU solo ejecuta cosas a muy bajo nivel y, si está procesando algo, no sabe si es una contraseña, un pedazo de JPG o un chiste de Forges.

Sin embargo una CPU sí puede ser "maligna". Como apuntaron ya hace unos años las "nuevas" CPUs son en realidad microordenadores encapsulados que simulan ser una CPU simple. Estas CPUs llevan otra CPU interna no documentada en absoluto, con su RAM, su ROM, su FLASH y su propio sistema operativo que solo conoce el fabicante. Por ejemplo una CPU de movil tipo ARM suele ofrecer, aparte de función CPU un chip gráfico, de red, radio (GSM, Blutú, etc). Todo en un solo chip. Por mucho que le pongas un Linux por encima y parezca un entorno controlado no hay manera de saber qué está haciendo la CPU por dentro y si está enviando tus datos bancarios a China mediante espacios no usados en los paquetes de datos.

teseo

#58 muchas gracias por tu respuesta

apetor

#58 Se refiere a instrucciones tipo backdoor, creo..

Kr0n0

#6 Da gusto encontrar comentarios así. Gracias

navi2000

#6 No es tan fácil. Tal y como se explica en el artículo (a nivel introductorio, claro), los x86 tienen una arquitectura externa CISC con opcodes de diferentes números de bytes y con diferentes posibles parámetros. Simplemente probar a saco en un bucle un opcode tras otro podría tomar una eternidad de tiempo y no dar resultado. En un RISC es más sencillo, pero los opcodes de tamaño variable pueden hacer explotar el número de combinaciones.

thingoldedoriath

#5 Recordemos que desde el pentium pro los procesadores x86 son RISC

Supongo que sí... aunque en unos cuantos lo más adecuado sería decir que son "RISC-like"... o que son una mezcla de RISC y CISC.

https://architecnologia.es/x86-risc-o-cisc

meneandro

#48 No son mezcla de nada. A nivel de hard, lo que se ejecutan son microinstrucciones simples. Si nos ponemos tontos, el M1 de apple (y cualquier ARM moderno) también son RISC de aquella manera porque las instrucciones también se dividen en microinstrucciones (aunque sean de características más simples que las del x86), sólo Risc-V es un RISC 100% puro (el juego de instrucciones se mantiene simple y se ejecutan directamente; Risc-V en principio está pensado para que cualquier cosa que no sea el juego básico de instrucciones vaya en aceleradores especializados).

P

#66 ARM directamente es RISC, por cualquiera definición.
#5 Y x86 no es para nada un RISC, es un CISC por que solo acepta instrucciones CISC. Y lo de que internamente es RISC, un exingeniero de Intel difiere: https://www.quora.com/Why-are-RISC-processors-considered-faster-than-CISC-processors/answer/Bob-Colwell-1?ch=10&share=85b12e6e&srid=2Qns

apetor

#68 Si, pero #66 tiene razon. Los procesadores modernos tienen un deco, y hay niveles de "RIS", un reduced instruction set puede ser reducido, pero se puede reducir mucho mas para ejecutarlo, sobre
todo si hay multiples unidades de ejecucion y si es una arquitectura Out Of Order Execution.

RiSC, hoy dia, mas que reducido, deberia entenderse como computacion con instrucciines de tamaño fijo + instrucciones con codificacion ortogonal/simetrica, sobre todo.

P

#77 «Si esas instrucciones desconocidas estuviesen contempladas en algún compilador ya no serían desconocidas, no?»
Eso supone que tienes acceso al compilador. Además de que el primer compilador de C tenía una puerta trasera, y aún con acceso al compilador la gente tardó en darse cuenta.

De acuerdo con lo del SO, hay varios proyectos que intentan conseguir compilar un sistema operativo partiendo de lo que puedas escribir a mano.

#75 «¿En qué se diferencia a nivel de ejecución de un x86 moderno [...] ¿porque tiene un conjunto de instrucciones complejas desde el punto de vista del programador»
Si. Si solo acepta CISC no importa como sea el interior, es un procesador CISC. Incluso si internamente use un RISC (aunque al exingeniero de Intel no le guste llamarlo así) el procesador es un conjunto de elementos: internamente también tiene ALU y no por eso es una calculadora.

#71 Leyendo un poco por ahí, concuerdo sobre ARM. Tienen bastantes más instrucciones de las que yo diría que necesita.

meneandro

#78 "Si solo acepta CISC no importa como sea el interior, es un procesador CISC."

No, no sólo acepta CISC. Pero para bajar y programar al nivel de microinstrucciones tienes que estar mal de la cabeza por una serie de razones*, supone un nivel de complejidad inaceptable. Todo el hecho de que a nivel de instrucciones siguan siendo CISC y por debajo RISC es por una serie de razones, más allá de la compatibilidad hacia atrás (si sólo fuera eso, hacías un RISC puro y un "copro-compatibilidad" aparte y listos. No, las instrucciones CISC (desde el punto de vista del programador) tienen sus ventajas también, a nivel de compilador poder jugar con instrucciones que te solucionan asuntos complejos (o poder tener dos rutas, una optimizada para según qué cosas y otra para otras distintas) es una ventaja clara en reducción de número de instrucciones (tamaño de código) y por lo tanto facilita también la optimización de las cachés. También es un infierno para otras cosas (la alineación en las cachés, el cálculo de tiempos de ejecución para saber qué ruta de compilado es más conveniente, etc).

Por otro lado, a nivel de programador da un poco igual porque no vas a programar en ensamblador casi nunca. Y si lo haces, tener más instrucciones y más complejas te facilita la vida, no es precisamente un handicap, por eso tiende a usarse lenguajes de más alto nivel para casi todo lo que no sea programar sistemas.

*Las microops no son estándares como las instrucciones. Cada modelo, chip y procesador específicos de cada familia pueden tener sus propias microops, programar con microops es casi hacerlo para un único modelo específico porque no hay garantías de que puedan funcionarte en otro. Y olvídate de ejecutar microcódigo intel en un amd, por ejemplo. Que poderse se puede, ojo, pero sólo para tu ordenador y equivalentes y ya sólo eso restringe muchísimo la utilidad y conveniencia de hacerlo. Es como programar usando las APIs que te da el fabricante o tirar de las propias funciones internas... mañana te cambian las funciones internas y tu programa deja de funcionar o lo hace mal, mientras que usar las APIs te blinda contra esas cosas.

P

#79 La cosa es que no se puede programar con microinstrucciones. Lo único que encuentro es cargar microinstrucciones, que ocurre al arranque y actualiza la maquinaria interna del procesador; pero no ejecuta nada.

meneandro

#80 Cuestión de buscar un poco:
https://www.usenix.org/system/files/conference/usenixsecurity17/sec17-koppe.pdf

"Our analysis focuses on the AMD K8/K10 microarchitecture since these CPUs do not use cryptographic signatures to verify the integrity and authenticity of microcode updates. Note that Intel started to cryptographically sign microcode updates in 1995 [15] and AMD started to de-ploy strong cryptographic protection in 2011 [15]. We assume that the underlying microcode update mechanism is similar, but cannot analyze the microcode updates since we cannot decrypt them.Contributions.In summary, our main contributions in this paper are as follows:•In-depth Analysis of Microcode.

We provide an in-depth overview of the opaque role of microcode in modern CPUs. In particular, we present the fundamental principles of microcode updates as deployed by vendors to patch CPU defects and errors.

•Novel RE Technique.
We introduce the first semi-automatic reverse engineering technique to disclose microcode encoding of general-purpose CPUs. Furthermore, we describe the design and implementation of our framework that allows us to perform this reverse engineering.

•Comprehensive Evaluation.
We demonstrate the efficacy of our technique on several Commercial Off-The-Shelf (COTS) AMD x86CPUarchitectures. We provide the microcode encoding format and report novel insights into AMD x86CPUinternals. Additionally, we present our hardware reverse engineering findings based on delayering actual CPUs.

•Proof-of-Concept Microprograms.
We are the first to present fully-fledged microprograms for x86CPUs. Our carefully chosen microprograms highlight benefits as well as severe consequences of unveiled microcode to real-world systems."

"7 Microprograms
In this section, we demonstrate the effectiveness of our re-verse engineering effort by presenting microprograms that successfully augment existing x86 instructions and add foreign logic. With this paper, we also publish microcode patches [42] that are compiled from scratch and run on unmodified AMD CPUs, namely K8 Sempron 3100+ andK10 Athlon II X2 260/280. We found that the microcode ROM content varies between different processors, but the macroinstruction entry points into the microcode ROM are constant. Thus we assume our microcode patches are compatible with a wider range of K8/K10-based CPUs. We discuss additional applications of microcode in Sec-tion 8"

El problema es que no están documentadas y la ingeniería inversa vale para un modelo o unos pocos, el esfuerzo puede tranquilamente no valer la pena salvo para conseguir conocimiento, aparte de otras trabas (parece que, según el documento, todos los procesadores más modernos encriptan para dificultar aún más la labor).

meneandro

#81 Por otro lado, parece que lo que se puede es "reescribir" una instrucción con un microprograma nuevo y no crear instrucciones nuevas (los códigos de instrucción serán los que son, fijados de alguna manera en rom o vaya usted a saber). Igualmente, se pueden definir y ejecutar microprogramas de esta manera (no es lo mismo que prescindir de las instrucciones e ir a pelo con microinstrucciones, salvo que yo haya entendido mal, pero salvo que encuentren algún hack específico para hacerlo, es lo más cerca que se puede estar de eso).

apetor

#68 ARM, de hecho, tiene su pequeño cancer legacy, no muy RISC, el Thumb mode...

meneandro

#68 Te estoy diciendo que tienen instrucciones que se decodifican en microinstrucciones. Lo que se ejecutan son las microinstrucciones (si que hay muchas diferencias de ahí para arriba, entre cómo se despachan y tratan dichas microinstrucciones a partir de las instrucciones, empezando porque en los x86 las instrucciones tienen tamaños variables y eso complica las cosas). ¿En qué se diferencia a nivel de ejecución de un x86 moderno, cuando ambos ejecutan microinstrucciones? ¿porque tiene un conjunto de instrucciones complejas desde el punto de vista del programador, cuando bajo las tripas son iguales?

apetor

#5 Hace meses que no lo toco pero tengo un "proyectillo" personal para hacer una especie de SoftICE ( los que conozcais esto si que soys viejunos y/o muy metidos en el tema x86 ), un depurador de systema para UEFI y NT... el caso es que cuando salieron los parches de windows para meltdown y spectre, que estaba con ello bastante metido, probando y depurando la entrada y salida de syscalls en el kernel de NT con el depurador, vi unos MSR ( Model Specific Registers ) que no me sonaban nada ( 0x00000DB2 y alguna otra, creo recordar... y, sinceramente, no es por ir de guay, es algo que me llamo la atencion y me hizo buscarlas ) y no encontre informacion sobre ellas. Creo, no estoy seguro, que estas MSRs o bien existian pa controlar cosas indocumentadas o bien se introdujeron mediante microcode updates.

Tambien vi cosas bastante raras en el codigo, como usar RSP ( el registro de puntero de pila ) como registro de proposito general ( !!! ) en un pequeño tramo del codigo. Intuyo por que hicieron esto pero no estoy seguro... podria ser mera optimizacion, pero seria un poco jarto... no se.

Pues bien, no es solo instrucciones, el binomio microsoftintel ( y supongo que AMD tambien, aunque en este caso AMD no fue tan vulnerable ) lleva tiempo haciendo cosas de estas.

Muestra de lo que hablo para los que sepan de arquitectura x86(-64):





Lo que digo de la dicotomia de direccionamiento ( CR3 ) entre kernel y usuario, es cosa aparte, esto es la solucion que se hizo para meltdown, que... en fin , pero bueno, cosas bastante esotericas se introdujeron en esos parches.

meneandro

#70 Te confirmo que hubo muchas actualizaciones de microcódigos para intentar paliar las vulnerabilidades o al menos adaptar las instrucciones para poder controlar mejor las vulnerabilidades a través de software a más alto nivel.

También te confirmo que inicialmente las soluciones que se tomaron para evitar o paliar las vulnerabilidades provocaban un bajón de rendimiento más que notable, mientras que ahora entre unas cosas y otras el impacto es mucho menor (aunque siguen saliendo formas de aprovechar las vulnerabilidades y se sigue trabajando en formas de evitar el impacto que introducen)

apetor

#74 Si, ya vi benchmarks y demas

gonas

#2 Analizando los ejecutables, se puede saber fácilmente si se usan o no.

avalancha971

#2 A mi lo que me sorprendería es que no existiesen dichas instrucciones.

i

#2 Para que alguien use esas instrucciones tendría que introducir un programa que las contuviese, y eso implicaría tener acceso a la máquina. Y una vez se tiene acceso a la máquina, lo de menos es las instrucciones que usen...

pkreuzt

#23 No se donde has estado metido estos últimos años, pero la cosa esta no sería muy diferente de atacar una máquina vía Meltdown o Spectre. Hay PoC de exploits para esas vulnerabilidades en Javascript, lo que significa que sería suficiente con visitar una web trampa.

i

#25 Mis conocimientos no son profundos pero para que fuese como tú dices, y siendo el Javascript un lenguaje interpretado, sería el motor de ejecución (instalado en tu máquina) el que tendría que contener esas instrucciones especiales, ¿no?

Hasta donde yo sé, en un JavaScript no hay código máquina.

Pero insisto en lo limitado de mis conocimientos.

pkreuzt

#37 El motor de ejecución en ese caso era el navegador. Hasta el punto de que mientras se esperaba un firmware nuevo que solventara los problemas del hardware, hubo que parchear varios navegadores. Pero el caso es que si existe esa ruta en el hardware, solo necesitas un software específico que la utilice. La parte dificil es que esas cosas no están documentadas (salvo, probablemente, para los que las pusieron ahí en primer lugar) y por tanto hay que experimentar un poco.

i

#44 Entonces me estás dando la razón. El programa que contenga esas instrucciones no documentadas tiene que estar instalado en la máquina.

pkreuzt

#53 No necesariamente. Tiene que ejecutarse en la máquina, pero como el caso del javascript no tiene que estar "instalado". De hecho lo que hicieron en los navegadores para parchearlo fué limitar la ejecución de ciertas cosas que antes si se permitían y que sin ese problema de hardware tampoco hubieran sido peligrosas.

i

#54 A ver pero Spectre o Meltdown no usan instrucciones del micro "nuevas" u "ocultas". Simplemente aprovechan fallos de diseño para que, ejecutando ciertas acciones de un modo concreto, se consiga acceso a zonas de memoria que no deberían estar accesibles.

Sin embargo, en el caso de estas instrucciones no documentadas, para que se pudiesen usar tendrían que estar en el ejecutable que tengas corriendo en tu máquina, y ese ejecutable tendría que estar hecho con un compilador que tuviese constancia de la existencia de dichas instrucciones.

Por lo tanto, es imposible que un JavaScript, que no deja de ser algo interpretado en tiempo de ejecución y no de compilación, use esas instrucciones desconocidas si el motor de ejecución (sea el navegador, sea el motor de java, o lo que sea) no fue compilado para utilizarlas.

P

#65 ¿Y como sabes que el compilador usado no incluye esas instrucciones? Un ejecutable, que crees seguro por el sistema operativo, puede estarlo evitando completamente por alguna instrucción desconocida.

i

#69 Si esas instrucciones desconocidas estuviesen contempladas en algún compilador ya no serían desconocidas, no?

Además, si alguien tiene los medios para colar sw en medio de un ejecutable del SO, ¿para qué iba a necesitar instrucciones especiales? Ya tiene la forma de colarse en tu máquina simplemente por el hecho de que confías en el suministrador del SO. No necesita instrucciones no documentadas para hacer lo que quiera.

box3d

#1
LD HL, $i_feel_you_bro
CALL print
RET

D

#3 ¿Ensamblador del Z80?

D

#7 #8 es que hacía tanto que no veía un código así... ese doble registro HL... qué viejo soy.

e

#7 ¿por qué pide ese enlace que me identifique con certificado digital? tinfoil

vitichenko

#15 para nada, siguiente siguiente ok ok palante siguiente activar notificaciones y listo, que para eso somos informáticos

e

#28 lo preguntaba en serio. La web de zilog.com me pide que me autentifique con certificado digiatl, tanto en Chrome como en Firefox. No es algo normal.

itomailg_ito

#32 Pues a mi no me ha pedido nada

I

#38 Sí lo pide, pero supongo que sólo lo notas si tienes algún certificado instalado en el navegador, que te salta la ventana para que 'elijas' el certificado.

e

#45 o si no lo tiene para que te pida permiso cada vez que "algo" quiera usar el certificado.

D

#32 eso es por tu color de piel.

vitichenko

#32 si, a mí también me lo pidió, le di a denegar y me bajo el PDF .. tampoco lo entiendo mucho y no sé si quiero entenderlo

D

#3 #8 El de la GB también al ser primo hermano. Y el 6502.

box3d

#4 #10
Z80, sí.
Premio para el meneante lol

b

#4 recuerdo haber programado el Z80 con un teclado hexadecimal. Tenía que mirar la instrucción en assembler y traducirla con una tabla donde venía en hexadecimal y en binario.

D

#19 eso mismo hice yo hace... muchos años. Aunque no sé qué quieres decir con un teclado hexadecimal; yo sólo tenía un Amstrad.

b

#27 No era con un microordenador. Era una placa de desarrollo parecida a la de la foto

P

#33 La denominación del bicho creo que era entrenador. Malditos indexados indirectos e indirectos indexados.

LDAA 07

b

#49 Sí. Escribías las instrucciones codificadas en hexadecimal, que salían por el display según las tecleabas, pero sólo aparecía lo último que escribías. Depurar era un infierno, pero molaba.

Kasterot

#1 lo aprobé de chiripa, como se me atragantó esa asignatura,.
Aprobar y olvidar en el mismo acto fue

f

#16 Es ya un arte arcano, pero solamente porque nadie quiere meterse ahí. En ciertas aplicaciones tiene mucha utilidad. Solo con assembler puedes utilizar "de verdad" la increible velocidad de un procesador.

También es cierto que te puedes acercar mucho con compiladores optimizantes. El de Ada tiene mucha fama en eso.

nomasderroches

#1 gracias por tu comentario de auto bombo sin aportar mucho.

Para el que esté interesado en instrucciones no documentadas x86, recomiendo este video

ccguy

#1 Yo me conformo con que no la hayan tumbado por irrelevante. Al menos han respetado lo que es una noticia de interés.

No sé, si yo veo una noticia "descubierto un nuevo órgano sin usar en una rana" no lo considero irrelevante aunque no tenga ni puta idea de ranas.

D

#1 sólo lo toqué en la universidad pero me gustó bastante, aunque no lo he vuelto a tocar.

Javi-_Nux

Todavia tengo pesadillas programando las torres de hanoi en ensamblador sin poder usar nop

Kirchhoff

Lo que más me gusta de meneame es co.o llegan a portadas siempre noticias para el pueblo en general...

Lord_Lurker

Mis cojones 100001

safeman

#29 O Carallo 00011101, que decimos en Galicia.

D

Millenials descubren las instrucciones indocumentadas

KimDeal

#13 hombre, pues los milenials documentan menos que las anteriores generaciones de programadores.

AubreyDG

El texto resumen traducido es tan apasionante que me leería la novela.

Indepe

Habra que ver , que parte de la reprogramacion del microcodigo sirve de puerta trasera a sus amos....

RazorCrest

Un amigo , húngaro para más señas, me dijo que nunca me fiara de un húngaro.

Manuel.G

¿Algún alma caritativa me lo explica en castellano?

editado:
Entiéndase por castellano "lenguaje para alguien que no tiene pajolera idea de informática", no como la lengua romance que hablamos en esta página.

V

#50 Intel les da a los programadores un manual con todas las ordenes, con su codigo numerico, que se le pueden dar al procesador.

Lo que el ingeniero quiere saber es si existen ordenes que Intel no ha puesto en el manual pero existen dentro del procesador así que va a probar todos los códigos numericos uno tras otro y comprobar el resultado automaticamente con un programa. Esto tiene el problema de evitar que se cuelgue por usar codigos al tun tun y saber si un codigo ha hecho algo.

Para que no se cuelgue se aprovecha que los procesadores ejecutan partes del programa por adelantado como borrador y si el programa llega a esa parte se marca como definitivo para ahorrar tiempo. Si el programa se desvia por otro lado se descarta el borrador. Ojo que aunque el borrador se descarte y se resetea el estado del procesador a como si nunca se hubiesen ejecutado, las instrucciones en realidad si pasaron por el procesador. Lo que hace es apañarselas para que las partes con los codigos de prueba siempre esten en borradores que se descartan.

Para saber si el codigo ha hecho algo se aprovecha que desde hace 20 años los codigos de orden no se ejecutan directamente. Dentro del chip no hay un i7, i5 o lo que sea. Lo que hay un emulador y un procesador parecido a los de movil pero mucho mas potente. Cada codigo que le llega al chip pasa por la capa de emulacion para traducirlo a algo que entienda ese procesador de movil interno. Gracias a que descubrio una forma de leer el numero de pasos que ha dado ese procesador interno al recibir un codigo puede adivinar con bastante precision si un codigo hace algo o no.

TL;DR Los procesadores funcionan con codigos numericos para cada tipo de comando a ejecutar. Los fabricantes dan una lista oficial de comandos. El ingeniero por curiosidad prueba con todos los numeros de forma muy ingeniosa para ver que pasa con cada uno automaticamente.

g

#50 Si alguien ve que meto la gamba decidlo pero aqui va mi intento de explicartelo. Los procesadores o CPUs tiene dentro una serie de instrucciones que llamamos de "bajo nivel" que son las que se gestionan multiples cosas como privilegios de los programas, recursos, como hablar con las otras partes del ordenador, etc.

El articulo se basa en que muchas de esas funciones no estan documentadas oficialmente o si le preguntas a Intel/AMD/ARM/Via te diran que "no existen". Como algunos ya han mencionado, no es una gran novedad, pero el hecho de que esten ahi hace que desconfies de lo que tu CPU esta haciendo. Como ejemplo, un par de casos: El modo Dios, que permite ejecutar cualquier cosa saltandote todas las medidas de seguridad de la CPU o los procesadores secundarios que permiten cambiar el microcodigo (otro conjunto de instrucciones) de forma transparente sin que nadie se entere. Y me voy a guardar el sombrerito de aluminio para otro dia

D

Posiblemente sufra un desafortunado accidente.