Breach notification: como notificar a ANPD em caso de vazamento de CPFs

Guia completo sobre breach notification na LGPD, incluindo prazos, conteúdo da notificação e fluxo técnico para responder a vazamentos de CPF.

Redação CPFHub.io
Redação CPFHub.io
··8 min de leitura
Breach notification: como notificar a ANPD em caso de vazamento de CPFs

Quando um incidente de segurança envolve dados de CPF, a LGPD exige que o controlador notifique a ANPD e os titulares afetados em até 2 dias úteis após tomar conhecimento do ocorrido. Empresas que não têm processos de resposta documentados costumam perder esse prazo — o que agrava as consequências jurídicas e reputacionais do incidente.

Introdução

Vazamentos de dados são uma realidade que nenhuma empresa deseja enfrentar, mas para a qual todas devem estar preparadas. Quando um incidente de segurança envolve dados de CPF, a LGPD exige que o controlador notifique tanto a ANPD quanto os titulares afetados em prazo razoável. A falta de uma resposta rápida e adequada pode agravar significativamente as consequências legais e reputacionais.


O que a LGPD exige sobre notificação de incidentes

O artigo 48 da LGPD determina que o controlador deve comunicar à ANPD e ao titular a ocorrência de incidente de segurança que possa acarretar risco ou dano relevante aos titulares. A comunicação deve conter, no mínimo:

  • Descrição da natureza dos dados pessoais afetados.
  • Informações sobre os titulares envolvidos.
  • Indicação das medidas técnicas e de segurança utilizadas.
  • Riscos relacionados ao incidente.
  • Motivos da demora, caso a comunicação não tenha sido imediata.
  • Medidas adotadas ou a serem adotadas para reverter ou mitigar os efeitos do incidente.

Prazo de notificação

A ANPD recomenda que a comunicação seja feita em até 2 dias úteis após o conhecimento do incidente, conforme Resolução CD/ANPD n. 15/2024.


Fluxo de resposta a incidentes

Etapas do processo

  1. Detecção: identificação do incidente por sistemas de monitoramento ou denúncia.
  2. Contenção: ações imediatas para limitar a extensão do vazamento.
  3. Avaliação: análise do escopo, tipo de dados afetados e número de titulares.
  4. Notificação à ANPD: comunicação formal dentro do prazo legal.
  5. Notificação aos titulares: comunicação clara e acessível.
  6. Remediação: correção das vulnerabilidades e implementação de melhorias.
  7. Documentação: registro completo do incidente para auditoria.

Sistema automatizado de detecção e resposta

Detector de anomalias em acessos a CPF

import json
import logging
from datetime import datetime, timezone, timedelta
from collections import defaultdict
from typing import List, Dict

logging.basicConfig(
    filename="incident_response.log",
    level=logging.INFO,
    format="%(asctime)s | %(levelname)s | %(message)s"
)

