Cómo un error del controlador de gráficos en el Samsung Galaxy S6 filtró datos de la pestaña de Google Chrome

A fines de marzo, una empresa de nueva creación con sede en el Reino Unido que se especializa en probar la confiabilidad de la GPU se nos acercó con un error de GPU que descubrieron que hace que el Qualcomm Snapdragon 845 Samsung Galaxy S9 / S9 + se reinicie al visitar una página web. La empresa, llamada GraphicsFuzz, trabajó con nosotros para informar el problema a Qualcomm y Samsung. Algunos de nuestros lectores estaban interesados ​​en saber cómo una empresa como GraphicsFuzz es capaz de encontrar estas vulnerabilidades, por lo que colaboramos con la empresa para mostrar cómo descubrieron una vulnerabilidad de GPU más antigua. Esta vulnerabilidad ya parcheada permitió a un atacante "espiar" de forma remota el contenido de las pestañas del navegador Google Chrome en el Samsung Galaxy S6.

Este usuario estaba viendo el sitio web de su banco antes de visitar la página web maliciosa. Los contenidos fueron capturados y subidos a un servidor remoto. Fuente: GraphicsFuzz.

Cómo GraphicsFuzz encuentra errores de GPU

Un controlador de gráficos funciona tomando un programa de sombreado y enviándolo a la GPU para que se ejecute y, por lo tanto, renderice la imagen. Antes de enviar el sombreador a la GPU, el controlador de gráficos lo traduce a una forma que la GPU puede entender; una traducción defectuosa puede provocar fallas en el renderizado, fallas del programa o del dispositivo, imágenes incorrectas e incluso problemas de seguridad. GraphicsFuzz tiene un conjunto de pruebas automatizadas que les permite encontrar estos errores basados ​​en un conjunto de sombreadores de referencia. Cuando un usuario ejecuta su prueba, se supone que todas las imágenes resultantes tienen el mismo aspecto. Cualquier imagen que se vea diferente significa que hubo un error.

Resultados de varios dispositivos populares que ejecutan el conjunto de pruebas GraphicsFuzz. El Samsung Galaxy S6, Samsung Galaxy S7 y Samsung Galaxy S8 se incluyen en estos cuadros. Fuente: GraphicsFuzz.

Para el Samsung Galaxy S6, GraphicsFuzz descubrió que las imágenes en una de las filas mostraban imágenes que se suponía que estaban en otra tabla. Esto significa que las imágenes de pruebas anteriores se filtraron en pruebas posteriores. Luego, el equipo volvió a ejecutar el conjunto de pruebas en Google Chrome y descubrió que partes de la página web aparecían en la imagen. Además, descubrieron que al abrir otra pestaña, la imagen mostraba partes de otras pestañas. ¡Esencialmente, este error permitió que una pestaña de Google Chrome filtrara información sobre otra pestaña de Chrome! El equipo detrás de GraphicsFuzz no estaba buscando intencionalmente errores de seguridad, pero terminaron encontrando uno como resultado de sus pruebas. (Cabe señalar que el equipo reprodujo el error en el navegador Samsung de serie en el Galaxy S6, así como en Mozilla Firefox).

Cómo funciona el error

Imagen utilizada para activar el error de larga duración en el Samsung Galaxy S6. Fuente: GraphicsFuzz.

La página web "maliciosa" creada por GraphicsFuzz usa WebGL para intentar dibujar una escena espacial dentro de un lienzo como se muestra arriba. El color de cada píxel está determinado por un sombreador de fragmentos, un programa proporcionado por la página web para ejecutarse en la GPU. El marco GraphicsFuzz modificó el sombreador de fragmentos que lo hizo funcionar durante mucho tiempo. Cuando un sombreador se ejecuta durante demasiado tiempo, el navegador o el sistema operativo generalmente abortan el renderizado. Sin embargo, si bien la GPU canceló el renderizado después de dibujar algunos píxeles, el controlador de la GPU no informó esto a Google Chrome. (Si observa la imagen en la parte superior del artículo que muestra la memoria de video basura, en realidad puede ver partes de la escena espacial en la parte superior izquierda). Esto significa que los píxeles que se renderizaron antes del aborto quedan intactos, lo que significa que la imagen renderizada final es principalmente memoria de video basura. Dado que la memoria de video se usa continuamente para representar otras páginas web, los datos "basura" en realidad contienen representaciones previas de otras páginas web. Por lo tanto, otras páginas web terminan siendo mostradas en la página web "maliciosa". De manera crucial, WebGL permite que la página web capture el contenido de lo que se está representando; Esta imagen se carga en un servidor remoto.

