SOC Prime Bias: Médio

26 Mar 2026 16:14

RegPhantom Backdoor: Análise de Ameaças e Percepções de Detecção

Author Photo
Ruslan Mikhalov Chefe de Pesquisa de Ameaças na SOC Prime linkedin icon Seguir
RegPhantom Backdoor: Análise de Ameaças e Percepções de Detecção
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Resumo

RegPhantom é um rootkit de kernel do Windows focado em furtividade que permite que processos de modo usuário com poucos privilégios executem código arbitrário no espaço do kernel através de um canal de comando oculto baseado no registro. O driver é assinado com certificados válidos, baseia-se no carregamento reflexivo de PE e remove artefatos de execução uma vez que seu trabalho é concluído. Sua arquitetura é construída para evadir os controles de fiscalização de assinatura de driver enquanto evita arquivos ou entradas de registro persistentes. A detecção eficaz, portanto, depende de identificar o próprio binário do driver e os padrões de código distintos que ele contém.

Investigação

A pesquisa revisou vários .sys exemplares assinados e não assinados reunidos entre junho e agosto de 2025, expondo uma base de código obfuscado por CFG compartilhada e um mecanismo de interceptação de registro construído em CmRegisterCallback. O driver descriptografa uma carga útil protegida por XOR de 56 bytes, mapeia reflexivamente na memória do kernel, executa-a e, em seguida, apaga as evidências. A cronologia dos exemplares e o uso do certificado apontam para uma atividade contínua de desenvolvimento associada a um ator de ameaça ligado à China.

Mitigação

As equipes de segurança devem bloquear drivers de kernel não confiáveis, observar o uso suspeito de CmRegisterCallback and PsSetCreateThreadNotifyRoutine, e impor a validação de integridade no momento da inicialização para arquivos de driver. Regras YARA devem ser implantadas para corresponder às sequências de bytes exclusivas do driver, enquanto a fiscalização rigorosa de assinatura de código deve permanecer em vigor. Monitorar falhas incomuns de gravação de registro, especialmente eventos repetidos de acesso negado, pode também expor o canal de comunicação oculto.

Resposta

Se RegPhantom for descoberto, isole o endpoint afetado, exclua o driver malicioso e capture um dump completo de memória do kernel para revisão forense mais profunda. Revogue quaisquer certificados de assinatura abusados e atualize os repositórios de certificados confiáveis conforme necessário. A caça de ameaças deve então se concentrar no comportamento de interceptação de registro do driver em todo o ambiente, seguida de remediação de todos os sistemas Windows potencialmente expostos.

“graph TB %% Class Definitions Section classDef technique fill:#ffcc99 classDef action fill:#99ccff classDef operator fill:#ff9900 classDef builtin fill:#cccccc %% Node definitions step_persistence["<b>Passo</b> – Persistência via driver malicioso assinado carregado na inicialização usando um certificado de assinatura de código válido."] class step_persistence action tech_boot_autostart["<b>Técnica</b> – <b>T1547.009 Drivers e Módulos de Kernel</b><br/>Carregar driver malicioso na inicialização do sistema para alcançar persistência e obter privilégio no modo kernel."] class tech_boot_autostart technique tech_code_signing["<b>Técnica</b> – <b>T1553.002 Subverter Controles de Confiança: Assinatura de Código</b><br/>Aproveitar um certificado de assinatura de código legítimo para contornar a fiscalização de assinatura de driver."] class tech_code_signing technique tech_priv_esc["<b>Técnica</b> – <b>T1068 Exploração para Escalação de Privilégio</b><br/>Driver de kernel concede privilégios a nível de sistema para código de ataque.""" class tech_priv_esc technique step_hook_registration["<b>Passo</b> – Driver registra callbacks do sistema para esconder sua presença e interceptar operações."] class step_hook_registration action tech_rootkit["<b>Técnica</b> – <b>T1014 Rootkit</b><br/>Instalar componentes de rootkit em modo kernel e ganchos de callbacks para esconder atividade maliciosa."] class tech_rootkit technique step_registry_channel["<b>Passo</b> – Canal de comando oculto usando gravações de registro interceptadas e descriptografadas pelo driver."] class step_registry_channel action tech_query_registry["<b>Técnica</b> – <b>T1012 Consultar Registro</b><br/>Ler valores de registro para receber comandos ou dados de configuração.""" class tech_query_registry technique tech_deobfuscate["<b>Técnica</b> – <b>T1140 Desobfuscate/Decodifica Arquivos ou Informações</b><br/>Descriptografar carga útil, criptografada por XOR, recuperada do registro.""" class tech_deobfuscate technique step_reflective_load["<b>Passo</b> – Carregar carga útil PE reflexiva na memória do kernel usando carregador personalizado."] class step_reflective_load action tech_reflective_loading["<b>Técnica</b> – <b>T1620 Carregamento de Código Reflexivo</b><br/>Carregar e executar código diretamente da memória sem tocar no disco.""" class tech_reflective_loading technique step_memory_wipe["<b>Passo</b> – Apagar memória alocada e remover artefatos temporários após a execução."] class step_memory_wipe action tech_clear_persistence["<b>Técnica</b> – <b>T1070.009 Limpar Persistência</b><br/>Excluir traços de módulos carregados e artefatos de persistência relacionados.""" class tech_clear_persistence technique step_hook_hijack["<b>Passo</b> – Carga útil sequestra pointers de gancho de driver para manter a persistência e esconder ainda mais a atividade."] class step_hook_hijack action %% Connections showing flow step_persistence –>|usa| tech_boot_autostart step_persistence –>|subverte| tech_code_signing step_persistence –>|permite| tech_priv_esc step_persistence –>|leva a| step_hook_registration step_hook_registration –>|implementa| tech_rootkit step_hook_registration –>|leva a| step_registry_channel step_registry_channel –>|acessa| tech_query_registry step_registry_channel –>|realiza| tech_deobfuscate step_registry_channel –>|leva a| step_reflective_load step_reflective_load –>|executa| tech_reflective_loading step_reflective_load –>|leva a| step_memory_wipe step_memory_wipe –>|limpa| tech_clear_persistence step_memory_wipe –>|leva a| step_hook_hijack step_hook_hijack –>|mantém| tech_rootkit “