class DetectorVazamentoCPF:
    """Detecta padrões anômalos que podem indicar vazamento de dados de CPF."""

    def __init__(self):
    self.acessos_por_usuario = defaultdict(list)
    self.acessos_por_ip = defaultdict(list)
    self.alertas = []

    def registrar_acesso(self, usuario: str, ip: str, cpf_masked: str):
    """Registra um acesso e verifica anomalias."""

    agora = datetime.now(timezone.utc)
    registro = {"timestamp": agora, "cpf": cpf_masked, "ip": ip}

    self.acessos_por_usuario[usuario].append(registro)
    self.acessos_por_ip[ip].append(registro)

    # Verificar anomalias
    self._verificar_volume_excessivo(usuario, agora)
    self._verificar_ip_anomalo(usuario, ip)
    self._verificar_horario_incomum(usuario, agora)

    def _verificar_volume_excessivo(self, usuario: str, agora: datetime):
    """Detecta volume anormal de consultas."""

    uma_hora_atras = agora - timedelta(hours=1)
    acessos_recentes = [
    a for a in self.acessos_por_usuario[usuario]
    if a["timestamp"] > uma_hora_atras
    ]

    if len(acessos_recentes) > 100:
    alerta = {
    "tipo": "VOLUME_EXCESSIVO",
    "severidade": "CRITICA",
    "usuario": usuario,
    "consultas_ultima_hora": len(acessos_recentes),
    "timestamp": agora.isoformat()
    }
    self.alertas.append(alerta)
    logging.critical(json.dumps(alerta))

    def _verificar_ip_anomalo(self, usuario: str, ip: str):
    """Detecta acesso de IP não usual."""

    ips_conhecidos = set(
    a["ip"] for a in self.acessos_por_usuario[usuario][:-1]
    )

    if ips_conhecidos and ip not in ips_conhecidos:
    alerta = {
    "tipo": "IP_ANOMALO",
    "severidade": "ALTA",
    "usuario": usuario,
    "ip_novo": ip,
    "ips_conhecidos": list(ips_conhecidos)[:5],
    "timestamp": datetime.now(timezone.utc).isoformat()
    }
    self.alertas.append(alerta)
    logging.warning(json.dumps(alerta))

    def _verificar_horario_incomum(self, usuario: str, agora: datetime):
    """Detecta acesso fora do horário comercial."""

    hora = agora.hour
    if hora < 6 or hora > 23:
    alerta = {
    "tipo": "HORARIO_INCOMUM",
    "severidade": "MEDIA",
    "usuario": usuario,
    "hora": hora,
    "timestamp": agora.isoformat()
    }
    self.alertas.append(alerta)
    logging.warning(json.dumps(alerta))

    def obter_alertas_criticos(self) -> List[Dict]:
    """Retorna alertas que podem indicar vazamento."""
    return [a for a in self.alertas if a["severidade"] == "CRITICA"]

Gerador de notificação para ANPD

from dataclasses import dataclass, field
from typing import List

@dataclass
class NotificacaoANPD:
    """Gera a notificação formal para a ANPD conforme exigências da LGPD."""

    controlador: str
    cnpj: str
    dpo_nome: str
    dpo_email: str
    data_incidente: str
    data_deteccao: str
    dados_afetados: List[str]
    titulares_afetados: int
    descricao_incidente: str
    medidas_seguranca: List[str]
    medidas_mitigacao: List[str]
    riscos: List[str]

    def gerar_documento(self) -> dict:
    """Gera o documento de notificação estruturado."""

    return {
    "comunicacao_incidente_seguranca": {
    "controlador": {
    "razao_social": self.controlador,
    "cnpj": self.cnpj,
    "encarregado": {
    "nome": self.dpo_nome,
    "email": self.dpo_email
    }
    },
    "incidente": {
    "data_ocorrencia": self.data_incidente,
    "data_conhecimento": self.data_deteccao,
    "descricao": self.descricao_incidente,
    "dados_pessoais_afetados": self.dados_afetados,
    "numero_titulares_afetados": self.titulares_afetados,
    "categoria_titulares": "clientes"
    },
    "medidas": {
    "seguranca_preexistentes": self.medidas_seguranca,
    "mitigacao_adotadas": self.medidas_mitigacao
    },
    "riscos": self.riscos,
    "comunicacao_titulares": {
    "realizada": True,
    "meio": "e-mail individual",
    "data": self.data_deteccao
    }
    }
    }

# Exemplo de uso
notificacao = NotificacaoANPD(
    controlador="Empresa XYZ Ltda",
    cnpj="12.345.678/0001-00",
    dpo_nome="Carlos Souza",
    dpo_email="dpo@empresa.com.br",
    data_incidente="2025-08-08",
    data_deteccao="2025-08-09",
    dados_afetados=["CPF", "Nome completo", "Data de nascimento"],
    titulares_afetados=1500,
    descricao_incidente="Acesso não autorizado ao banco de dados de clientes via credencial comprometida.",
    medidas_seguranca=[
    "Criptografia AES-256 em repouso",
    "Controle de acesso RBAC",
    "Logs de auditoria ativos"
    ],
    medidas_mitigacao=[
    "Credencial comprometida revogada imediatamente",
    "Forçado reset de senha para todos os administradores",
    "Bloqueio do IP de origem do ataque",
    "Notificação aos titulares afetados via e-mail"
    ],
    riscos=[
    "Possibilidade de fraude identitária com dados de CPF expostos",
    "Risco de engenharia social usando nome e data de nascimento"
    ]
)

