Análise e Exploração de Vulnerabilidades 0day no Sistema Windows da Microsoft
Recentemente, um patch de segurança lançado pela Microsoft corrigiu uma vulnerabilidade de elevação de privilégios do win32k que estava sendo explorada. Esta vulnerabilidade existe apenas em versões mais antigas do sistema Windows e não pode ser acionada no Windows 11. Este artigo analisará como os atacantes continuam a explorar essas vulnerabilidades em um contexto onde as medidas de segurança estão constantemente sendo aprimoradas.
Contexto da Vulnerabilidade
Vulnerabilidades 0day referem-se a falhas de segurança que ainda não foram divulgadas e não foram corrigidas, semelhantes ao conceito de negociação T+0 no mercado financeiro. Uma vez descobertas, essas vulnerabilidades podem ser exploradas maliciosamente sem serem detectadas, causando grandes danos.
A vulnerabilidade 0day do sistema Windows descoberta desta vez pode permitir que os atacantes obtenham controle total do sistema. Isso pode resultar em sérias consequências, como vazamento de informações pessoais, falhas do sistema, perda de dados e perdas financeiras. Do ponto de vista do Web3, isso pode levar ao roubo de chaves privadas, à transferência de ativos digitais e até mesmo afetar todo o ecossistema Web3 baseado em infraestrutura Web2.
Análise de Patch
A análise do código do patch revelou que o problema está no tratamento múltiplo da contagem de referências de objetos. Ao consultar os comentários do código-fonte anterior, pode-se perceber que o código anterior apenas bloqueava o objeto da janela, mas não bloqueava o objeto do menu dentro da janela, o que poderia levar a referências incorretas ao objeto do menu.
Reproduzindo a Vulnerabilidade
Ao analisar o contexto da função de vulnerabilidade, foi descoberto que o menu passado para xxxEnableMenuItem() geralmente já está bloqueado na função superior. Uma análise mais aprofundada revelou que o menu retornado pela função MenuItemState pode ser o menu principal da janela, ou pode ser um submenu ou um submenu de submenu.
Para explorar a vulnerabilidade, foi construída uma estrutura de menu especial de quatro camadas, com as seguintes características:
O ID do menu de nível mais baixo D deve ser do tipo menu do sistema
O menu de topo A também deve ser um menu do sistema, mas deve-se remover o tipo de menu do sistema correspondente.
Remover a referência do menu C no menu B
A presença do Menu B parece ajudar na liberação do Menu C
Ao retornar à camada do usuário em xxxRedrawTitle, remova a relação de referência dos menus C e B e libere o menu C. Assim, no ponto de retorno da função xxxEnableMenuItem, o objeto do menu C referenciado já estará inválido.
Exploração de Vulnerabilidades
A exploração de vulnerabilidades considera principalmente duas direções:
Executar código shellcode: referência a vulnerabilidades anteriores como CVE-2017-0263, mas pode enfrentar problemas de mecanismo de segurança como ponto de entrada e SMEP em versões mais recentes do Windows.
Utilizar primitivas de leitura/escrita para modificar o endereço do token: nos últimos anos, houve várias experiências públicas que podem ser consultadas, que têm a sua aplicabilidade na disposição da memória heap de desktop e nas primitivas de leitura/escrita. A chave é analisar como controlar pela primeira vez o cbwndextra para um valor extraordinário durante a reutilização de memória UAF.
Nesta utilização, adotamos a segunda opção, dividindo todo o processo em duas etapas:
Aproveitar a vulnerabilidade UAF para controlar o valor de cbwndextra
Implementar primitivas de leitura e escrita estáveis controlando cbwndextra
Primeira escrita de dados
Após a ativação da vulnerabilidade, o sistema pode usar erroneamente os dados do objeto de janela controlado em MNGetPopupFromMenu() e xxxMNUpdateShownMenu(). Utilizamos o objeto de nome de janela na classe de janela WNDClass para ocupar o objeto de menu liberado.
A chave é encontrar um local na estrutura de endereços que podemos construir onde podemos gravar dados arbitrariamente, mesmo que seja apenas um byte. No final, escolhemos a solução no xxxRedrawWindow, controlando os dados de memória do objeto anterior através do layout de memória para determinar através da bandeira do objeto na função.
Layout de memória estável
Projete pelo menos três objetos HWND de 0x250 bytes consecutivos, libere o do meio e ocupe-o com um objeto HWNDClass. Os dados da parte final do objeto HWND anterior são usados para verificação por meio da flag em xxxRedrawWindow, o objeto de menu do objeto HWND posterior e o objeto HWNDClass são usados como meio de leitura e escrita final.
Determinar com precisão se o objeto da janela solicitado está ordenado na sequência esperada através do endereço do manipulador do núcleo vazado na memória.
Ler e escrever primitivos
Utilize GetMenuBarInfo() para leitura de qualquer primitivo, e SetClassLongPtr() para escrita de qualquer primitivo. Exceto pela escrita que substitui o TOKEN, todas as outras escritas utilizam o objeto de classe do primeiro objeto da janela usando um deslocamento para escrever.
Resumo
A vulnerabilidade win32k tem uma longa história, mas a Microsoft está a tentar reestruturar o código relacionado com Rust, podendo assim eliminar este tipo de vulnerabilidades em futuros sistemas.
O processo de exploração dessa vulnerabilidade é relativamente simples, sendo o principal desafio como controlar a primeira gravação. Depende fortemente da divulgação do endereço do manipulador de pilha da área de trabalho, o que continua a ser um risco de segurança em sistemas antigos.
A descoberta da vulnerabilidade pode ter sido beneficiada por uma detecção de cobertura de código mais abrangente.
Para a detecção de exploração de vulnerabilidades, além de focar nos pontos-chave das funções de ativação, deve-se também prestar atenção à disposição anômala da memória e ao deslocamento de leitura e escrita de dados da janela.
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
6 Curtidas
Recompensa
6
5
Compartilhar
Comentário
0/400
FarmToRiches
· 15h atrás
Ainda bem que 11 não foi afetado.
Ver originalResponder0
ChainSauceMaster
· 08-05 20:25
O velho win está com problemas de novo? Há falhas todos os dias.
Ver originalResponder0
FloorPriceWatcher
· 08-05 20:23
win11 escapou de um golpe!
Ver originalResponder0
MEVSandwichVictim
· 08-05 20:21
vulnerabilidades em pacotes, quem negocia, quem faz as pessoas de parvas
Análise de vulnerabilidade 0day das primeiras versões do Microsoft Windows: desde a escalada de privilégios até a exploração do fluxo completo
Análise e Exploração de Vulnerabilidades 0day no Sistema Windows da Microsoft
Recentemente, um patch de segurança lançado pela Microsoft corrigiu uma vulnerabilidade de elevação de privilégios do win32k que estava sendo explorada. Esta vulnerabilidade existe apenas em versões mais antigas do sistema Windows e não pode ser acionada no Windows 11. Este artigo analisará como os atacantes continuam a explorar essas vulnerabilidades em um contexto onde as medidas de segurança estão constantemente sendo aprimoradas.
Contexto da Vulnerabilidade
Vulnerabilidades 0day referem-se a falhas de segurança que ainda não foram divulgadas e não foram corrigidas, semelhantes ao conceito de negociação T+0 no mercado financeiro. Uma vez descobertas, essas vulnerabilidades podem ser exploradas maliciosamente sem serem detectadas, causando grandes danos.
A vulnerabilidade 0day do sistema Windows descoberta desta vez pode permitir que os atacantes obtenham controle total do sistema. Isso pode resultar em sérias consequências, como vazamento de informações pessoais, falhas do sistema, perda de dados e perdas financeiras. Do ponto de vista do Web3, isso pode levar ao roubo de chaves privadas, à transferência de ativos digitais e até mesmo afetar todo o ecossistema Web3 baseado em infraestrutura Web2.
Análise de Patch
A análise do código do patch revelou que o problema está no tratamento múltiplo da contagem de referências de objetos. Ao consultar os comentários do código-fonte anterior, pode-se perceber que o código anterior apenas bloqueava o objeto da janela, mas não bloqueava o objeto do menu dentro da janela, o que poderia levar a referências incorretas ao objeto do menu.
Reproduzindo a Vulnerabilidade
Ao analisar o contexto da função de vulnerabilidade, foi descoberto que o menu passado para xxxEnableMenuItem() geralmente já está bloqueado na função superior. Uma análise mais aprofundada revelou que o menu retornado pela função MenuItemState pode ser o menu principal da janela, ou pode ser um submenu ou um submenu de submenu.
Para explorar a vulnerabilidade, foi construída uma estrutura de menu especial de quatro camadas, com as seguintes características:
Ao retornar à camada do usuário em xxxRedrawTitle, remova a relação de referência dos menus C e B e libere o menu C. Assim, no ponto de retorno da função xxxEnableMenuItem, o objeto do menu C referenciado já estará inválido.
Exploração de Vulnerabilidades
A exploração de vulnerabilidades considera principalmente duas direções:
Executar código shellcode: referência a vulnerabilidades anteriores como CVE-2017-0263, mas pode enfrentar problemas de mecanismo de segurança como ponto de entrada e SMEP em versões mais recentes do Windows.
Utilizar primitivas de leitura/escrita para modificar o endereço do token: nos últimos anos, houve várias experiências públicas que podem ser consultadas, que têm a sua aplicabilidade na disposição da memória heap de desktop e nas primitivas de leitura/escrita. A chave é analisar como controlar pela primeira vez o cbwndextra para um valor extraordinário durante a reutilização de memória UAF.
Nesta utilização, adotamos a segunda opção, dividindo todo o processo em duas etapas:
Primeira escrita de dados
Após a ativação da vulnerabilidade, o sistema pode usar erroneamente os dados do objeto de janela controlado em MNGetPopupFromMenu() e xxxMNUpdateShownMenu(). Utilizamos o objeto de nome de janela na classe de janela WNDClass para ocupar o objeto de menu liberado.
A chave é encontrar um local na estrutura de endereços que podemos construir onde podemos gravar dados arbitrariamente, mesmo que seja apenas um byte. No final, escolhemos a solução no xxxRedrawWindow, controlando os dados de memória do objeto anterior através do layout de memória para determinar através da bandeira do objeto na função.
Layout de memória estável
Projete pelo menos três objetos HWND de 0x250 bytes consecutivos, libere o do meio e ocupe-o com um objeto HWNDClass. Os dados da parte final do objeto HWND anterior são usados para verificação por meio da flag em xxxRedrawWindow, o objeto de menu do objeto HWND posterior e o objeto HWNDClass são usados como meio de leitura e escrita final.
Determinar com precisão se o objeto da janela solicitado está ordenado na sequência esperada através do endereço do manipulador do núcleo vazado na memória.
Ler e escrever primitivos
Utilize GetMenuBarInfo() para leitura de qualquer primitivo, e SetClassLongPtr() para escrita de qualquer primitivo. Exceto pela escrita que substitui o TOKEN, todas as outras escritas utilizam o objeto de classe do primeiro objeto da janela usando um deslocamento para escrever.
Resumo
A vulnerabilidade win32k tem uma longa história, mas a Microsoft está a tentar reestruturar o código relacionado com Rust, podendo assim eliminar este tipo de vulnerabilidades em futuros sistemas.
O processo de exploração dessa vulnerabilidade é relativamente simples, sendo o principal desafio como controlar a primeira gravação. Depende fortemente da divulgação do endereço do manipulador de pilha da área de trabalho, o que continua a ser um risco de segurança em sistemas antigos.
A descoberta da vulnerabilidade pode ter sido beneficiada por uma detecção de cobertura de código mais abrangente.
Para a detecção de exploração de vulnerabilidades, além de focar nos pontos-chave das funções de ativação, deve-se também prestar atenção à disposição anômala da memória e ao deslocamento de leitura e escrita de dados da janela.