Voltar para o Blog

Vazamento de 153 Milhões de Documentos: O Que Muda Para Quem Pede Foto de Identidade

Olá HaWkers, em 1º de setembro de 2026 o jornalista Brian Krebs publicou que um serviço novo na dark web, chamado Nexus, estava vendendo imagens digitalizadas de mais de 153 milhões de carteiras de motorista dos Estados Unidos e do Canadá. Junto vinham mais de 10 milhões de carteiras de identidade, mais de 3 milhões de documentos de viagem e cerca de 579 mil carteirinhas médicas. O próprio Krebs encontrou a habilitação dele, do estado da Virgínia, oferecida como amostra grátis.

Você já parou para pensar em quantos buckets guardam, agora, a foto do seu documento porque você alugou um carro, entrou num hotel ou abriu uma conta? Neste artigo eu mostro o que se sabe do caso, por que a arquitetura mais comum de verificação de identidade acumula esse risco, e o que dá para mudar no seu código ainda esta semana para não virar a próxima manchete.

O Que Aconteceu: 153 Milhões de Documentos e um Fornecedor no Meio

O rastro aponta para uma única empresa. Com base em entrevistas com pessoas cujas habilitações estavam à venda, a origem provável das imagens é a IDScan.net, uma empresa de verificação de identidade sediada em Nova Orleans, na Louisiana, que valida documentos para clientes como Hertz, FedEx, Caesars Entertainment e uma longa lista de dispensários de cannabis nos Estados Unidos.

Dois detalhes técnicos apertam o cerco. Os registros não traziam só a foto da frente e do verso: traziam também as varreduras em infravermelho e ultravioleta que os leitores profissionais fazem para conferir os elementos de segurança do plástico. E traziam carimbos de tempo que batem com o momento em que aquelas pessoas alugaram um carro ou viajaram. Nenhum vazamento de banco de dados solto na internet produz esse conjunto: isso é o que sai de um equipamento de captura, no ponto de atendimento, indo para a nuvem.

O vendedor afirmava estar exfiltrando dados de forma contínua havia mais de um ano, com o acervo sendo atualizado o tempo todo, e chegou a anunciar quase 400 mil novas habilitações adicionadas em 24 horas. Para dar dimensão pública ao acervo, a habilitação do secretário de Defesa dos Estados Unidos, Pete Hegseth, emitida em Minnesota, foi listada por 100 dólares.

O escritório do FBI em Nova Orleans abriu uma apuração oficial sobre a origem das imagens, e Krebs relatou ter sido colocado numa chamada com meia dúzia de agentes, incluindo lideranças da divisão cibernética. Gillian Cossman, diretora de operações da IDScan.net, confirmou que a empresa investigava o incidente. O site Nexus saiu do ar pouco depois da reportagem, o que não devolve nada: quem comprou, comprou.

Por Que o Fornecedor de Verificação É o Alvo Perfeito

A economia de verificação de identidade se organizou como quase toda a nossa stack: em vez de cada empresa construir leitura de documento, todas plugam o mesmo punhado de fornecedores. É a decisão certa em qualidade de detecção de fraude, e é a decisão que concentra todo o risco num ponto só.

Pense no que isso significa em volume. Uma locadora sozinha talvez guarde alguns milhões de documentos. Um fornecedor que atende locadora, hotel, casa de shows, dispensário e banco guarda a interseção de todos eles — que, no limite, é a população adulta de dois países. O atacante não precisa mais escolher um alvo: ele escolhe o fornecedor.

O segundo problema é o tempo. Uma senha vazada você troca em 30 segundos. Um número de cartão o banco reemite em três dias. Uma habilitação com foto, número, data de nascimento, endereço e assinatura vale pelos próximos cinco ou dez anos, e a única forma de "trocar" é mudar de estado. Esse é o motivo de imagem de documento ser uma categoria de dado diferente de todas as outras que você guarda: ela não expira e não tem revogação.

