Hack da Binance em 2026: Como US$ 6,3 Bilhões Saíram em 20 Minutos Sem Vazar Chave
Olá HaWkers, no dia 29 de outubro de 2026 a Binance perdeu cerca de US$ 6,3 bilhões, no que já é tratado como o maior roubo de criptomoedas da história. A marca anterior era de US$ 1,5 bilhão, levados da Bybit em fevereiro de 2025. A TRM Labs calcula que quase tudo saiu em cerca de 20 minutos, por dez blockchains diferentes. E o detalhe mais incômodo para quem programa: a Binance diz que não encontrou nenhuma evidência de chave privada vazada.
Se a chave não vazou, como o dinheiro saiu? Essa é a pergunta que interessa mesmo para quem nunca tocou em cripto, porque a resposta provável vale para qualquer sistema que mova dinheiro, aprove reembolso ou faça deploy em produção. Neste artigo você vai ver o que está confirmado, o que ainda é hipótese, como funciona o EIP-7702 e três controles em código que dá para adaptar no seu backend.
O Que Está Confirmado e o Que Ainda É Hipótese
Antes de qualquer lição, uma ressalva: a investigação continua aberta e a Binance prometeu publicar os detalhes técnicos só depois de concluí-la. Boa parte do que circula é reconstrução de empresas de análise on-chain, não relatório oficial. Separar as duas coisas evita tirar conclusão errada.
| Afirmação | Quem diz | Situação |
|---|---|---|
| Cerca de US$ 6,3 bilhões roubados | Binance | Estimativa; pode mudar |
| US$ 6,36 bilhões em dez blockchains | TRM Labs | Estimativa independente |
| Cerca de US$ 5,9 bilhões no momento do roubo | Chainalysis | Estimativa revisada |
| Laptop de engenheiro de DevOps comprometido | Binance | Hipótese inicial; depois vieram "pontos adicionais de invasão" |
| Nenhuma evidência de chave privada vazada | Binance | Declaração da empresa, contestada por Mark Karpeles, ex-Mt. Gox |
| Autoria do grupo norte-coreano TraderTraitor | FBI, TRM Labs, Chainalysis | Atribuição do FBI em 31 de outubro |
| O sistema de assinatura foi induzido a assinar | TRM Labs | Avaliação de analistas |
A diferença entre os valores vem do método: cotação usada, momento do cálculo e o que entra na conta. O título que puxou a discussão no Hacker News falava em US$ 5,6 bilhões, e o painel da Arkham chegou a mostrar mais de US$ 5,7 bilhões nas carteiras do atacante.
Também vale registrar o que a Binance afirma sobre clientes: o ataque teria atingido hot wallets da própria empresa, ou seja, carteiras conectadas usadas para operar saques, e o prejuízo sai do caixa dela. A empresa reservou cerca de US$ 6,34 bilhões, incluindo o fundo SAFU de US$ 1 bilhão, e disse em 31 de outubro já ter reposto 90% dos ativos.
A Linha do Tempo do Ataque
A reconstrução da TRM Labs mostra uma operação ensaiada, não um golpe de oportunidade. A carteira do operador recebeu três pequenas retiradas da Tornado Cash a partir de 28 de outubro, pelo menos 36 horas antes do roubo. Na madrugada do dia 29, o código de ataque foi publicado e testado em duas carteiras, com um ensaio final numa terceira. Cerca de quatro horas depois, o mesmo código foi usado contra a Binance.
| Horário (UTC) | O que aconteceu |
|---|---|
| 20:05 | Começa o saque no XRP Ledger; cinco carteiras esvaziadas até o saldo mínimo |
| 20:20 | Carteira quente de Bitcoin envia 18.270 BTC ao atacante |
| 20:24 | Transação principal no Ethereum, segundo a linha do tempo pública do caso |
| Cerca de 21:01 | Tether começa a congelar carteiras; a Circle vem três minutos depois |
| 00:10 (dia 30) | Binance remove as permissões do atacante na hot wallet |
Na rede Tron, 612,7 milhões de USDT saíram em dois minutos. No Ethereum, uma única varredura levou 167.464 ETH e 1,615 bilhão de USDT.
Repare no intervalo entre a primeira transação e a remoção do acesso: cerca de quatro horas. Foi nesse período que o atacante seguiu limpando a carteira conforme entrava dinheiro novo. Em incidente, o tempo até revogar costuma custar mais do que o tempo até detectar.
Os congelamentos salvaram parte do valor. Tether e Circle congelaram mais de US$ 2,3 bilhões em stablecoins, e as estimativas de total congelado ficam entre US$ 2,7 bilhões e US$ 3 bilhões. O Bitcoin não tem esse botão: não existe emissor capaz de congelar os US$ 1,5 bilhão em BTC.
O Que É o EIP-7702 e Por Que Ele Apareceu Aqui
O EIP-7702 entrou no Ethereum com a atualização Pectra, em maio de 2025. Ele permite que uma conta comum, controlada por chave privada, delegue seu comportamento para o código de um smart contract. A ideia é boa: dá recursos de carteira inteligente, como lotes de transações e pagamento de taxa por terceiros, sem trocar de endereço.
Na prática, a conta assina uma autorização com três campos: chain_id, endereço do contrato e nonce. Essa autorização vai numa transação do tipo 0x04, e a rede grava no endereço da conta o prefixo 0xef0100 seguido do endereço do contrato. Daí em diante, qualquer chamada para aquela conta executa o código do contrato. E isso persiste: a delegação fica ativa até outra autorização trocá-la ou limpá-la.
Segundo a TRM Labs, foi aqui que o atacante agiu no Ethereum. Uma transação carregou 50 autorizações pré-assinadas, todas apontando a hot wallet para um contrato de varredura que só ele podia chamar. Por que 50? Porque o nonce da autorização precisa ser igual ao nonce atual da conta, e uma carteira de exchange movimentada avança esse número o tempo todo. Com 50 valores consecutivos assinados, ao menos um estaria válido na hora da execução.
Depois da delegação, o atacante não precisava mais de assinatura nova da Binance. A carteira virou uma máquina de varredura, usada mais seis vezes em cerca de 3,5 horas.
O EIP-7702 não tem um bug conhecido envolvido neste caso. Richard Teng, co-CEO da Binance, disse que a delegação contornou controles normais de aprovação, mas a falha mais provável está em quem podia pedir assinaturas, não no padrão. A especificação já avisa que um delegado malicioso pode assumir "quase controle total" da conta e que carteiras não deveriam deixar aplicações pedirem esse tipo de assinatura.
Dá para checar se um endereço está delegado com uma chamada comum de RPC:
// Verifica se um endereço Ethereum tem delegação EIP-7702 ativa
// Requer Node.js 18+ (fetch nativo)
const RPC_URL = 'https://ethereum-rpc.publicnode.com';
const DELEGATION_PREFIX = '0xef0100';
async function getDelegation(address) {
const response = await fetch(RPC_URL, {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'eth_getCode',
params: [address, 'latest'],
}),
});
const { result, error } = await response.json();
if (error) throw new Error(error.message);
const code = result.toLowerCase();
// Conta delegada tem exatamente 23 bytes: prefixo (3) + endereço (20)
const isDelegated = code.startsWith(DELEGATION_PREFIX) && code.length === 48;
return isDelegated ? `0x${code.slice(DELEGATION_PREFIX.length)}` : null;
}
// Rode isso em loop nas suas carteiras operacionais:
// um retorno inesperado aqui deve abrir incidente na hora
const delegate = await getDelegation(
'0x0000000000000000000000000000000000000000'
);
console.log(delegate ?? 'Sem delegação ativa');A Lição Real: Assinar Não É Autorizar
Se a Binance estiver certa sobre as chaves, o atacante não roubou o cofre: convenceu o cofre a abrir. A TRM Labs nota que as outras nove redes, com tipos de chave e esquemas de assinatura diferentes, soltaram fundos por transferências comuns e assinadas. A conclusão dela é que o atacante provavelmente ganhou a capacidade de fazer o sistema de assinatura assinar o que quisesse. A Bybit caiu por um caminho parecido, e o padrão vem de longe: comprometa quem tem acesso privilegiado e chegue ao sistema que move dinheiro.
Troque "hot wallet" por "serviço de pagamentos", "API de reembolso" ou "pipeline de deploy". O problema é igual: um serviço interno que confia em qualquer requisição bem formada vinda de dentro da rede. Confiança automática também é o que torna perigoso o install de todo dia, como mostrou o caso GemStuffer no RubyGems: o que chega por um canal conhecido entra sem conferência.
O analista Kok Tin Gan, da NyxLab, descreveu o caso como aparentando uma assinatura que gerou um token de acesso total e sem expiração, avisando que trabalhava com evidência pública incompleta. Verdadeira ou não neste caso, é a imagem certa do que não ter em produção.
Três Controles Para Aplicar no Seu Backend
A lista abaixo parte do que a TRM Labs e especialistas ouvidos pela imprensa recomendaram depois do ataque. O código é um ponto de partida, não um sistema pronto.
Controle 1: Uma Política de Assinatura Fora do Serviço Que Pede
O primeiro controle é um motor de política que recebe o pedido e decide, rodando separado do serviço que pediu. Se ele viver no mesmo processo, quem invadir o processo desliga a política junto.
// Política de assinatura: nega por padrão e explica cada recusa
type SignRequest = {
kind: 'transfer' | 'contract_call' | 'set_code';
chain: string;
to: string;
valueUsd: number;
requestedBy: string;
approvals: string[];
};
type Decision = { allowed: boolean; reason: string };
const LIMIT_WITHOUT_APPROVAL_USD = 10_000;
const REQUIRED_APPROVERS = 2;
function evaluate(request: SignRequest, allowlist: Set<string>): Decision {
// Delegação nunca é rotina em carteira operacional
if (request.kind === 'set_code') {
return { allowed: false, reason: 'delegação EIP-7702 bloqueada' };
}
if (!allowlist.has(`${request.chain}:${request.to.toLowerCase()}`)) {
return { allowed: false, reason: 'destino fora da lista permitida' };
}
if (request.valueUsd <= LIMIT_WITHOUT_APPROVAL_USD) {
return { allowed: true, reason: 'dentro do limite automático' };
}
// Quem pediu não pode aprovar o próprio pedido
const independent = new Set(
request.approvals.filter(person => person !== request.requestedBy)
);
return independent.size >= REQUIRED_APPROVERS
? { allowed: true, reason: 'aprovações independentes suficientes' }
: { allowed: false, reason: 'faltam aprovações independentes' };
}Os valores acima são exemplos; ajuste ao seu volume. A TRM Labs recomenda rejeitar autorizações inesperadas de EIP-7702 e tratar pedidos anômalos, como 50 autorizações numa faixa de nonce, como indicador de comprometimento. Por isso uma recusa em set_code deveria disparar alerta crítico, não só uma linha de log. Jason Soroko, da Sectigo, lembra outro ponto: várias aprovações protegem pouco se um único invasor controla todas. Cada aprovador precisa estar numa identidade e num dispositivo separados.
Controle 2: Credencial Curta e Presa a Um Pedido
Credencial de longa duração é o que transforma um laptop invadido em bilhões perdidos. Um token de aprovação deveria valer por poucos minutos, servir uma única vez e valer só para aquele pedido exato. Este exemplo usa a biblioteca jose:
// Token de aprovação curto, de uso único e amarrado ao conteúdo do pedido
import { createHash, randomUUID } from 'node:crypto';
import { SignJWT, jwtVerify } from 'jose';
const secret = new TextEncoder().encode(process.env.APPROVAL_SECRET);
const usedTokens = new Set<string>(); // Em produção, use Redis com TTL
const hashRequest = (request: object) =>
createHash('sha256').update(JSON.stringify(request)).digest('hex');
export async function issueApproval(request: object, approver: string) {
return new SignJWT({ requestHash: hashRequest(request) })
.setProtectedHeader({ alg: 'HS256' })
.setSubject(approver)
.setJti(randomUUID())
.setIssuedAt()
.setExpirationTime('2m') // Nada de token sem expiração
.sign(secret);
}
export async function consumeApproval(token: string, request: object) {
const { payload } = await jwtVerify(token, secret, {
algorithms: ['HS256'],
});
// Token roubado não serve para outro destino ou outro valor
if (payload.requestHash !== hashRequest(request)) {
throw new Error('Aprovação não corresponde a este pedido');
}
if (!payload.jti || usedTokens.has(payload.jti)) {
throw new Error('Aprovação já utilizada');
}
usedTokens.add(payload.jti);
return payload.sub;
}Duas observações para levar isso a sério. Primeiro, serialize o pedido de forma canônica: JSON.stringify depende da ordem das chaves, então ordene antes de gerar o hash. Segundo, um segredo HS256 compartilhado permite a quem o tiver emitir tokens; em sistema de alto valor, prefira assinatura assimétrica com a chave privada num HSM ou KMS.
Controle 3: Disjuntor Por Volume
Política olha um pedido por vez. O roubo aconteceu na soma de muitos. Um disjuntor mede o total que saiu numa janela de tempo e para tudo quando passa do normal. Se o atacante precisa de 20 minutos, parar no minuto dois muda o tamanho do prejuízo.
// Disjuntor: pausa as saídas quando o volume da janela foge do normal
class WithdrawalBreaker {
private events: { at: number; usd: number }[] = [];
private tripped = false;
constructor(
private readonly windowMs: number,
private readonly maxUsd: number,
private readonly onTrip: (totalUsd: number) => void
) {}
// Chame antes de assinar; retorna false se a saída deve parar
allow(usd: number, now = Date.now()): boolean {
if (this.tripped) return false;
this.events = this.events.filter(e => now - e.at < this.windowMs);
const total = this.events.reduce((sum, e) => sum + e.usd, 0) + usd;
if (total > this.maxUsd) {
this.tripped = true;
this.onTrip(total);
return false;
}
this.events.push({ at: now, usd });
return true;
}
// Reset é manual de propósito: quem religa é uma pessoa
reset() {
this.tripped = false;
this.events = [];
}
}
// Exemplo: até US$ 2 milhões em 10 minutos
const breaker = new WithdrawalBreaker(10 * 60 * 1000, 2_000_000, total => {
console.error(`Saídas pausadas: US$ ${total} na janela`);
});Guarde esse estado num armazenamento compartilhado: com várias réplicas, um contador em memória vira vários disjuntores independentes. E rode o componente fora do alcance do serviço que assina, pela mesma razão do controle anterior.
O Que Fazer Se Você Não Trabalha Com Cripto
A maior parte destas medidas vale para qualquer backend. Se precisar priorizar, comece por aqui:
- Trate máquina de DevOps como infraestrutura privilegiada. O laptop de quem tem acesso à produção merece monitoramento e proteção de servidor crítico.
- Dê acesso temporário. Acesso de produção é concedido sob aprovação e expira sozinho, inclusive para contas de serviço e agentes de IA.
- Use MFA resistente a phishing e sessão curta. No caso Bybit, o atacante reaproveitou um token de sessão AWS que já tinha passado pelo MFA.
- Pratique a revogação. Tenha um caminho testado para cortar credenciais e delegações em minutos, e saiba quem aciona.
- Conheça seus parceiros de resposta antes do incidente. A Tether congelou 971,1 milhões de USDT 37 minutos após a varredura principal; isso só funciona com canal aberto.
- Mantenha o patch em dia. Invasão inicial muitas vezes é banal, como mostrou a corrida para proteger servidores contra o PHP2Shell.
Se você guarda criptomoedas em corretora, a recomendação prática é simples: desconfie de qualquer mensagem pedindo para "verificar" conta ou "resgatar" fundos por causa do hack. Golpistas adoram notícia grande. Consulte o status somente no aplicativo ou no site oficial.
O Que Acompanhar nos Próximos Dias
Três coisas ainda podem mudar a leitura deste caso.
Saques. A reabertura está sendo feita por etapas: Bitcoin voltou primeiro, e em 1º de novembro entraram USDT, USDC, ETH e BNB nas redes Ethereum e BNB Smart Chain. Outras redes ainda aguardam liberação.
Prova de reservas. A Binance prometeu um relatório completo, mas as fontes divergem entre 2 e 3 de novembro. Ele deve cobrir dez tokens, incluindo BTC, ETH, USDT, BNB, SOL e USDC. Prova de reservas sem passivos conta só metade da história, então vale olhar a metodologia.
Dinheiro restante. A TRM Labs calcula que o atacante ainda controla mais de 420 mil ETH e 18.270 BTC. O FBI espera mais lavagem, e a Chainalysis observou um padrão automatizado com milhares de transações circulando entre endereços. Essa parte costuma levar meses ou anos.
O mercado reagiu rápido e se acalmou em seguida: o Bitcoin chegou a US$ 76.368 e o Ether a US$ 2.178. Segundo a Al Jazeera, o setor já estava pressionado por juros mais altos nos EUA e por demanda menor em ETFs.
Perspectivas: A Segurança Está Mudando de Lugar
Este caso desloca o centro da conversa. Durante anos, a pergunta foi "onde está guardada a chave?". Cold wallet, HSM e assinatura múltipla responderam bem a ela. A próxima pergunta é mais difícil: "quem pode pedir para a chave assinar, e o que confere esse pedido?".
Quando sair o relatório da Binance, algumas conclusões deste texto podem mudar, em especial sobre a entrada inicial e sobre as chaves. O que dificilmente muda é o princípio: qualquer credencial permanente e qualquer serviço que confie cegamente em chamadas internas é um risco maior do que parece, até o dia em que alguém o encontra.
Abra hoje o sistema mais sensível que você mantém e procure o token sem expiração. Se ele existir, esse é o seu próximo ticket.
Bora pra cima! 🦅
📚 Quer Acompanhar o Que Vem Por Aí?
Este artigo cobriu o hack da Binance e o que ele ensina sobre sistemas que movem dinheiro, 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

