Bypasses de Proteção de Administrador via UIAccess
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Visão geral
- Windows AppInfo expõe
RAiLaunchAdminProcesspara spawnar processos UIAccess (destinado a accessibility). UIAccess contorna a maioria dos filtros do User Interface Privilege Isolation (UIPI) de mensagens de interface para que software de accessibility possa controlar UI de IL superior. - Habilitar UIAccess diretamente requer
NtSetInformationToken(TokenUIAccess)com SeTcbPrivilege, então chamadores de baixo privilégio dependem do service. O service realiza três checagens no binário alvo antes de setar UIAccess: - Embedded manifest contém
uiAccess="true". - Assinado por qualquer certificado confiado pelo Local Machine root store (sem requisito de EKU/Microsoft).
- Localizado em um caminho somente para administradores no disco do sistema (por exemplo,
C:\Windows,C:\Windows\System32,C:\Program Files, excluindo subpaths específicos graváveis). RAiLaunchAdminProcessnão exibe prompt de consentimento para launches UIAccess (caso contrário tooling de accessibility não poderia controlar o prompt).
Token shaping and integrity levels
- Se as checagens passam, AppInfo copia o caller token, habilita UIAccess, e aumenta o Integrity Level (IL):
- Limited admin user (user is in Administrators but running filtered) ➜ High IL.
- Non-admin user ➜ IL aumentado em +16 levels até um teto High (System IL nunca é atribuído).
- Se o caller token já tem UIAccess, o IL permanece inalterado.
- “Ratchet” trick: um processo UIAccess pode desabilitar UIAccess nele mesmo, relançar via
RAiLaunchAdminProcess, e ganhar outro incremento de +16 IL. Medium➜High leva 255 relançamentos (barulhento, mas funciona).
Por que UIAccess permite um escape do Admin Protection
- UIAccess permite que um processo de IL inferior envie mensagens de janela para janelas de IL superior (contornando filtros UIPI). Em IL igual, primitivas clássicas de UI como
SetWindowsHookExpermitem injeção de código/carregamento de DLL em qualquer processo que possua uma janela (incluindo message-only windows usados pelo COM). - Admin Protection lança o processo UIAccess sob a identidade do usuário limitado mas em High IL, silenciosamente. Uma vez que código arbitrário execute dentro desse processo UIAccess de High IL, o atacante pode injetar em outros processos de High IL no desktop (mesmo pertencentes a outros usuários), quebrando a separação pretendida.
HWND-to-process handle primitive (GetProcessHandleFromHwnd / NtUserGetWindowProcessHandle)
- On Windows 10 1803+ the API moved into Win32k (
NtUserGetWindowProcessHandle) and can open a process handle using a caller-suppliedDesiredAccess. The kernel path usesObOpenObjectByPointer(..., KernelMode, ...), which bypasses normal user-mode access checks. - Pré-condições na prática: a janela alvo deve estar no mesmo desktop, e checagens UIPI devem passar. Historicamente, um chamador com UIAccess podia contornar falha UIPI e ainda obter um handle em kernel-mode (corrigido como CVE-2023-41772).
- Impacto: um handle de janela torna-se uma capability para obter um handle de processo poderoso (comumente
PROCESS_DUP_HANDLE,PROCESS_VM_READ,PROCESS_VM_WRITE,PROCESS_VM_OPERATION) que o chamador normalmente não poderia abrir. Isso permite acesso cross-sandbox e pode quebrar fronteiras de Protected Process / PPL se o alvo expuser qualquer janela (incluindo message-only windows). - Fluxo prático de abuso: enumerar ou localizar HWNDs (por exemplo,
EnumWindows/FindWindowEx), resolver o PID dono (GetWindowThreadProcessId), chamarGetProcessHandleFromHwnd, então usar o handle retornado para leitura/escrita de memória ou primitivas de code-hijack. - Com o fix: UIAccess não concede mais opens em kernel-mode quando há falha UIPI e os direitos de acesso permitidos são restritos ao conjunto legado de hooks; Windows 11 24H2 adiciona checagens de proteção de processo e caminhos mais seguros sob feature flags. Desabilitar UIPI no sistema inteiro (
EnforceUIPI=0) enfraquece essas proteções.
Fraquezas na validação de diretório seguro (AppInfo AiCheckSecureApplicationDirectory)
AppInfo resolve o path fornecido via GetFinalPathNameByHandle e então aplica checagens de string allow/deny contra roots/exclusões hardcoded. Múltiplas classes de bypass originam-se dessa validação simplista:
- Directory named streams: Diretórios excluídos graváveis (por exemplo,
C:\Windows\tracing) podem ser contornados com um named stream no próprio diretório, ex.C:\Windows\tracing:file.exe. As checagens de string veemC:\Windows\e perdem a subpasta excluída. - Writable file/directory inside an allowed root:
CreateProcessAsUsernão requer extensão.exe. Sobrescrever qualquer arquivo gravável sob uma raiz permitida com um payload executável funciona, ou copiar um EXE assinado comuiAccess="true"para qualquer subdiretório gravável (por exemplo, restos de atualização comoTasks_Migratedquando presente) permite que passe a checagem de secure-path. - MSIX into
C:\Program Files\WindowsApps(fixed): Non-admins could install signed MSIX packages that landed inWindowsApps, which was not excluded. Packaging a UIAccess binary inside the MSIX then launching it viaRAiLaunchAdminProcessyielded a promptless High-IL UIAccess process. Microsoft mitigated by excluding this path; theuiAccessrestricted MSIX capability itself already requires admin install.
Fluxo de ataque (High IL sem prompt)
- Obter/construir um signed UIAccess binary (manifest
uiAccess="true"). - Colocá-lo onde a allowlist do AppInfo o aceite (ou abusar de um edge case de validação de path/artifato gravável como acima).
- Chamar
RAiLaunchAdminProcesspara spawná-lo silenciosamente com UIAccess + IL elevado. - A partir desse foothold de High IL, mirar outro processo High IL no desktop usando window hooks/DLL injection ou outras primitivas same-IL para comprometer completamente o contexto de admin.
Enumerando caminhos candidatos graváveis
Execute o helper em PowerShell para descobrir objetos graváveis/sobrescrítiveis dentro de raízes nominalmente seguras do ponto de vista de um token escolhido:
$paths = "C:\\Windows","C:\\Program Files","C:\\Program Files (x86)"
Get-AccessibleFile -Win32Path $paths -Access Execute,WriteData `
-DirectoryAccess AddFile -Recurse -ProcessId <PID>
- Execute como Administrator para maior visibilidade; defina
-ProcessIdpara um processo com privilégios baixos para espelhar o acesso desse token. - Filtre manualmente para excluir subdiretórios conhecidos como não permitidos antes de usar candidatos com
RAiLaunchAdminProcess.
Referências
Tip
Aprenda e pratique Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporte o HackTricks
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.


