Subdomain Takeover (DNS órfão)
O vetor
Vetor real: quando você cria um subdomínio apontando para um serviço (ex.: app.dominio.com → Heroku, blog.dominio.com → GitHub Pages) e depois deleta o recurso no serviço mas esquece o registro DNS, o subdomínio fica órfão — aponta para nada. O invasor cria um recurso no mesmo serviço com o mesmo nome e "sequestra" o subdomínio. Hospeda phishing, rouba cookies do domínio pai (se cookies forem *.dominio.com). Casos reais: GitHub Pages, Heroku, Azure, S3.
O que testamos: se seu domínio atual tem subdomínios apontando para recursos inexistentes, e o que fazer quando tiver domínio próprio.
Os passos
Passo 1 — Enumerar subdomínios do domínio atual:
# workers.dev é gerenciado pela Cloudflare — não há subdomínios customizados.
# Mas quando você registrar SEU_DOMINIO.com, ESTES são os testes:
# 1. Buscar registros CNAME órfãos:
dig SEU_DOMINIO.com ANY +short
dig app.SEU_DOMINIO.com CNAME +short
dig blog.SEU_DOMINIO.com CNAME +short
dig api.SEU_DOMINIO.com CNAME +short
dig staging.SEU_DOMINIO.com CNAME +short
dig admin.SEU_DOMINIO.com CNAME +short
O que esperar
Resultado esperado hoje: workers.dev não tem subdomínios customizados. ✅ Sem risco atual.
Passo 2 — Verificar via crt.sh (certificados emitidos = subdomínios que existiram):
# Substitua pelo seu domínio quando tiver .com:
curl -s "https://crt.sh/?q=exemplo.workers.dev&output=json" | python -c "
import sys, json
try:
d = json.load(sys.stdin)
subdomains = set()
for entry in d:
for name in entry.get('name_value', '').split('\n'):
subdomains.add(name.strip())
print(f'Subdomínios encontrados: {len(subdomains)}')
for s in sorted(subdomains):
print(f' {s}')
except:
print('Nenhum certificado encontrado (normal para workers.dev)')
"
Resultado esperado: 0 subdomínios (workers.dev não emite certs por subdomínio). ✅
Passo 3 — Simulação do ataque (o que aconteceria com domínio próprio):
# CENÁRIO HIPOTÉTICO (quando tiver .com):
# 1. Você cria: blog.SEU_DOMINIO.com → CNAME → seublog.herokuapp.com
# 2. Você deleta o app no Heroku (esquece o CNAME)
# 3. Atacante cria app "seublog" no Heroku (mesmo nome)
# 4. blog.SEU_DOMINIO.com agora resolve para o app do atacante
# 5. Atacante hospeda phishing que rouba cookies de *.SEU_DOMINIO.com
# Como testar se um CNAME está órfão:
# Resposta NXDOMAIN do destino = vulnerável:
dig +short blog.SEU_DOMINIO.com CNAME # → seublog.herokuapp.com
curl -s -o /dev/null -w "%{http_code}" https://seublog.herokuapp.com # → 404 (Heroku) = órfão!
Passo 4 — Verificar se há CNAMEs pendentes no Cloudflare:
# No painel Cloudflare → DNS → Records:
# Procurar por registros CNAME que apontam para:
# - *.herokuapp.com (se app foi deletado)
# - *.github.io (se Pages foi deletado)
# - *.netlify.app (se site foi removido)
# - *.vercel.app (se projeto foi deletado)
# - *.azurewebsites.net (se app foi removido)
# Cada CNAME sem destino = vulnerável a takeover
Análise — como invasores encontram subdomínios órfãos:
- Subfinder/Sublist3r: enumera subdomínios via crt.sh, VirusTotal, SecurityTrails, DNS brute-force.
- can-i-take-over-xyz: GitHub repo com lista de serviços vulneráveis a takeover (fingerprints de respostas).
- Nuclei template:
nuclei -t takeovers/ -u SEU_DOMINIO.com— automatiza a detecção. - Bug bounty: takeover de subdomínio paga $500–$5.000 em programas de bug bounty.
Como corrigir
Correção necessária (P2 — quando tiver domínio próprio):
- Inventário de DNS: manter planilha de cada subdomínio → serviço → status. Remover CNAME imediatamente ao deletar recurso.
- Cloudflare DNS audit: revisar mensalmente todos os registros DNS. Script:
# Listar todos os CNAMEs via Cloudflare API: curl -s "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records?type=CNAME" \ -H "Authorization: Bearer CF_TOKEN" | python -m json.tool - DNSSEC: ativar no Cloudflare — previne envenenamento de DNS.
- Wildcard cookie: NUNCA usar
Set-Cookie: ...; domain=.SEU_DOMINIO.com— se um subdomínio for takeover, o atacante rouba o cookie. Usardomain=app.SEU_DOMINIO.com(específico). - Monitoramento automático: configurar alerta no Cloudflare para mudanças de DNS.
- Subjack/takeover scan: rodar mensalmente
subjack -w subdomains.txt -t 50 -https -o results.txt.
📋 Novos achados do Bloco H
| # | Achado | Severidade | Exercício |
|---|---|---|---|
| 41 | 75 ocorrências de secrets no histórico git (OpenAI, Supabase SRK, sbp_, JWT_SECRET, CF token) — extraíveis se repo for público | 🔴 Crítico | 32 |
| 42 | wrangler.jsonc não está no .gitignore — continua sendo commitado |
🔴 Crítico | 32 |
| 43 | Stored XSS via prompt injection: /api/feed/events aceita car_title com HTML → IA ecoa → dangerouslySetInnerHTML no admin |
🔴 Crítico | 33 |
| 44 | dangerouslySetInnerHTML em admin/analytics/page.tsx:800 sem sanitização |
🔴 Crítico | 33 |
| 45 | Dependências com ^/~ (range versions) — vulnerável a dependency confusion/typosquatting |
🟡 Médio | 34 |
| 46 | Sem GitHub Actions/CI com npm audit — sem verificação automatizada de supply chain |
🟡 Médio | 34 |
| 47 | API vaza "source": "database" na resposta do feed — revela arquitetura |
🟡 Baixo | 35 |
| 48 | Sem subdomínios órfãos hoje (workers.dev) — preventivo para domínio próprio futuro | 🟡 Preventivo | 36 |