Fluxo de Ataque

Execução da Simulação

Pré-requisito: O Check Pré-voo de Telemetria & Baseline deve ter passado.

Justificativa: Esta seção detalha a execução precisa da técnica do adversário (TTP) projetada para acionar a regra de detecção. Os comandos e a narrativa DEVEM refletir diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção.

  • Narrativa de Ataque & Comandos

    1. Objetivo: Emular a tentativa do RegPhantom de registrar um callback de registro em modo kernel que interceptará operações de registro relacionadas a credenciais.
    2. Método: Carregar um driver mínimo, deliberadamente falhando que chama CmRegisterCallback com uma rotina de callback apontando para RegNtPreSetValueKey. O driver passa intencionalmente uma estrutura de registro malformada que resulta em STATUS_ACCESS_DENIED.
    3. Resultado: Logs do Sysmon EventID 13 com TargetObject contendo ambos CmRegisterCallback and RegNtPreSetValueKey, Detalhes relatando Tamanho dos dados exatamente 56 bytes (0x38), e Status definido para STATUS_ACCESS_DENIED.
  • Script de Teste de Regressão (PowerShell + fonte C do driver embutido – compile no host de destino)

    # --------------------------------------------------------------
    # Passo 1: Escrever a fonte do driver mínimo no disco
    # --------------------------------------------------------------
    $driverSource = @"
    #include <ntddk.h>
    
    // Callback fictício – nunca chamado
    NTSTATUS DummyCallback(
        _In_ PVOID CallbackContext,
        _In_ PVOID Argument1,
        _In_ PVOID Argument2
    )
    {
        UNREFERENCED_PARAMETER(CallbackContext);
        UNREFERENCED_PARAMETER(Argument1);
        UNREFERENCED_PARAMETER(Argument2);
        return STATUS_SUCCESS;
    }
    
    extern "C" NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
    {
        UNREFERENCED_PARAMETER(DriverObject);
        UNREFERENCED_PARAMETER(RegistryPath);
    
        // Intencionalmente usar um tamanho errado (56 bytes) e solicitar um registro de callback
        // que será rejeitado com STATUS_ACCESS_DENIED.
        UNICODE_STRING altitude = RTL_CONSTANT_STRING(L"1234.5678.90ab");
        LARGE_INTEGER cookie = {0};
    
        // Forçar uma falha passando um ponteiro de callback nulo (simula um pedido malformado)
        NTSTATUS status = CmRegisterCallback(DummyCallback, NULL, &cookie);
    
        // Sobrescrever status para imitar a condição exata vista pelo RegPhantom
        status = STATUS_ACCESS_DENIED; // 0xC0000022
    
        // Manter o driver carregado por um curto período para permitir que o Sysmon capture o evento
        LARGE_INTEGER interval;
        interval.QuadPart = -10 * 1000000; // 1 segundo
        KeDelayExecutionThread(KernelMode, FALSE, &interval);
    
        // Desregistrar antes de descarregar
        CmUnregisterCallback(cookie);
    
        return STATUS_SUCCESS;
    }
    "@
    $srcPath = "$env:TEMPRegPhantomStub.c"
    $srcPath | Set-Content -Value $driverSource -Encoding ASCII
    
    # --------------------------------------------------------------
    # Passo 2: Compilar o driver (requer Visual Studio Build Tools)
    # --------------------------------------------------------------
    Write-Host "Compilando driver – requer Windows Driver Kit (WDK) e VS Build Tools."
    $compileCmd = "cl /nologo /W3 /WX- /O2 /DUNICODE /D_UNICODE /Zi /MD /LD $srcPath /link /OUT:`"$env:TEMPRegPhantomStub.sys`""
    & cmd /c $compileCmd
    
    # --------------------------------------------------------------
    # Passo 3: Carregar o driver (deve ser executado como Administrador)
    # --------------------------------------------------------------
    Write-Host "Carregando driver para acionar a tentativa de registro..."
    $driverPath = "$env:TEMPRegPhantomStub.sys"
    sc create RegPhantomStub binPath= $driverPath type= kernel start= demand
    sc start RegPhantomStub
    
    # --------------------------------------------------------------
    # Passo 4: Dar tempo para o Sysmon ingerir o evento
    # --------------------------------------------------------------
    Start-Sleep -Seconds 5
    
    # --------------------------------------------------------------
    # Passo 5: Descarregar e excluir o driver
    # --------------------------------------------------------------
    sc stop RegPhantomStub
    sc delete RegPhantomStub
    Remove-Item -Path $driverPath -Force
    Remove-Item -Path $srcPath -Force
    
    Write-Host "Simulação completa. Verifique a detecção no seu SIEM."
  • Comandos de Limpeza (se o driver não pôde ser compilado ou carregado)

    # Certifique-se de que qualquer serviço de driver parcialmente criado seja removido
    if (Get-Service -Name RegPhantomStub -ErrorAction SilentlyContinue) {
        sc stop RegPhantomStub
        sc delete RegPhantomStub
    }
    # Remover arquivos residuais
    Remove-Item -Path "$env:TEMPRegPhantomStub.*" -Force -ErrorAction SilentlyContinue