Pesquisadores da Kaspersky identificaram o NetamLoader, um framework de carregamento para .NET construído com base em marcação XAML (Extensible Application Markup Language).
Tudo indica tratar-se de um ataque à cadeia de suprimentos contra uma versão personalizada do Windows usada apenas por órgãos governamentais asiáticos. Nenhum grupo APT (ameaça persistente avançada) conhecido foi associado a ele.
Malware NetamLoader
O Kaspersky Security Network sinalizou um arquivo .config que usava injeção via AppDomainManager para carregar assemblies .NET arbitrários. O arquivo estava dentro de um pacote compactado no formato CAB (Cabinet), em C:\Windows\SoftwareDistribution\Download.
A maior parte do conteúdo do CAB era composta por componentes legítimos do Patch My PC, e os assemblies injetados eram assinados pela Microsoft. Apenas o arquivo Resources.resx era malicioso.
De acordo com a pesquisa técnica publicada pela Kaspersky, o PatchMyPC-ScriptRunner.exe carrega um arquivo de configuração forjado que aponta para o Microsoft.HostIntegration.Connectors.
A classe DataCacheFactoryConfiguration então lê o fabric.config, que processa o Resources.resx. Esse arquivo contém um objeto BinaryFormatter codificado em Base64. Ele dispara um ataque de desserialização TypeConfuseDelegate e chama XamlReader.Parse() para executar o primeiro payload XAML.
O XAML-1 deriva uma chave AES (Advanced Encryption Standard) a partir do hash SHA-256 (Secure Hash Algorithm 256) da linha de comando do host e descriptografa o XAML-2. Se a descriptografia falhar, o processo é encerrado silenciosamente. O XAML-2 desempacota dois outros componentes: o XAML-2-1, que sequestra o AMSI (interface de varredura antimalware do Windows) redirecionando o ponteiro CAmsiAntimalware::Scan para um Console.Clear() modificado, de modo que toda varredura retorne resultado limpo; e o XAML-2-2, que entrega o .NET 1 Loader e sua configuração de C2 (servidor de comando e controle) em JSON (JavaScript Object Notation).
O loader apaga registros de atualização, logs de uso do CLR (Common Language Runtime) e arquivos Prefetch. Ele também remove entradas GetExtendedUpdateInfoHandler dos logs do CmitUpdateAgent, o que pode apontar para a versão personalizada do Windows usada pelo governo.
Em seguida, ele usa um objeto COM (Component Object Model) criado via RPC (Remote Procedure Call) para executar o XAML-3 dentro do dllhost.exe, separando a carga maliciosa da árvore original de processos para evitar detecção por EDR (detecção e resposta em endpoints). Isso se assemelha a outros loaders que contornam o AMSI e foram observados neste ano.
O plugin final espera entre 20 e 40 minutos antes do primeiro contato, o que burla ambientes de análise automatizada (sandboxes). Depois, consulta seu C2 a cada 5 a 6 minutos ou, após uma falha, a cada 22 a 28 horas.
O tráfego usa AES-128-CBC (AES em modo Cipher Block Chaining) com HMAC-SHA256 (Hash-based Message Authentication Code com SHA-256), e o plugin aceita qualquer certificado. O XAML baixado é executado em um AppDomain isolado. Um temporizador de vigilância encerra o processo após cerca de 28 horas.
O C2 é o openaigpt4v[.]com, protegido pela Cloudflare no endereço IP 104.18.14[.]219. A Kaspersky identificou uma vítima na Ásia e infere um foco mais amplo em governos.
Equipes de defesa devem observar arquivos .config inesperados ao lado de executáveis .NET, especialmente em SoftwareDistribution\Download\Install. Também devem configurar alertas para adulteração do AMSI e para execuções do dllhost.exe iniciadas via COM.
Como mostra outro caso de abuso de canais de atualização, fluxos de atualização considerados confiáveis são alvos cada vez mais atraentes. Os detalhes técnicos completos estão no relatório da Kaspersky sobre o NetamLoader.