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á
💡 Conteúdo diário sobre desenvolvimento, carreira e as ferramentas que eu realmente uso

