Como um bug de driver gráfico no Samsung Galaxy S6 vazou dados da guia do Google Chrome

Você já se perguntou como as vulnerabilidades de segurança são encontradas? A empresa GraphicsFuzz, sediada no Reino Unido, explica como eles encontraram um bug de driver gráfico no Samsung Galaxy S6 que eles poderiam explorar para ver dados de guias abertas no Google Chrome.

No final de março, uma empresa iniciante com sede no Reino Unido, especializada em testar a confiabilidade de GPU, nos abordou com um Bug de GPU que eles descobriram que causa o Qualcomm Snapdragon 845Samsung Galaxy S9/S9+ para reiniciar ao visitar uma página da web. A empresa, chamada GráficosFuzz, trabalhou conosco para relatar o problema para Qualcomm e Samsung. Alguns de nossos leitores estavam interessados ​​em saber como uma empresa como GráficosFuzz é capaz de encontrar essas vulnerabilidades, então colaboramos com a empresa para mostrar como eles descobriram uma vulnerabilidade de GPU mais antiga. Esta vulnerabilidade já corrigida permitiu que um invasor "espionasse" remotamente o conteúdo de Google Chrome guias do navegador na Galáxia S6.

Este usuário estava visualizando o site do seu banco antes de visitar a página maliciosa. O conteúdo foi capturado e enviado para um servidor remoto. Fonte: GráficosFuzz.

Como o GraphicsFuzz encontra bugs de GPU

Um driver gráfico funciona pegando um programa de shader e enviando-o para a GPU para ser executado e assim renderizar a imagem. Antes de enviar o shader para a GPU, o driver gráfico o traduz em um formato que a GPU possa entender; uma tradução defeituosa pode levar a falhas de renderização, travamentos de programas ou dispositivos, imagens erradas e até mesmo problemas de segurança. GráficosFuzz tem um conjunto de testes automatizados que lhes permite encontrar esses bugs com base em um conjunto de shaders de referência. Quando um usuário executa seu teste, todas as imagens resultantes devem ter a mesma aparência. Qualquer imagem que pareça diferente significa que houve um bug.

Resultados de vários dispositivos populares executando o conjunto de testes GraphicsFuzz. O Samsung Galaxy S6, Samsung Galaxy S7 e Samsung Galaxy S8 estão incluídos nesses gráficos. Fonte: GráficosFuzz.

Para o Samsung Galaxy S6, GráficosFuzz descobriu que as imagens em uma das linhas mostravam imagens que deveriam estar em outra tabela. Isso significa que imagens de testes anteriores vazaram para testes posteriores. A equipe então executou novamente o conjunto de testes no Google Chrome e descobriu que partes da página da web apareciam na imagem. Além disso, eles descobriram que abrir outra aba fazia com que a imagem mostrasse partes de outras abas. Essencialmente, esse bug permitiu que uma guia do Google Chrome vazasse informações sobre outra guia do Chrome! A equipe por trás GráficosFuzz não estavam procurando intencionalmente por bugs de segurança, mas acabaram encontrando um como resultado de seus testes. (Deve-se notar que a equipe reproduziu o bug no navegador padrão da Samsung no Galaxy S6, bem como Mozilla Firefox.)

Como funciona o bug

Imagem usada para acionar o bug de longa duração no Samsung Galaxy S6. Fonte: GráficosFuzz.

A página web "malicioso" criada por GráficosFuzz usa WebGL para tentar desenhar uma cena espacial dentro de uma tela como mostrado acima. A cor de cada pixel é determinada por um fragment shader, um programa fornecido pela página web para ser executado na GPU. O GráficosFuzz framework modificou o fragment shader, o que fez com que ele funcionasse por muito tempo. Quando um sombreador é executado por muito tempo, o navegador ou sistema operacional normalmente aborta a renderização. No entanto, embora a GPU tenha cancelado a renderização após desenhar alguns pixels, o driver da GPU não relatou isso ao Google Chrome. (Se você der uma olhada na imagem no topo do artigo que mostra memória de vídeo lixo, você pode realmente ver partes da cena espacial no topo esquerda.) Isso significa que os pixels que foram renderizados antes da interrupção permanecem intactos, o que significa que a imagem final renderizada é, em sua maioria, lixo de vídeo memória. Como a memória de vídeo é continuamente usada para renderizar outras páginas da web, os dados "lixo" na verdade contêm renderizações anteriores de outras páginas da web. Assim, outras páginas web acabam sendo exibidas na página “malicioso”. Crucialmente, o WebGL permite que a página web capture o conteúdo de tudo o que está sendo renderizado; esta imagem é então carregada em um servidor remoto.

