# T1027.016 - Junk Code Insertion > [!info] Técnica MITRE ATT&CK > **ID:** T1027.016 | **Tática:** Defense Evasion | **Plataformas:** Windows, Linux, macOS > **Técnica pai:** [[t1027-obfuscated-files-or-information|T1027 - Obfuscated Files or Information]] ## Descrição A técnica **Junk Code Insertion** (inserção de código morto ou inútil) é uma forma de ofuscação em que adversários inserem instruções não funcionais ou redundantes no código de malware para dificultar análise estática, enganar mecanismos de detecção baseados em assinatura e aumentar o custo operacional da análise forense. O código "junk" (lixo) pode ser definido como qualquer instrução que: - **Não executa** (dead code - código que nunca é alcançado pelo fluxo de execução) - **Executa mas não altera o estado do programa** (NOP sleds, operações nulas, cálculos descartados) - **Executa com lógica opaca** (opaque predicates - condicionais cujo resultado é sempre o mesmo, mas parecem variáveis para análise estática) A principal motivação é **evasão de detecção**: sistemas de antivírus e EDR baseados em assinatura identificam malware por padrões específicos de bytes no binário. Ao inserir instruções entre as sequências funcionais, o adversário altera o hash e os padrões de bytes do binário sem alterar seu comportamento - tornando a assinatura original obsoleta. A técnica é distinta de [[t1027-001-binary-padding|T1027.001 - Binary Padding]], que adiciona dados no final do arquivo apenas para alterar hash; aqui o objetivo é **ofuscar a lógica**, não apenas modificar o tamanho. Também difere de [[t1027-002-software-packing|T1027.002 - Software Packing]], que comprime/cifra o binário inteiro; Junk Code Insertion opera no nível do código-fonte ou da linguagem intermediária, sendo especialmente comum em: - **Assembly x86/x64**: instruções NOP (opcode `0x90`) e equivalentes funcionais (`XCHG EAX, EAX`, `MOV EAX, EAX`) - **Scripts PowerShell/VBScript/JavaScript**: funções nunca chamadas, comentários ofuscados, variáveis declaradas e não utilizadas - **Bytecode .NET/Java**: métodos mortos inseridos pelo compilador-adversário - **Shellcode**: NOPs sleds antes do payload real para aumentar confiabilidade de exploits e confundir análise **Impacto na análise:** - Analistas que realizam análise estática (IDA Pro, Ghidra, Binary Ninjá) precisam filtrar manualmente centenas ou milhares de instruções irrelevantes - Ferramentas de análise automática podem gastar tempo computacional em caminhos de código que nunca são executados - Detectores baseados em heurística que contam proporções de tipos de instrução podem ser enganados por distribuições artificialmente alteradas ## Como Funciona **Categorias principais de junk code:** **1. NOP Sleds (No-Operation)** A instrução NOP em x86 (`0x90`) é a forma mais simples de junk code - não faz nada além de avançar o ponteiro de instrução. Adversários inserem sequências de NOPs entre blocos funcionais. Variantes funcionalmente equivalentes incluem: - `XCHG EAX, EAX` (troca registrador consigo mesmo = sem efeito) - `ADD EAX, 0` (adiciona zero = sem efeito) - `MOV EAX, EAX` (atribui valor a si mesmo = sem efeito) Essas variantes são preferíveis porque sequências de `0x90` são frequentemente detectadas por heurísticas. **2. Dead Code Blocks** Blocos de código que nunca são alcançados pelo fluxo de execução: - Funções declaradas mas nunca chamadas - Código após um `JMP` incondicional (`goto`, `return`) - Branches de condicionais que nunca são verdadeiras devido a opaque predicates **3. Opaque Predicates** Condicionais cujo valor é determinístico em tempo de execução mas parece variável para análise estática. Exemplo clássico: ``` ; Este bloco SEMPRE executa - mas o analisador não sabe disso estáticamente MOV EAX, x IMUL EAX, x ; EAX = x² AND EAX, 1 ; x² mod 2 CMP EAX, 0 JNZ dead_code_block ; x² sempre é par → JNZ nunca salta ; código real aqui ``` O analisador vê duas possibilidades; o adversário sabe que apenas uma é real. **4. Código Inútil em Scripts de Alto Nível** Em PowerShell, o padrão é inserir chamadas a funções benignas (`Get-Daté`, `Start-Sleep 0`, `$null = 1+1`) intercaladas com o código malicioso, ou definir dezenas de funções e variáveis que nunca são usadas. **5. Geração Polimórfica Automatizada** Ferramentas como Veil-Evasion, Shellter e geradores polimórficos customizados geram automaticamente junk code diferente a cada "build" do malware, criando binários funcionalmente idênticos mas com hashes únicos - tornando a detecção por assinatura trivialmente evadida. ## Attack Flow ```mermaid graph TB A["🛠️ Desenvolvimento do Malware<br/>(código funcional original)"] --> B["🔍 Análise de Detecção<br/>(adversário testa contra AV/EDR)"] B --> C{"⚠️ Detectado?"} C -- Sim --> D["🔧 Aplicar Junk Code Insertion<br/>(NOP sleds, dead code,<br/>opaque predicates)"] C -- Não --> G D --> E["🔄 Geração Polimórfica<br/>(novo hash a cada build)"] E --> F["🔬 Re-teste contra AV/EDR<br/>(VirusTotal privado, ambiente sandboxed)"] F --> C C -- Evasão OK --> G["📦 Empacotamento Final<br/>(ISO/ZIP - MotW Bypass)"] G --> H["📧 Entrega via Phishing<br/>(T1566 001 Spearphishing Attachment)"] H --> I["⚡ Execução na Vítima<br/>(sem alerta de AV - assinatura não reconhecida)"] I --> J["🔎 Análise Forense Dificultada<br/>(analista navega por<br/>código irrelevante)"] J --> K["⏱️ Ganho de Tempo para o Adversário<br/>(análise lenta = resposta lenta)"] style A fill:#2980b9,color:#fff style D fill:#8e44ad,color:#fff style E fill:#8e44ad,color:#fff style I fill:#c0392b,color:#fff style K fill:#2c3e50,color:#fff ``` ## Exemplos de Uso ### FIN7 - CARBANAK e Variantes com Junk Code Polimórfico O [[g0046-fin7|FIN7]], grupo de crime financeiro responsável por bilhões em perdas globais, é conhecido por suas capacidades avançadas de evasão de AV. Versões do backdoor CARBANAK analisadas por pesquisadores da Mandiant e Kaspersky contêm extensos blocos de dead code e opaque predicates inseridos entre funções legítimas de comunicação C2. O grupo mantinha uma pipeline de "reempacotamento" onde novas variantes com junk code diferente eram geradas a cada campanha - resultando em taxas de detecção próximas de 0/70 no VirusTotal em lançamentos iniciais. ### Gamaredon Group - Scripts PowerShell Obfuscados O [[g0047-gamaredon|Gamaredon Group]], grupo APT atribuído ao FSB russo e ativo principalmente contra alvos ucranianos e europeus, é prolífico no uso de junk code em scripts PowerShell. Análises do CERT-UA e da ESET documentam scripts com centenas de funções declaradas e não utilizadas, cálculos sem sentido (ex: `$a = (2 * 7 - 14 + 1) * 0`) e chamadas a cmdlets benignos do sistema intercaladas com o código de downloader/backdoor real. Essa técnica torna a análise manual muito mais lenta e pode enganar sistemas de análise comportamental que contam chamadas a funções "suspeitas". ### Kimsuky - Implantes com NOP Sleds e Dead Functions O [[g0094-kimsuky|Kimsuky]], grupo APT norte-coreano focado em espionagem contra alvos sul-coreanos, jáponeses e ocidentais, insere extensos blocos de funções mortas em seus implantes .NET e shellcodes. Análises da SentinelOne e Recorded Future mostram implantes onde mais de 40% do binário é código não funcional - proporção suficiente para inválidar a maioria das assinaturas baseadas em hash e dificultar heurísticas de proporção de código suspeito. ### APT32 (OceanLotus) - Junk Code em Macro VBA O [[g0050-apt32|APT32]], grupo vietnamita de espionagem, foi documentado utilizando junk code em macros VBA distribuídas via documentos Office maliciosos. As macros continham dezenas de sub-rotinas com nomes aparentemente legítimos (`FormatData`, `ValidateInput`, `CheckVersion`) que na prática executavam cálculos sem sentido ou retornavam valores nunca utilizados. A sub-rotina maliciosa real estava enterrada entre essas funções de ruído, tornando análise manual pelo analista muito mais demorada. ### Maze Ransomware - Polimorfismo via Junk Code O [[s0449-maze|Maze]], um dos ransomwares mais sofisticados técnicamente antes de sua dissolução em 2020, utilizava gerador polimórfico que inseria junk code diferente em cada binário compilado. Isso significava que cada vítima recebia um executável com hash único, tornando blocklists de hash completamente ineficazes. Combinado com [[t1027-002-software-packing|software packing]], o Maze consistentemente evadia detecção na primeira hora após implantação. ### StrelaStealer - Obfuscação via Código Morto em Shellcode O [[s1183-strelastealer|StrelaStealer]], stealer especializado em credenciais de clientes de e-mail, utiliza shellcode com extensivos NOP sleds e equivalentes funcionais entre os blocos de código real. Análises da Unit 42 mostram que o shellcode tem aproximadamente 3x o tamanho esperado para sua funcionalidade real, com o excesso composto inteiramente de instruções redundantes. ## Detecção ### Regra Sigma - Execução de Processo com Alta Entropia e Baixa Prevalência ```yaml title: Low-Prevalence Binary with High Entropy Sections (Possible Junk Code Obfuscation) id: e3f4a5b6-7890-12cd-ef01-234567890123 status: experimental description: | Detecta execução de binários com características de obfuscação por junk code: alta entropia em seções de código (indicando padding/obfuscação) combinada com baixa prevalência no ambiente (hash desconhecido). Requer integração com solução EDR que reporte metadados de PE. author: RunkIntel daté: 2026-03-25 references: - https://attack.mitre.org/techniques/T1027/016/ - https://github.com/SigmaHQ/sigma logsource: category: process_creation product: windows detection: selection_suspicious_binary: # Processo iniciado fora de caminhos conhecidos/aprovados Image|re: '^C:\\Users\\.*\.(exe|dll) # Hash não presente na lista de aplicações aprovadas (implementar via lookup) filter_known_good: Image|contains: - '\AppData\Local\Microsoft\Teams\' - '\AppData\Local\Google\Chrome\' - '\AppData\Roaming\Zoom\' condition: selection_suspicious_binary and not filter_known_good falsepositives: - Aplicações portáteis (Notepad++, 7-Zip portable) - Ferramentas de desenvolvimento de usuários level: medium tags: - attack.defense_evasion - attack.t1027.016 ``` ### Regra Sigma - Scripts PowerShell com Alta Proporção de Código Inativo ```yaml title: PowerShell Script with Excessive Unused Function Definitions id: f4a5b6c7-8901-23de-f012-345678901234 status: experimental description: | Detecta scripts PowerShell com padrão característico de junk code: múltiplas definições de função seguidas de chamada a apenas uma delas, indicando possível obfuscação por código morto. author: RunkIntel daté: 2026-03-25 logsource: category: ps_script product: windows detection: selection_many_functions: # Scripts com muitas definições de function mas poucos calls únicos ScriptBlockText|re: '(?i)(function\s+\w+\s*\{.*?){10,}' selection_suspicious_content: ScriptBlockText|contains: - 'IEX' - 'Invoke-Expression' - 'DownloadString' - 'FromBase64String' condition: selection_many_functions and selection_suspicious_content falsepositives: - Scripts legítimos de administração com muitas funções utilitárias - Módulos PowerShell de terceiros (verificar assinatura) level: high tags: - attack.defense_evasion - attack.t1027.016 - attack.t1059.001 ``` ### Indicadores de Comportamento | Indicador | Ferramenta | Prioridade | |-----------|-----------|-----------| | Binário com alta entropia em seção `.text` (> 7.0 bits/byte) | YARA / EDR | Alta | | Proporção NOP > 15% do binário | Análise estática (IDA/Ghidra) | Alta | | Script PowerShell com > 20 funções declaradas mas < 5 chamadas únicas | AMSI / ScriptBlock logging | Média | | Hash de PE desconhecido + padrão de comportamento de downloader | EDR comportamental | Alta | | Presença de opaque predicates detectados por análise simbólica | Ferramentas de análise avançada | Baixa (requer analista) | | Tamanho do executável 2-5x maior que binário limpo equivalente | Comparação de tamanho | Média | | Arquivo com múltiplas seções de código com baixo número de instruções únicas | YARA | Média | ### Regra YARA - NOP Sled Detection ```yara rule JunkCode_NOP_Sled_x86 { meta: description = "Detecta sequências longas de NOP ou equivalentes funcionais - indicativo de junk code insertion" author = "RunkIntel" daté = "2026-03-25" reference = "https://attack.mitre.org/techniques/T1027/016/" strings: // NOP sled clássico (0x90 repetido) $nop_classic = { 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 } // XCHG EAX, EAX (equivalente funcional ao NOP em x86) $nop_xchg = { 87 C0 87 C0 87 C0 87 C0 87 C0 87 C0 87 C0 87 C0 } // ADD EAX, 0 (outro equivalente) $nop_add = { 83 C0 00 83 C0 00 83 C0 00 83 C0 00 83 C0 00 83 C0 00 } condition: uint16(0) == 0x5A4D and // PE header ( #nop_classic > 3 or #nop_xchg > 5 or #nop_add > 5 ) } ``` ## Mitigação | ID | Mitigação | Descrição | Prioridade | |----|-----------|-----------|-----------| | [[m1049-antivirusantimalware\|M1049]] | Antivírus/Antimalware | Utilizar soluções com detecção comportamental (NGAV/EDR) em vez de exclusivamente baseadas em assinatura; configurar análise de sandbox para amostras desconhecidas; habilitar telemetria de AMSI para scripts | Alta | | Application Allowlisting | Controle de Execução | Implementar WDAC (Windows Defender Application Control) ou AppLocker para restringir execução a binários assinados e conhecidos - junk code insertion é ineficaz contra whitelist estrita | Alta | | EDR com Análise Comportamental | Detecção Avançada | Priorizar EDR com capacidade de analisar comportamento em tempo de execução (chamadas de sistema, injeção de processo, conexões de rede) em vez de características estáticas do binário | Alta | | Script Block Logging | Visibilidade PowerShell | Habilitar PowerShell Script Block Logging (Event ID 4104) e AMSI; mesmo scripts ofuscados com junk code revelam sua intenção quando o PowerShell os processa e registra o conteúdo desofuscado | Alta | | Análise de Sandbox | Triagem Automatizada | Integrar sandbox (Any.run, Hybrid Analysis, Cuckoo) no pipeline de e-mail e proxy para detonar executáveis antes de entrega aos endpoints | Média | | Threat Intelligence | Contexto | Assinar feeds de IoC que incluam hashes de famílias de malware com variantes polimórficas documentadas; mesmo que um hash individual não sejá detectado, padrões de comportamento de família são mais estáveis | Média | ## Contexto Brasil/LATAM A técnica de junk code insertion é amplamente utilizada por grupos que operam no contexto brasileiro e latino-americano, especialmente no desenvolvimento de banking trojans nativos: **Banking Trojans Brasileiros e Obfuscação por Junk Code** O ecossistema de banking trojans brasileiro (Grandoreiro, Mekotio, Guildma/Astaroth, Javali) é notório pela incorporação agressiva de técnicas de obfuscação. Análises da ESET LATAM e da Kaspersky mostram que essas famílias regularmente incorporam junk code em seus loaders - especialmente em etapas de AutoIt e Delphi - para contornar antivírus populares no mercado brasileiro. **Delphi como Plataforma de Junk Code** Uma característica distintiva dos banking trojans brasileiros é o uso extensivo de Delphi como linguagem de desenvolvimento. O compilador Delphi, combinado com ofuscadores comerciais (ex: Enigma Protector, VMProtect) e junk code manual inserido nos fontes, resulta em binários notoriamente difíceis de analisar. A combinação é tão prevalente que pesquisadores de segurança reconhecem o padrão como "assinatura brasileira" de desenvolvimento de malware. **Astaroth (Guildma) - Junk Code em AutoIt** O [[s0373-astaroth|Astaroth]], banking trojan brasileiro com foco em credenciais de sistemas bancários brasileiros (especialmente Internet Banking), utiliza scripts AutoIt com extensiva inserção de junk code. Scripts analisados pela Kaspersky Brasil e ESET contêm entre 30% e 60% de código morto - funções de cálculo matemático sem resultado utilizado, loops com contador que nunca incrementa, e variáveis declaradas que nunca são lidas. **Grupos de Fraude com Capacidade de Polimorfismo** Grupos brasileiros de fraude financeira que operam em fóruns do cibercrime nacional comercializam "crypters" - ferramentas que automaticamente geram variantes polimórficas via junk code insertion e outras técnicas. Esses serviços (vendidos por R$200–R$2.000 em fóruns como BreachForums e equivalentes nacionais) permitem que mesmo atores não técnicos gerem binários com taxas de detecção inicialmente baixas. > [!tip] Recomendação para Times de Resposta a Incidentes no Brasil > Ao analisar malware suspeito de origem brasileira, especialmente em Delphi ou AutoIt, aplicar ferramentas de code normalization (ex: BinaryNinjá plugins, IDAPython scripts para remover NOPs) antes da análise manual. Considerar análise comportamental em sandbox como ponto de partida, dado que a análise estática de binários obfuscados com junk code pode consumir tempo desproporcional ao valor obtido. ## Referências - [MITRE ATT&CK - T1027.016](https://attack.mitre.org/techniques/T1027/016/) - [ESET LATAM - Latin Américan Banking Trojans](https://www.welivesecurity.com/en/eset-research/banking-trojans-latin-america/) - [Kaspersky - Guildma/Astaroth analysis](https://securelist.com/) - [Unit 42 - StrelaStealer analysis](https://unit42.paloaltonetworks.com/) - [SentinelOne - Kimsuky implant analysis](https://www.sentinelone.com/blog/) - [Mandiant - FIN7 CARBANAK technical analysis](https://www.mandiant.com/resources/blog/) - [[g0046-fin7|FIN7]] - uso de polimorfismo via junk code em CARBANAK - [[g0047-gamaredon|Gamaredon Group]] - junk code em scripts PowerShell - [[g0094-kimsuky|Kimsuky]] - dead functions em implantes .NET - [[g0050-apt32|APT32]] - junk code em macros VBA - [[s0449-maze|Maze]] - polimorfismo via junk code em ransomware - [[s1183-strelastealer|StrelaStealer]] - shellcode com NOP sleds extensivos - [[s0373-astaroth|Astaroth]] - banking trojan brasileiro com junk code AutoIt - [[t1027-002-software-packing|T1027.002 - Software Packing]] - técnica frequentemente combinada - [[t1027-001-binary-padding|T1027.001 - Binary Padding]] - técnica relacionada (diferente em objetivo) - [[Antimalware]] --- *Fonte: [MITRE ATT&CK - T1027.016](https://attack.mitre.org/techniques/T1027/016)*