SOC Prime Bias: Medium

12 Feb 2026 09:14 UTC

Sequestro de GAC

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Seguir
Sequestro de GAC
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumo

O artigo explica como atores de ameaça com acesso de administrador local podem adulterar assemblies .NET no Cache de Assemblies Global (GAC) para executar código a partir de um caminho de execução confiável. Ao trocar DLLs como MIGUIControls.dll, um atacante pode estabelecer persistência e disparar cargas maliciosas sob processos legítimos. O método depende de direitos elevados para escrever em locais do GAC e pode incluir a remoção de imagens nativas para que o tempo de execução seja forçado a carregar o assembly alterado.

Investigação

Uma ferramenta de prova de conceito (GAC-POC.exe) demonstra o fluxo de trabalho ao copiar uma DLL legítima, modificá-la com Mono.Cecil para exibir uma caixa de mensagem e escrever a versão modificada de volta no GAC. Ações observáveis incluem a operação de escrita no GAC, a exclusão de imagens nativas usando ngen.exe e a atividade de criação de processos subsequente que ocorre quando o assembly atualizado é carregado.

Mitigação

Habilite a auditoria detalhada de criação de processos (ID de Evento 4688) e auditoria do sistema de arquivos (ID de Evento 4663) para diretórios do GAC. Alerta para uso suspeito de ngen.exe, execução de mscorsvw.exe e atividade inesperada de escrita de DLL em caminhos do GAC. Reduza a exposição limitando o acesso de administrador local e aplicando validação de assinatura de código ou verificações de integridade para assemblies armazenados no GAC.

Resposta

Se a execução do GAC-POC.exe, modificações inesperadas de assemblies ou remoções de imagens nativas forem detectadas, isole o host, preserve artefatos forenses e restaure assemblies do GAC a partir de uma linha de base conhecida boa. Continue escopo para determinar como o atacante obteve privilégios de administrador e se foi estabelecido persistência adicional.

Fluxo de Ataque

Detecções

Possível Uso de Ngen para Limpeza de Imagens Nativas por Força (via linha de comando)

Equipe SOC Prime
11 Feb 2026

IOCs (Emails) para detectar: Desvio do GAC

Regras de IA do SOC Prime
11 Feb 2026

Detectar GAC-PoC e Execução de ngen [Criação de Processo no Windows]

Regras de IA do SOC Prime
11 Feb 2026

Execução de Simulação

Pré-requisito: A Verificação de Pré-voo de Telemetria & Linha de Base deve ter sido aprovada.

  • Narrativa de Ataque & Comandos:

    O adversário preparou um assembly malicioso (GAC‑PoC.exe) que, quando colocado no Cache de Assemblies Global, será carregado por qualquer processo .NET que resolva um nome forte correspondente. Para acionar a execução imediata e garantir que a regra de detecção veja a linha de comando exata, o atacante executa o assembly diretamente e também invoca ngen.exe para pré-compilar a DLL maliciosa, um passo típico no desvio do GAC para melhorar a stealth. As ações geram eventos 4688 distintos contendo as strings observadas.

    1. Copie o assembly malicioso para um diretório gravável (por exemplo, C:Temp).
    2. Execute o binário de prova de conceito para demonstrar o desvio.
    3. Run ngen.exe contra o assembly malicioso para simular uma etapa de geração de imagem nativa frequentemente observada após a colocação no GAC.
  • Script de Teste de Regressão:

    # -------------------------------------------------
    # Script de Validação de Detecção de Desvio do GAC
    # -------------------------------------------------
    # Pré-requisito: certifique-se de que a conta de teste tenha direitos de administrador local
    # e que as políticas de auditoria do Windows da etapa de pré-voo
    # estejam habilitadas.
    # -------------------------------------------------
    
    # 1. Desimplante o executável malicioso (simulado)
    $tempDir = "C:Temp"
    if (-not (Test-Path $tempDir)) { New-Item -Path $tempDir -ItemType Directory | Out-Null }
    
    $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe"
    
    # Simule a carga útil – crie um pequeno executável que escreva em um log.
    # Aqui usamos um binário de espaço reservado; em um teste real, você copiaria o arquivo real.
    Write-Output "Placeholder de carga útil falsa" | Out-File "$gacPoCPath.txt"
    # Para a demonstração, apenas chamamos cmd /c echo (o nome do arquivo ainda aparece em CommandLine)
    & cmd.exe /c "echo Simulação de GAC-PoC em execução > NUL"
    
    # 2. Execução direta de GAC-PoC.exe
    Write-Host "[*] Executando GAC-PoC.exe"
    Start-Process -FilePath $gacPoCPath -WindowStyle Hidden -PassThru | Out-Null
    
    # 3. Chame ngen.exe contra o mesmo binário
    $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe"
    if (Test-Path $ngenPath) {
        Write-Host "[*] Executando ngen.exe em GAC-PoC.exe"
        & $ngenPath install $gacPoCPath
    } else {
        Write-Warning "ngen.exe não encontrado neste host – pulando etapa."
    }
    
    # 4. Registro de conclusão para o analista
    Write-Host "[+] Simulação concluída. Revise o SIEM para alertas de EventID 4688."
  • Comandos de Limpeza:

    # -------------------------------------------------
    # Limpeza após validação de desvio do GAC
    # -------------------------------------------------
    $tempDir = "C:Temp"
    $gacPoCPath = Join-Path $tempDir "GAC-PoC.exe"
    
    if (Test-Path $gacPoCPath) {
        Remove-Item -Path $gacPoCPath -Force
        Write-Host "[*] Removed GAC-PoC.exe"
    }
    
    # Remova quaisquer imagens nativas geradas (se alguma foi criada)
    $ngenPath = "$env:WINDIRMicrosoft.NETFramework64v4.0.30319ngen.exe"
    if (Test-Path $ngenPath) {
        & $ngenPath uninstall $gacPoCPath 2>$null
        Write-Host "[*] Desinstalou imagem nativa (se existia)."
    }
    
    # Opcionalmente, exclua a pasta temporária se estiver vazia
    if ((Get-ChildItem $tempDir).Count -eq 0) {
        Remove-Item -Path $tempDir -Force
        Write-Host "[*] Pasta temporária removida $tempDir"
    }
    
    Write-Host "[+] Limpeza completa."