E existe um terceiro, mais desconfortável: quase ninguém sabe onde as imagens moram. Quando você faz upload da sua identidade num app, você tem uma relação com aquela marca. A imagem, na prática, foi para o subprocessador dela, que talvez use um armazenamento de terceiro, que replica em outra região. Foi exatamente essa cadeia que o caso Nexus expôs — as vítimas nunca ouviram falar da IDScan.net.

O Erro de Arquitetura: Guardar a Imagem Depois da Verificação

Aqui está o ponto que interessa a quem escreve código. Na esmagadora maioria dos produtos, a foto do documento é um insumo de uma decisão binária: essa pessoa tem mais de 18 anos, esse nome bate com o do cartão, esse documento é autêntico. A decisão é o que o negócio precisa. A imagem é o resíduo.

Só que o fluxo padrão faz o contrário: sobe a imagem para um bucket, roda a verificação, grava o resultado numa coluna e deixa a imagem lá, "por garantia", "por auditoria", "porque o compliance pode pedir". Anos depois ninguém lembra que o bucket existe, e ele agora tem 40 milhões de objetos.

O padrão saudável é inverter: a imagem é efêmera, o veredito é persistente. Em TypeScript, num handler de upload, isso é menos trabalho do que parece.

// Verificação em memória: a imagem nunca chega a um bucket.
import { randomUUID, createHash } from 'node:crypto';

type Veredito = {
  id: string;
  usuarioId: string;
  maiorDeIdade: boolean;
  nomeConfere: boolean;
  documentoAutentico: boolean;
  emissorUf: string; // atributo derivado, não o documento
  provedor: string;
  verificadoEm: string;
  // Impressão digital para deduplicar tentativas sem guardar a imagem.
  digestImagem: string;
};

export async function verificarDocumento(
  usuarioId: string,
  imagem: Buffer,
  nomeEsperado: string
): Promise<Veredito> {
  // 1. Manda para o provedor e recebe apenas atributos.
  const analise = await provedorKyc.analisar(imagem);

  // 2. Extrai o que o negócio realmente precisa.
  const veredito: Veredito = {
    id: randomUUID(),
    usuarioId,
    maiorDeIdade: analise.idade >= 18,
    nomeConfere: normalizar(analise.nome) === normalizar(nomeEsperado),
    documentoAutentico: analise.scoreAutenticidade > 0.9,
    emissorUf: analise.uf,
    provedor: 'provedor-x',
    verificadoEm: new Date().toISOString(),
    digestImagem: createHash('sha256').update(imagem).digest('hex'),
  };

  // 3. Descarta a imagem antes de responder. Sem bucket, sem fila, sem log.
  imagem.fill(0);

  return veredito;
}

Repare no que sobrou: nenhuma data de nascimento, nenhum número de documento, nenhuma foto. Se esse banco vazar amanhã, o atacante leva booleanos. E o digestImagem ainda permite responder "esse mesmo documento já foi usado em outra conta?" sem manter o documento.

Se Você Precisa Guardar, Guarde Com Prazo de Validade

Existem casos legítimos de retenção. Instituições financeiras brasileiras têm obrigações de guarda, e disputas de chargeback pedem evidência. A resposta não é "nunca guarde", é "guarde com prazo, com chave por registro e com apagamento automático".

Chave por registro importa porque muda a economia do vazamento. Com uma chave única para o bucket inteiro, quem obtém a chave obtém tudo. Com envelope encryption, cada documento tem a própria chave de dados, cifrada pela chave mestra do KMS. O atacante que copia o bucket leva bytes aleatórios.

// Envelope encryption + expiração: o registro se destrói sozinho.
import { KMSClient, GenerateDataKeyCommand } from '@aws-sdk/client-kms';
import { createCipheriv, randomBytes } from 'node:crypto';

const kms = new KMSClient({});
const RETENCAO_DIAS = 90;