Diagrama explicando o bug de longa duração da GPU que causa o "vazamento" dos dados da guia do Chrome. Fonte: GráficosFuzz.

O Google Chrome usa vários processos, de modo que diferentes guias são frequentemente isoladas, o que faz com que essa exploração pareça impossível à primeira vista. No entanto, o Chrome interage com a GPU usando um único “processo GPU”, o que significa que todas as guias compartilham a mesma memória GPU, permitindo assim que esta exploração funcione. O diagrama acima mostra isso com mais detalhes.

O bug é demonstrado neste vídeo durante os primeiros 22 segundos. Outros problemas de segurança encontrados pelo GraphicsFuzz também são demonstrados.

Lições a serem aprendidas

Uma GPU com comportamento incorreto pode ignorar todas as medidas de segurança do Google Chrome e do Android, já que o WebGL permite que qualquer página da web mal-intencionada envie código à GPU para execução. O Google não consegue corrigir bugs de GPU já que a empresa não controla o hardware e os drivers. Nesse caso, cabe ao fornecedor da GPU (neste caso, ARM) corrigir o bug e ao OEM cujos dispositivos são afetados (neste caso, Samsung) integrar a correção em uma atualização. Adicione operadoras à mistura e é fácil ver como um bug como esse pode levar muito tempo para ser corrigido - demorou pelo menos 5 meses para a maioria dos usuários do Samsung Galaxy S6 receberem o patch.

GráficosFuzz ajuda os fornecedores de GPU a encontrar bugs difíceis de detectar, como bugs de compilação incorreta que fazem com que o código errado seja gerado e executado na GPU. Sua estrutura de testes automatizados permite encontrar bugs como o apresentado neste artigo. O loop de longa duração causado pela página da web "malicioso" também demonstrou causar problemas em outros dispositivos, como o HTC Um M7 e mais recentemente o Samsung Galaxy S9. GráficosFuzz testa smartphones emblemáticos e publica um tabela de resultados que classifica esses dispositivos com base em seu desempenho em um subconjunto de testes. Centenas de falhas e erros de renderização foram encontrados durante seus testes, mas a maioria não é investigada para ver se representam uma ameaça à segurança. No entanto, como mostra esta exploração, uma GPU com mau comportamento é um risco de segurança e é possível que uma ou mais vulnerabilidades críticas de segurança estejam aguardando para serem descobertas. GráficosFuzz espera que os fornecedores de GPU priorizem a melhoria da qualidade do driver no futuro.

Confiabilidade comparativa dos drivers gráficos, classificados pelo número total de problemas. Fonte: GráficosFuzz.

Cronograma de divulgação

  • Em dezembro de 2016, GráficosFuzz relatou o bug ao Rastreador de bugs do Google Chromium porque era elegível para o Programa de recompensas do Chrome. Depois que GraphicsFuzz enviou o bug ao rastreador de bugs do Google Chromium, o bug foi aceito pelo Google e encaminhado para ARM e Samsung para correção.
  • Google encaminhou o relatório para contatos na ARM e Samsung.
  • A Samsung corrigiu silenciosamente o bug e lançou a correção na atualização do Android 7.0 Nougat lançada entre março e junho de 2017. Embora não tenha havido nenhum CVE criado pela Samsung, Google ou ARM e nem a Samsung nem a ARM divulgaram qualquer informação sobre o patch, observe que GráficosFuzz não relatou o bug através do processo adequado.
  • Mais tarde, GráficosFuzz conseguiu confirmar que tanto a Samsung quanto a ARM viram o relatório e que a ARM conseguiu corrigir o problema devido ao relatório.
  • Em agosto de 2017, GráficosFuzz foi recompensado com US$ 2.000 do Google pelo relatório do bug.
  • Em novembro de 2017, o relatório do bug foi tornado público.