# Shatter attack

Em computação, um shatter attack é uma técnica de programação empregadas em sistemas operacionais Windows para subverter restrições de segurança entre processos em uma sessão. Um shatter attack tira proveito de uma falha de design no sistema de passagem de mensagem do Windows, onde um código arbitrário pode ser injetado em qualquer outro aplicativo ou serviço na mesma sessão que faz uso de um loop de mensagem. Tal ataque pode resultar em uma escalação de privilégios.

## Visão geral

Os Shatter attacks tornaram-se um tema de intenso debate na comunidade de segurança da informação em agosto de 2002, após a publicação de Chris Paget estudo intitulada "Exploiting design flaws in the Win32 API for privilege escalation". O artigo, que cunhou o termo "Shatter attack", explica o processo pelo qual um aplicativo pode executar código arbitrário no outro aplicativo. Isso é possível porque o Windows permite que aplicativos menos privilegiados enviem mensagens para message loops de aplicativos mais privilegiados - e algumas mensagens podem conter como parâmetro o endereço de uma função de retorno (callback). Caso um atacante consiga colocar uma string sua (um shellcode, por exemplo) na memória do aplicativo mais privilegiado em um endereço conhecido, ele poderia então enviar mensagens WM_TIMER com os parâmetros da função de retorno apontando para sua string.
Algumas semanas após a publicação do presente documento, a Microsoft respondeu, pontuado o seguinte: "O artigo está correto, esse comportamento existe e ele descreve corretamente seu efeito. ... Onde o artigo erra é em afirmar que esta é uma falha no Windows. Na realidade, a falha reside no específico serviço mais privilegiado. Por predefinição, todos os serviços dentro do ambiente de trabalho interativo são pares e podem enviar solicitações uns aos outros. Como resultado, todos os serviços no ambiente de trabalho interativo compartilham do mesmo nível de privilégio do serviço mais privilegiado."

## Soluções

Em dezembro de 2002, a Microsoft lançou um patch para o Windows NT 4.0, Windows 2000 e Windows XP que fechou algumas vias de exploração. Esta foi apenas uma solução parcial, no entanto, como a correção foi limitada aos serviços do Windows que podiam ser explorados usando esta técnica; a subjacente falha de design ainda existia e poderia ser usada para atacar aplicações ou serviços de terceiros. Com o Windows Vista, a Microsoft buscou resolver o problema de duas maneiras: primeiro, os usuários locais não mais logam em session 0, separando assim o message loop de um usuário logado dos servicos privilegiados que são carregados em session 0. Segundo, um novo recurso chamado de Interface de Usuário Privilégio de Isolamento (UIPI) foi introduzido, segundo a qual os processos podem ser mais protegidos contra a Shatter attacks através da atribuição de um Nível de Integridade para cada processo. Tentativas de enviar mensagens para um processo com um maior nível de Integridade falhará, mesmo se ambos os processos pertençam ao mesmo usuário. No entanto, nem todas as interações entre processos em com diferentes níveis de Integridade são impedidos pelo UIPI.
A forma como as sessões são instanciados foi redesenhada no Windows Vista e Windows Server 2008 para fornecer proteção adicional contra os Shatter attacks. Usuário locais foram movidos de session 0 para session 1, separando assim os processos do usuário dos serviços que poderiam ser vulneráveis.
Todavia, isso cria problemas compatibilidade com versões anteriores, uma vez que alguns de softwares foram projetados com o pressuposto de que o serviço está sendo executado na mesma sessão do usuário logado. Para contemplar tal situação, os Windows Vista e Windows Server 2008 incluem um Serviço Windows chamado "Detecção de Serviços Interativos", que permite o acesso à caixas de diálogo criado por serviços interativos, quando eles aparecem.

## Veja também

* Interface De Usuário Privilégio De Isolamento
* Obrigatório Controle Da Integridade
* Princípio do menor privilégio
* Recurso de segurança baseado em