Diagrama que explica el error de GPU de larga duración que causa que los datos de la pestaña de Chrome se "filtren". Fuente: GraphicsFuzz.

Google Chrome utiliza múltiples procesos, por lo que a menudo se aíslan diferentes pestañas, lo que hace que esta vulnerabilidad parezca imposible en la superficie. Sin embargo, Chrome interactúa con la GPU utilizando un solo "proceso de GPU", lo que significa que todas las pestañas comparten la misma memoria de GPU, lo que permite que esta vulnerabilidad funcione. El diagrama anterior muestra esto con más detalle.

El error se demuestra en este video durante los primeros 22 segundos. También se demuestran otros problemas de seguridad encontrados por GraphicsFuzz.

Lecciones para aprender

Una GPU que se porta mal puede pasar por alto todas las medidas de seguridad de Google Chrome y Android, ya que WebGL permite que cualquier página web maliciosa envíe código a la GPU para su ejecución. Google no puede corregir los errores de la GPU ya que la compañía no controla el hardware y los controladores. En este caso, depende del proveedor de la GPU (en este caso, ARM) corregir el error y el OEM cuyos dispositivos se ven afectados (en este caso, Samsung) integrar la solución en una actualización. Agregue operadores a la mezcla y es fácil ver cómo un error como este puede tardar mucho tiempo en solucionarse: la mayoría de los usuarios de Samsung Galaxy S6 tardaron al menos 5 meses en recibir el parche.

GraphicsFuzz ayuda a los proveedores de GPU a encontrar errores difíciles de detectar, como errores de compilación incorrecta que hacen que se genere y ejecute un código incorrecto en la GPU. Su marco de prueba automatizado les permite encontrar errores como el que se muestra en este artículo. También se ha demostrado que el ciclo de larga duración causado por la página web "maliciosa" causa problemas en otros dispositivos como el HTC One M7 y más recientemente el Samsung Galaxy S9. GraphicsFuzz prueba los teléfonos inteligentes emblemáticos y publica una tabla de resultados que clasifica estos dispositivos en función de su rendimiento en un subconjunto de sus pruebas. Se han encontrado cientos de bloqueos y errores de representación durante sus pruebas, pero la mayoría no se investigan para ver si representan una amenaza para la seguridad. Sin embargo, como lo muestra este exploit, una GPU que se porta mal es un riesgo de seguridad, y es posible que una o más vulnerabilidades de seguridad críticas estén esperando ser descubiertas. GraphicsFuzz espera que los proveedores de GPU prioricen la mejora de la calidad del controlador en el futuro.

Confiabilidad comparativa de los controladores de gráficos, ordenados por el número total de problemas. Fuente: GraphicsFuzz.

Cronología de divulgación

  • En diciembre de 2016, GraphicsFuzz informó el error al rastreador de errores de Google Chromium porque era elegible para el Programa de recompensa de Chrome. Después de que GraphicsFuzz envió el error al rastreador de errores de Google Chromium, Google aceptó el error y lo envió a ARM y Samsung para su revisión.
  • Google reenvió el informe a los contactos de ARM y Samsung.
  • Samsung silenciosamente parchó el error y lanzó la solución en la actualización de Android 7.0 Nougat que se lanzó entre marzo y junio de 2017. Aunque no hubo CVE creado por Samsung, Google o ARM y ni Samsung ni ARM lanzaron ninguna información sobre el parche, tenga en cuenta que GraphicsFuzz no informó el error a través del proceso adecuado.
  • Más tarde, GraphicsFuzz pudo confirmar que tanto Samsung como ARM habían visto el informe, y que ARM pudo solucionar el problema debido al informe.
  • En agosto de 2017, GraphicsFuzz recibió $ 2, 000 de Google por el informe de error.
  • En noviembre de 2017, el informe de error se hizo público.