export async function guardarComPrazo(imagem: Buffer, registroId: string) {
  // Uma chave de dados nova para cada documento.
  const { Plaintext, CiphertextBlob } = await kms.send(
    new GenerateDataKeyCommand({ KeyId: 'alias/documentos', KeySpec: 'AES_256' })
  );

  const iv = randomBytes(12);
  const cipher = createCipheriv('aes-256-gcm', Plaintext!, iv);
  const cifrado = Buffer.concat([cipher.update(imagem), cipher.final()]);

  await s3.putObject({
    Bucket: 'documentos-kyc',
    Key: `${registroId}.bin`,
    Body: Buffer.concat([iv, cipher.getAuthTag(), cifrado]),
    // A expiração vive no objeto, não numa planilha de processo.
    Expires: new Date(Date.now() + RETENCAO_DIAS * 864e5),
    Metadata: { chave: CiphertextBlob!.toString('base64') },
  });

  // Zera a chave em claro da memória assim que o uso termina.
  Plaintext!.fill(0);
}

Complete com uma regra de ciclo de vida no bucket que apague de fato os objetos depois do prazo. Política declarada na infraestrutura sobrevive à troca de time; rotina de limpeza escrita à mão morre no primeiro deploy que ninguém revisou.

O Metadado Que Ninguém Olha

O caso Nexus tem uma lição fácil de aplicar e fácil de esquecer: os registros à venda continham carimbo de tempo e as varreduras em infravermelho e ultravioleta. Ou seja, junto da identidade vazou o contexto — onde e quando aquela pessoa estava.

A mesma coisa acontece no seu upload. Uma foto tirada pelo celular chega com EXIF: modelo do aparelho, data, hora e, com frequência, coordenadas de GPS. Se você armazena o arquivo como recebeu, você não guardou um documento, guardou um documento mais a localização de quem o enviou.

// Normaliza a imagem e descarta todo metadado antes de qualquer persistência.
import sharp from 'sharp';

export async function higienizar(entrada: Buffer): Promise<Buffer> {
  return sharp(entrada)
    .rotate() // aplica a orientação e depois joga o EXIF fora
    .resize({ width: 1600, withoutEnlargement: true })
    .jpeg({ quality: 82, mozjpeg: true })
    .withMetadata({ exif: {} }) // sem GPS, sem device, sem timestamp
    .toBuffer();
}

Vale a mesma disciplina para os logs. Um console.log(req.body) num handler de upload manda a imagem inteira, em base64, para o agregador de logs — que costuma ter retenção mais longa e controle de acesso mais frouxo que o banco de dados. Ali o vazamento não precisa nem de atacante sofisticado.

Verificação de Idade Sem Pedir o Documento

A pergunta mais honesta é anterior a tudo isso: você precisa mesmo da imagem? Para uma parcela grande dos casos — verificar maioridade, confirmar residência num país, provar que a pessoa tem habilitação válida — a resposta em 2026 é não.

A Digital Credentials API do W3C chegou ao Chrome 141 e ao Safari 26 em setembro de 2025, e o Firefox já carrega uma implementação básica. Ela conversa com a carteira do sistema operacional e usa o formato mdoc, da norma ISO/IEC 18013-5, a mesma que sustenta as carteiras de motorista digitais mundo afora, incluindo a nossa CNH digital. A segunda edição da norma está em votação, com publicação prevista para o terceiro trimestre de 2026.

O que muda para o seu código é a divulgação seletiva: você pede um atributo, não um documento.

// Pede só "é maior de 18", nunca o número nem o endereço.
const resposta = await navigator.credentials.get({
  digital: {
    requests: [
      {
        protocol: 'openid4vp',
        data: {
          response_type: 'vp_token',
          nonce: nonceDoServidor, // gerado no backend, uso único
          dcql_query: {
            credentials: [
              {
                id: 'cnh',
                format: 'mso_mdoc',
                meta: { doctype_value: 'org.iso.18013.5.1.mDL' },
                // O pedido inteiro cabe em um campo booleano.
                claims: [{ path: ['org.iso.18013.5.1', 'age_over_18'] }],
              },
            ],
          },
        },
      },
    ],
  },
});

