Processos Protegidos no Windows Vista
O paper da McAfee citado no post anterior faz um belo trabalho em descrever as técnicas usadas pelos rootkits, tanto em modo usuário e em modo kernel. Resumindo, para subverter um processo em modo usuário, os rootkits (e outros malwares) podem:
■ Injetar código usando mecanismos de extensão do Windows ou da própria aplicação, como a chave de registro AppInit_DLLs.
■ Injetar código usando o mecanismo de troca de mensagens entre aplicações, através da API SetWindowsHookEx.
■ Injetar código usando os mecanismos de debugação (API CreateRemoteThread), seja carregando uma bibioteca (LoadLibrary) ou escrevendo conteúdo diretamente no espaço de memória do processo (WriteProcessMemory).
Todos estes são recursos são usados por programas legítimos e por serviços do próprio sistema operacional, e não é nem desejável nem viável eliminá-los para que rootkits e outros tipos de malware não os usem. No entanto, para alguns tipos específicos de aplicação, pode ser desejável que estes recursos não estejam disponíveis. São aplicações não precisam ser debugadas nem estendidas de nenhuma forma, e cujo conteúdo de memória não deva poder ser visto por outros processos.
Para estas aplicações o Windows Vista introduz um novo tipo de processo, chamado de Processo Protegido (protected processes). Um processso protegido é um tipo especial de processo onde não é possível injetar uma nova thread, usar os mecanismos de debugação, inserir hooks de mensagens ou acessar o conteúdo da memória, entre outras proteções. Desta forma um processo protegido não pode ser de forma alguma subvertido por um outro processo - a única forma possível seria através do uso de um componente do kernel.
Atualmente os principal usuários dos processos protegidos são para sistemas de DRM. O processo protegido bloqueia um tipo de ataque trivial: um atacante poderia acessar indevidamente um conteúdo protegido (música, filme, documento, etc.) lendo diretamente a memória virtual do processo. Isso não é o único mecanismo de proteção de um DRM, e sim apenas uma forma de evitar ataques em modo usuário, forçando o atacante a ter que atuar em modo kernel - onde devem estar colocadas outras defesas.
Bypassando a Proteção dos Processos Protegidos
A única forma de ultrapassar a proteção colocada nos processos protegidos é através de um modo kernel. Através do kernel é possível ler o conteúdo da memória nestes processos, injetar threads, ou mesmo retirar totalmente a proteção. Uma das objeções frequentemente colocadas contra a existência de processos protegidos é a de que eles não poderiam ser verificados pelos antivirus, e portanto poderiam ser utilizados para esconder malware. Isso não procede: softwares antivirus usam drivers de kernel para ler a memória e podem tranquilamente verificar processos protegidos.
Há alguns dias Alex Ionescu anunciou com grande fanfarra ter conseguido "quebrar a segurança" dos processos protegidos. Para aumentar ao máximo a repercussão, Ionescu se recusou a descrever a técnica utilizada, e postou um utilitário que faz a quebra para o Vista 32-bits. O que ele faz no entanto não traz nenhuma novidade: rodando com privilégio de administrador, ele instala um driver de kernel que remove o indicador de processo protegido, revertendo-o para um processo normal. No shit, Sherlock! Ionescu infelizmente tem o hábito de exagerar na retórica, como fez quando propagou para a toda a Internet ter conseguido bypassar a exigência de assinatura de código no kernel do Vista x64, para depois ter que admitir que sua técnica não funcionava.
Ainda assim o seu "ataque" é valido para reforçar a real segurança fornecida pelos processos protegidos.Trata-se de uma proteção implementada em modo usuário, válida somente contra ataques em modo usuário. Não é feita e não protege contra ataques executados em modo kernel.