documento = notificacao.gerar_documento()
print(json.dumps(documento, indent=2, ensure_ascii=False))

Comunicação aos titulares

A comunicação aos titulares deve ser redigida em linguagem clara e acessível, contendo:

  • O que aconteceu e quando.
  • Quais dados foram afetados.
  • Quais riscos o titular pode enfrentar.
  • O que a empresa está fazendo para resolver.
  • O que o titular pode fazer para se proteger.
  • Canais de contato para dúvidas.

Verificação de dados afetados via API

# Verificar se um CPF específico foi afetado
curl -X GET "https://api.cpfhub.io/cpf/12345678901" \
    -H "x-api-key: SUA_API_KEY" \
    -H "Accept: application/json" \
    --max-time 30

Pós-incidente e lições aprendidas

Após a resolução do incidente, conduza uma análise de causa raiz e documente:

  • Cronologia completa do incidente.
  • Vulnerabilidades exploradas.
  • Eficácia das medidas de detecção e resposta.
  • Melhorias implementadas.
  • Custo estimado do incidente.
  • Atualização do plano de resposta a incidentes.

Preparação preventiva

  • Plano de resposta a incidentes documentado e testado: realize simulações pelo menos semestralmente.
  • Equipe de resposta definida: cada membro deve conhecer suas responsabilidades.
  • Templates de notificação prontos: tenha modelos de comunicação para ANPD e titulares pré-aprovados pelo jurídico.
  • Contatos atualizados: mantenha lista atualizada de contatos da ANPD, DPO e equipe jurídica.
  • Seguro cibernético: considere contratar seguro para cobrir custos de resposta a incidentes.

Perguntas frequentes

A ANPD recomenda a comunicação em até 2 dias úteis após o conhecimento do incidente, conforme a Resolução CD/ANPD n. 15/2024. O prazo começa a contar a partir do momento em que a empresa toma ciência do incidente, não da data em que ele ocorreu. A demora injustificada pode agravar as penalidades aplicadas.

O que acontece se a empresa não notificar a ANPD dentro do prazo?

A LGPD prevê advertência, multa de até 2% do faturamento (limitada a R$50 milhões por infração) e publicização da infração. A ausência de notificação ou a notificação intempestiva são fatores agravantes na análise da ANPD, conforme os critérios estabelecidos na Resolução CD/ANPD n. 4/2021.

Como garantir conformidade com a LGPD ao usar uma API de CPF?

Use o CPF apenas para a finalidade declarada ao titular, armazene apenas o necessário (não guarde o CPF cru se um token bastar), implemente controle de acesso aos logs de consulta e documente a base legal para o tratamento. A ANPD orienta que dados de identificação devem ser tratados com o princípio da necessidade.

A API CPFHub.io bloqueia quando o limite de consultas é atingido?

Não. A API não bloqueia em nenhum cenário. Ao atingir o limite do plano, cada consulta adicional é cobrada a R$0,15. O plano gratuito inclui 50 consultas por mês sem cartão de crédito — suficiente para validação de CPFs afetados durante uma resposta a incidente.


Conclusão

A preparação para breach notification não é paranoia — é diligência. Empresas que processam dados de CPF devem ter planos de resposta a incidentes documentados, testados e prontos para execução imediata. A combinação de sistemas de detecção automatizados, processos claros de notificação e comunicação transparente com a ANPD e os titulares pode ser a diferença entre uma crise controlada e um desastre reputacional.

Utilize APIs que operem com os mais altos padrões de segurança para minimizar riscos desde a origem. Cadastre-se em cpfhub.io — 50 consultas mensais gratuitas, sem cartão de crédito.

CPFHub.io

Pronto para integrar a API?

50 consultas gratuitas para testar agora. Sem cartão de crédito. Acesso imediato à documentação.

Redação CPFHub.io

Sobre a redação

Redação CPFHub.io

Time editorial especializado em APIs de CPF, identidade digital e compliance no mercado brasileiro. Produzimos guias técnicos, análises regulatórias e tutoriais sobre LGPD e KYC para desenvolvedores e líderes de produto.

WhatsAppFale conosco via WhatsApp