// Chega uma prova assinada de "true". Não chega foto, número nem data.
await fetch('/api/idade', { method: 'POST', body: JSON.stringify(resposta.data) });

A credencial fica cifrada no dispositivo, e o que trafega é uma prova assinada do atributo. Não existe imagem para vazar porque não existe imagem. Esse é o mesmo debate que apareceu na lei californiana AB 1856 sobre verificação de idade: a regulação empurra as plataformas para verificar, e o modo como elas verificam decide se o resultado é proteção ou um passivo de 153 milhões de registros.

O Que Perguntar Antes de Plugar um Fornecedor

Se a verificação vai para um terceiro, e quase sempre vai, o contrato é parte da arquitetura. Quatro perguntas resolvem a maior parte:

  • Vocês retêm a imagem depois do veredito? Por quanto tempo, e como eu forço o apagamento? Se a resposta for vaga, a resposta é "para sempre".
  • Quem são os subprocessadores e em que regiões os dados ficam? A lista precisa estar escrita e versionada, não numa conversa de vendas.
  • A cifra é por registro ou por bucket? Isso decide se um acesso indevido custa um documento ou todos.
  • Existe uma API para exclusão sob demanda, e ela apaga backup? Sob a LGPD e o GDPR você é o controlador. A obrigação de atender ao titular é sua, mesmo que o dado esteja com o fornecedor.

Some a isso o básico de higiene: credencial de API do fornecedor com rotação, escopo mínimo, e alerta de volume. O vendedor do Nexus dizia exfiltrar por mais de um ano, com 400 mil registros em 24 horas. Um gráfico de leitura por credencial teria gritado muito antes.

O Que Fazer Do Lado de Cá

Como usuário, o que dá para fazer é limitado, mas não é nada. Pergunte por que um estabelecimento precisa copiar seu documento e o que acontece com a cópia. Prefira o crachá digital ou a leitura no local em vez de mandar a foto por e-mail ou WhatsApp. Ative o alerta de crédito nos birôs. E desconfie de abordagens que citam dados corretos do seu documento: com um acervo desses, o golpe de engenharia social fica convincente por padrão.

O ponto mais amplo é o mesmo que discuti no post sobre o processo do WhatsApp em torno da criptografia de ponta a ponta: dado que existe é dado que pode ser pedido, roubado ou vendido. A única proteção que não depende da competência de terceiros é o dado que nunca foi coletado.

O Que Isso Deixa Para 2026

Três leituras práticas.

A primeira é que a era de "sobe a foto do documento" está no fim, e não por bondade: ela está saindo caro. Reguladores europeus já tratam retenção de imagem de documento como desproporcional quando existe alternativa técnica, e agora existe alternativa técnica em navegador estável.

A segunda é que verificação de identidade virou dependência crítica, do mesmo nível de um provedor de pagamento. Merece plano de contingência, revisão de contrato e monitoramento de volume — não uma integração feita numa sprint e nunca mais tocada.

A terceira é a mais direta. Abra hoje o inventário de onde o seu produto guarda imagem de documento. Meça quantos objetos existem, desde quando, e quantos ainda seriam necessários se você apagasse tudo que passou do prazo. Na maioria dos times essa conta assusta, e é justamente por isso que ela vale ser feita antes que alguém de fora a faça por você.

Bora pra cima! 🦅

📚 Quer Acompanhar o Que Vem Por Aí?

Este artigo cobriu o vazamento de 153 milhões de documentos e o que ele muda na verificação de identidade, mas o ecossistema muda toda semana e nem tudo vira artigo aqui.

No X eu compartilho o que estou testando, os bastidores dos projetos e as novidades que aparecem antes de virarem post.

Me Segue Lá

👉 Seguir @jeffbruchado no X

💡 Conteúdo diário sobre desenvolvimento, carreira e as ferramentas que eu realmente uso

Comentários (0)

Esse artigo ainda não possui comentários 😢. Seja o primeiro! 🚀🦅

Adicionar comentário