{"id":20881,"date":"2018-06-05T12:04:25","date_gmt":"2018-06-05T10:04:25","guid":{"rendered":"https:\/\/www.teldat.com\/sin-categorizar\/20881\/agujeros-de-seguridad-en-el-hardware-de-los-procesadores\/"},"modified":"2022-12-22T17:59:02","modified_gmt":"2022-12-22T15:59:02","slug":"agujeros-de-seguridad-en-el-hardware-de-los-procesadores","status":"publish","type":"post","link":"https:\/\/www.teldat.com\/es\/blog\/agujeros-de-seguridad-en-el-hardware-de-los-procesadores\/","title":{"rendered":"Agujeros de seguridad en el hardware de los procesadores"},"content":{"rendered":"<p><img decoding=\"async\" class=\"alignleft size-medium wp-image-5130\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2022\/06\/manuelsanchezjunio2018-300x225.jpg\" alt=\"cybersecurity\" width=\"300\" height=\"225\" title=\"\">En enero de 2018 saltaba a la prensa la noticia de unos supuestos fallos de seguridad de los procesadores de Intel y ARM. Antes de describir en qu\u00e9 consisten estos agujeros de seguridad, necesitamos enumerar algunas caracter\u00edsticas comunes a los procesadores modernos que debemos conocer para entender estas debilidades .<\/p>\n<p><!--more--><br \/>\nUna de las caracter\u00edsticas que proporciona seguridad en los ordenadores actuales es el aislamiento entre los diferentes espacios de usuario y entre estos y el n\u00facleo (kernel) del Sistema Operativo (SO). Este aislamiento se consigue mediante dos mecanismos:<\/p>\n<p>El m\u00e1s b\u00e1sico es el bit de modo usuario\/supervisor del procesador (MSR [PR] en PowerPC), que se activa cuando se ejecuta el c\u00f3digo del SO, y se desactiva cuando se conmuta a un proceso de usuario.<\/p>\n<p>El otro consiste en usar espacios de memoria virtuales separados para los procesos de usuario y el SO. Un espacio virtual se divide en un conjunto de p\u00e1ginas, normalmente de 4 KB, que se mapean en p\u00e1ginas de memoria f\u00edsica a trav\u00e9s de unas tablas de traducci\u00f3n residentes en memoria (y en disco), y gestionadas por el SO, denominadas tablas de p\u00e1ginas.<\/p>\n<p>Cada entrada en la tabla mantiene la traducci\u00f3n de la direcci\u00f3n virtual en f\u00edsica, as\u00ed como los permisos de acceso: <em>read\/write, execute\/data, user\/supervisor.<\/em><\/p>\n<p>Por \u00faltimo, para soslayar la diferencia de velocidad entre la memoria principal (DDR3\/DDR4) y el n\u00facleo procesador (core), se usa una jerarqu\u00eda de cach\u00e9s. Las cach\u00e9s dividen el espacio de memoria f\u00edsico en fragmentos, denominados l\u00edneas, de tama\u00f1o fijo (32 KB en PowerPC).<\/p>\n<p>Cuando el n\u00facleo procesador necesita un dato, en primer lugar comprueba si en la cach\u00e9 L1, la m\u00e1s r\u00e1pida y pr\u00f3xima, existe una copia. En caso afirmativo, cache hit, el dato es obtenido de all\u00ed (en 3 ciclos en el caso del n\u00facleo e5500 de PowerPC). En caso negativo, cache miss, el procedimiento se repite sobre el siguiente nivel, L2 (11 ciclos en e5500), y sucesivos. Si este no se encuentra en la jerarqu\u00eda de cach\u00e9, se lee la l\u00ednea completa de la memoria principal (+40 ciclos) a la que pertenece el dato a la vez que se hace una copia en la L1, por si se necesita en un futuro pr\u00f3ximo. La copia en L1, acelerar\u00e1 enormemente el siguiente acceso a ese mismo dato, y es clave para la explicaci\u00f3n del ataque. Otras caracter\u00edsticas comunes entre los procesadores modernos son la ejecuci\u00f3n fuera de orden, la predicci\u00f3n de salto y la ejecuci\u00f3n especulativa. As\u00ed, por ejemplo, si una instrucci\u00f3n de salto depende del resultado de una operaci\u00f3n en curso, el predictor puede conjeturar el destino y dirigir la ejecuci\u00f3n por el camino m\u00e1s probable.<\/p>\n<p>Cuando finalmente est\u00e1 disponible el resultado de la operaci\u00f3n de la que depend\u00eda el destino del salto, el procesador tiene que optar por descartar los resultados intermedios, si la conjetura result\u00f3 incorrecta, restituyendo el estado de la m\u00e1quina al que ten\u00eda antes de la instrucci\u00f3n de salto, o tomarlos como v\u00e1lidos (commit) y continuar, si acert\u00f3. Se dice que las instrucciones ejecutadas antes de conocer si correspond\u00edan al flujo deseado del programa, se ejecutaron especulativamente.<\/p>\n<p>Supongamos ahora que el siguiente fragmento de c\u00f3digo C forma parte de un proceso de usuario atacante que se ejecuta con privilegios de usuario normal dentro del sistema atacado<br \/>\nstruct array {<br \/>\nunsigned long length;<br \/>\nunsigned char key[&#8230;];<br \/>\n} *ptr = {&#8230;};<br \/>\nunsigned long x = &#8230;;<br \/>\nunsigned int y;<br \/>\nunsigned int probe_array[] = {&#8230;}; \/* Matriz de 8K enteros \/*<\/p>\n<p>if (x &lt; ptr-&gt;length)<br \/>\ny = probe_array[(unsigned int)ptr-&gt;key[x] &lt;&lt; 5]; Supongamos tambi\u00e9n:<\/p>\n<p>1. Que operaciones previas han preparado el predictor de salto para estimar como m\u00e1s probable que la condici\u00f3n que comprueba el if es verdadera, por ejemplo, pasando valores de x que fuesen v\u00e1lidos.<\/p>\n<p>2. Que x es elegido maliciosamente fuera del \u00e1rea de datos accesibles por el usuario cuyo contenido se quiere obtener fraudulentamente, con ese objeto: x &gt; ptr-&gt;length<\/p>\n<p>3. Que el c\u00f3digo se ha asegurado que ptr-&gt;length y la matriz probe_array[] no est\u00e1n presentes en la cach\u00e9 y que el resto de datos que se van a leer lo est\u00e9n.<\/p>\n<p>Cuando se ejecuta la pieza de c\u00f3digo anterior, el procesador comienza comparando el valor malicioso x con ptr-&gt;length. En el momento de leer ptr-&gt;length, al no encontrarse en la cach\u00e9 y tener recuperarlo de la memoria principal, la decisi\u00f3n tendr\u00e1 una latencia de bastantes ciclos. Mientras se resuelve, el predictor de salto asume, en base al historial reciente, que el if ser\u00e1 verdadero por lo que proceder\u00e1 a calcular el offset en probe_array[] para lo que enviar\u00e1 una petici\u00f3n de lectura de ptr-&gt;key[x], que se encuentra fuera del rango de acceso permitido al proceso, al subsistema de memoria. Mientras que esta \u00faltima lectura sigue su curso, el valor de ptr-&gt;length finalmente llega desde la DRAM. El procesador se da cuenta que la ejecuci\u00f3n especulativa fue por el camino err\u00f3neo y revierte el estado de la m\u00e1quina al existente antes de la bifurcaci\u00f3n. En consecuencia, no se conserva ning\u00fan resultado intermedio y ninguna instrucci\u00f3n provoca una excepci\u00f3n (como ser\u00eda el caso al acceder fuera del rango durante el flujo normal del programa). Sin embargo, aunque el valor de probe_array[offset] no es consultable por el c\u00f3digo porque no se almacen\u00f3 en la variable y, ni en ning\u00fan registro de la arquitectura, s\u00ed queda una traza sutil en la microarquitectura de la m\u00e1quina pues existe una copia en la cach\u00e9. Y esto es precisamente lo que explota el ataque.<\/p>\n<p>\u00bfY c\u00f3mo hacer uso de que hay una copia en la cach\u00e9?.<\/p>\n<p>Pues sencillamente midiendo con precisi\u00f3n el tiempo de acceso a cada uno de los elementos de probe_array[]. Recordemos que antes de ejecutar la pieza de c\u00f3digo, el proceso atacante se hab\u00eda asegurado de que ninguno de los elementos de la matriz se encontrase en la cach\u00e9. As\u00ed pues, ahora s\u00f3lo uno de los tiempos medidos, el que corresponde al elemento en la cach\u00e9, ser\u00e1 significativamente menor que los dem\u00e1s. Y detectado el elemento, tras deshacer el c\u00e1lculo del offset, se puede obtener el valor del byte ptr-&gt;key[x] que se encontraba en una zona de memoria a la que el proceso atacante nunca debi\u00f3 tener acceso.<\/p>\n<p>Como conclusiones podemos decir que este tipo de ataque explota las caracter\u00edsticas m\u00e1s avanzadas de los procesadores m\u00e1s modernos, es independiente del sistema operativo y no depende de ninguna vulnerabilidad software.<\/p>\n<hr \/>\n<p><em><span style=\"color: #999999;\"><sup>1<\/sup> Todas las referencias a ciclos de reloj en el texto est\u00e1n referenciados a ciclos de m\u00e1quina del procesador, as\u00ed 3 ciclos @ 2.4 GHz (p5040) = 1.25ns.<\/span><\/em><br \/>\n<em> <span style=\"color: #999999;\"> <sup>2<\/sup> Iniciando la transferencia en la direcci\u00f3n donde se encuentra el dato para minimizar la espera.<\/span><\/em><br \/>\n<em> <span style=\"color: #999999;\"> <sup>3<\/sup> Esto se puede conseguir mediante instrucciones de control de la cach\u00e9 que se pueden ejecutar en modo usuario.En el PowerPC: dcbf rA, rB (data cache block flush) donde rA = 0, por ejemplo, y rB contiene la direcci\u00f3n f\u00edsica de la entrada que se desaloja de la cach\u00e9, siendo rA y rB dos cualquiera de los 32 GPRs de la arquitectura.<\/span><\/em><br \/>\n<em> <span style=\"color: #999999;\"> <sup>4<\/sup> Aunque la medida parezca sencilla, requiere de una cuidadosa serializaci\u00f3n de la rutina mediante el uso de barreras de sincronizaci\u00f3n (instrucci\u00f3n mbar en PowerPC), para que los resultados sean fiables y no se vean afectados por la capacidad de ejecuci\u00f3n fuera de orden del n\u00facleo.<\/span><\/em><br \/>\n<em> <span style=\"color: #999999;\"> <sup>5<\/sup> En uno de los art\u00edculos para consulta del post, los tiempos en un Intel Core i5 obtenidos por la rutina de medida eran unos 40 ciclos de reloj en el caso de encontrarse en cach\u00e9, y de unos 280 en el caso de estar en la memoria principal.<\/span><\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En enero de 2018 saltaba a la prensa la noticia de unos supuestos fallos de seguridad de los procesadores de Intel y ARM. Antes de describir en qu\u00e9 consisten estos agujeros de seguridad, necesitamos enumerar algunas caracter\u00edsticas comunes a los procesadores modernos que debemos conocer para entender estas debilidades .<\/p>\n","protected":false},"author":143,"featured_media":19302,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[1159],"tags":[],"class_list":["post-20881","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-soluciones-seguridad-online-ciberseguridad"],"acf":[],"wpml_current_locale":"es_ES","wpml_translations":[{"locale":"en_US","id":19294,"slug":"security-failures-security-holes-in-modern-process-hardware","post_title":"Security holes in modern processor hardware","href":"https:\/\/www.teldat.com\/security-failures-security-holes-in-modern-process-hardware\/"}],"_links":{"self":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/posts\/20881","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/users\/143"}],"replies":[{"embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/comments?post=20881"}],"version-history":[{"count":0,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/posts\/20881\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/media\/19302"}],"wp:attachment":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/media?parent=20881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/categories?post=20881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/tags?post=20881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}