# 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)