O ataque de 6 de setembro à Liquid Network não envolveu chave roubada, servidor invadido nem engenharia social. Foi um bug de consenso: o software que define o que é um L-BTC válido aceitou uma transação que inflou a oferta em quase 4.000 unidades. A partir daí, o resto foi burocracia. Este artigo reconstrói o exploit em detalhe, mostra o que o atacante fez nos três dias anteriores, analisa as mensagens trocadas na blockchain e discute a pergunta que a comunidade não para de fazer: white hat de verdade avisa antes. Quem ataca e só depois pede recompensa?
Se você quer só o resumo do caso, leia primeiro o que aconteceu na Liquid, em linguagem simples. Aqui a conversa é técnica.

1. Como a Liquid esconde valores: Confidential Transactions
Diferente do Bitcoin, a Liquid não mostra o valor das transações na blockchain. Ela usa Confidential Transactions (CT), proposta por Gregory Maxwell em 2015. Cada saída carrega um Pedersen commitment, um número que “sela” o valor sem revelá-lo, e uma rangeproof: uma prova de que o valor selado está dentro de um intervalo válido (não é negativo, não estoura o máximo). Sem a rangeproof, alguém poderia criar uma saída de valor negativo e, na soma, “criar” moedas.
A Liquid também esconde qual ativo está sendo movido (L-BTC, USDT, DePix ou qualquer outro token emitido). Isso significa que a validação precisa checar duas coisas ao mesmo tempo: o valor está no intervalo e o ativo é o que se diz ser. As rangeproofs na Liquid são, por padrão, de 4.174 bytes. Guarde esse número.
2. O bug: um cache que esqueceu o contexto
Verificar rangeproofs é caro em CPU. Para não repetir o trabalho a cada bloco, o Elements mantém um cache de provas já verificadas, como o Bitcoin Core faz com assinaturas. A questão é: qual é a chave desse cache?
Até a correção, a chave usava apenas a prova e o commitment de valor. Faltavam dois elementos: o ativo e o script de saída (o “endereço”). Na prática, isso dizia ao nó: “se você já viu esta prova com este commitment, aceite-a de novo, não importa para qual ativo ou para quem”. A correção, escrita em 3 de agosto e mesclada nos branches master e elements-23.x entre 1º e 3 de setembro, adicionou o ativo e o script à chave. Simples, curta e, infelizmente, pública sem uma versão lançada.
Um bug nascido de outra correção
Segundo o relato da Gizmodo, o cache problemático foi introduzido em 2019, durante o conserto de outra vulnerabilidade. É um padrão conhecido em software de consenso: uma otimização de performance escrita sob pressão, testada contra o caso que preocupava na época, e que passa sete anos aceitando uma entrada que ninguém pensou em testar. O próprio Bitcoin já viveu isso com o CVE-2018-17144, um bug de inflação descoberto e corrigido em 2018 antes que alguém o explorasse. A diferença é que, no Bitcoin, a correção saiu em release no mesmo dia.
3. A preparação: três dias de ensaio
A reconstrução on-chain da Bitquery mostra um atacante metódico. Nada foi improvisado.
| Data (UTC) | Ação | Leitura |
|---|---|---|
| 04/09, 03h11 e 16h36 | Dois peg-ins: 1,0825 BTC e 1,0660 BTC | Capital de trabalho. Pouco mais de 2 BTC bancaram tudo. |
| 05/09, a partir de 12h35 | 92 transações na Liquid, com 30+ saltos entre endereços | Ensaio da carteira e, provavelmente, teste do comportamento do cache. |
| 05/09 e 06/09 (14 horas) | 68 rangeproofs idênticas plantadas entre os blocos 4.049.384 e 4.050.246, cada uma com commitment para valor zero | Aquecimento do cache em todos os nós da rede. A prova “válida” fica na memória de cada nó. |
| 06/09, 11h30 a 11h39 | Três peg-outs de ensaio via SideSwap: 0,95, 1,71 e 0,55 BTC | Confirmação de que a saída funciona e de que a SideSwap paga no mesmo bloco. |
| 06/09, 13h53 | Transação de cunhagem, bloco 4.050.336 da Liquid | 1 entrada, 3 saídas, 58 sats de taxa. Rangeproof de 4.234 bytes, 60 acima do padrão. |
| 06/09, 14h06 | SideSwap pede peg-out de 3.996,018 BTC + 3,996 BTC de taxa | Para a SideSwap, o L-BTC era indistinguível de legítimo. |
| 06/09, 14h28 | Federação paga 4.019 BTC em 83 entradas (bloco 965.783 do Bitcoin); SideSwap repassa 3.995,99 BTC ao atacante no mesmo bloco | Carteira da federação: de 4.205,29 para 197,47 BTC. |
Dois detalhes técnicos chamam atenção. Primeiro, a rangeproof de 4.234 bytes na transação final: são 60 bytes a mais que o normal, o que sugere uma prova construída à mão para colidir com a chave do cache. Segundo, as transações do atacante no Bitcoin usam anti-fee-sniping (locktime um pouco abaixo da altura atual), um comportamento padrão da carteira do Bitcoin Core. Não é uma carteira exótica: é alguém que roda software de referência e sabe o que está fazendo.
4. Por que a federação assinou
A Liquid é governada por uma federação de 15 functionaries em multisig 11 de 15, com módulos de hardware (HSM) que só assinam peg-outs válidos segundo as regras da sidechain. Aqui está o ponto: “válido segundo as regras” é decidido pelo Elements. Se o Elements aceita a transação de cunhagem, o L-BTC resultante é, para o HSM, tão legítimo quanto qualquer outro. Os 11 assinantes não verificam o lastro; verificam o protocolo. E o protocolo estava errado.
“Na prática, é um single sig. O multisig é teatro de segurança quando todos os signatários confiam no mesmo código.”
— Michael Folkson, colaborador do Bitcoin Core (paráfrase de comentário público)
Isso explica também por que a SideSwap não é a vilã da história. Ela é um serviço autorizado (whitelisted) de peg-out. Recebeu L-BTC, o nó dela disse que era válido, ela pediu o saque, cobrou 0,1% e repassou. A SideSwap confirmou que sua chave não foi comprometida. O problema era anterior a ela.
5. A negociação por OP_RETURN
O que veio depois é inédito nessa escala: uma negociação de US$ 320 milhões conduzida inteiramente dentro de transações do Bitcoin, usando o campo OP_RETURN para texto e PGP para as partes sigilosas. Todas as mensagens são públicas e verificáveis. A assinatura da Blockstream bate com a chave de segurança publicada no site da empresa (fingerprint terminando em 6844 A2D6).
| Hora (UTC) | Quem | Mensagem |
|---|---|---|
| 06/09, 18h30 | Atacante | “we are whitehats. contact us on chain” |
| 06/09, 19h31 | Blockstream | “Please contact security@blockstream.com” |
| 07/09, 01h49 | Blockstream | Texto cifrado com PGP + assinatura |
| 07/09, 02h20 | Atacante | “sending most back to bc1qdlld6…suhwxxr, is that ok” |
| 07/09, 03h30 | Atacante | “Please fix the bug first. The chain is under risk at latest commit right now. Make sure every node is patched. Then we will transfer the money back safely after confirming the fix.” |
| 07/09, 03h30 | Blockstream | “Yes, thank you.” (assinado PGP) |
| 07/09, 04h49 a 08h45 | Rede | Liquid para de produzir blocos |
| 07/09, 09h19 e 09h41 | Blockstream | “Bridge nodes are patched, safe to return the funds.” (assinado PGP, repetido 3x) |
| 07/09, 12h43 | Atacante | “plz confirm again that we are sending the coins back to bc1qdlld6…suhwxxr…” |
| 07/09, 14h24 | Blockstream | Resposta cifrada com instruções de devolução |
| 07/09, bloco 965.950 | Atacante | 3.400 BTC devolvidos. 598,5 BTC retidos. |
Repare na palavra “most” (a maior parte) na mensagem das 02h20. Desde o primeiro contato, o atacante já sinalizava que não devolveria tudo. Nenhum acordo de recompensa foi tornado público. Circulou a informação de que o grupo teria pedido 20%; ficou com 15%. A Blockstream não confirmou nem negou.
Repare também no “latest commit”. O atacante sabia que a correção estava no repositório e que não havia release. Ele estava, de fato, monitorando o GitHub do Elements. Isso leva à hipótese mais provável sobre como o bug foi encontrado: lendo o diff da correção, não auditando o código do zero. Um commit que “adiciona parâmetros faltantes à chave de cache de rangeproof” é um mapa do tesouro para quem entende de CT. Entre o merge (1º/09) e o ataque (6/09) passaram cinco dias, e a preparação começou em 4/09.
6. White hat, black hat ou Lazarus?
Aqui entra a discussão que domina a comunidade. Vamos separar os argumentos.
O que um white hat faria
O protocolo aceito de divulgação responsável é: encontrar a falha, reportar em sigilo, dar prazo para a correção, e receber recompensa (bug bounty) depois. Se precisa provar que a falha é explorável, faz com valor simbólico. A Immunefi e programas semelhantes pagam milhões por bugs de consenso justamente para que isso aconteça. Ninguém drena 95% da reserva para “demonstrar” um bug.
O que aconteceu aqui
- Três dias de ensaio silencioso, sem qualquer contato com a Blockstream.
- Drenagem de 3.996 BTC antes de qualquer mensagem.
- Contato só depois do dinheiro estar em carteira própria.
- Condição imposta (“corrija primeiro”) que, na prática, garantiu que ninguém mais pudesse repetir o golpe enquanto o atacante segurava o dinheiro.
- Retenção de 598,5 BTC (US$ 47 milhões) sem acordo público.
É isso que sustenta a leitura de extorsão com roupagem de white hat: o “bounty” foi definido unilateralmente por quem tinha o dinheiro na mão. Como escreveu Alena Vránová, da Gart: explorar, levar 4 mil BTC e exigir correção como condição é extorsão, independentemente do nome que se dê.
A tese do Lazarus
Parte da comunidade levantou o nome do Lazarus Group, a unidade de hackers ligada ao governo norte-coreano. O raciocínio é: um white hat avisaria e ganharia a recompensa pelas vias normais; quem ataca primeiro e negocia depois é criminoso profissional, e o criminoso profissional mais ativo em cripto hoje é o Lazarus, responsável por Ronin (US$ 625 milhões, 2022), Harmony (US$ 100 milhões, 2022) e Bybit (US$ 1,5 bilhão, fevereiro de 2025, confirmado pelo FBI). A sofisticação do ataque, o uso de Bitcoin Core e a paciência de três dias de preparação são compatíveis com um grupo estatal.
Os argumentos contra são fortes, porém:
- Lazarus não devolve. Em nenhum caso documentado o grupo retornou fundos. O padrão é lavar imediatamente via mixers, pontes e corretoras descentralizadas. A devolução de 85% em 24 horas é o oposto do modus operandi.
- Lazarus não conversa. O grupo não abre diálogo com a vítima, não assina mensagens e não pede confirmação de endereço “para não errar”. O comportamento aqui foi de quem queria ser visto negociando.
- O vetor é diferente. Os grandes ataques do Lazarus exploram pessoas e infraestrutura: engenharia social, dispositivos de desenvolvedores comprometidos, front-ends adulterados. Explorar um bug de consenso em CT é trabalho de criptógrafo, não de operação de inteligência.
- Nenhuma empresa de análise on-chain (Chainalysis, Elliptic, TRM, ZachXBT) atribuiu o ataque ao Lazarus até a publicação deste texto.
A leitura mais honesta é a de Charles Guillemet, CTO da Ledger: não parecem white hats, e não parecem os criminosos de sempre. O próprio Guillemet suavizou o tom depois que a negociação começou, observando que grupos criminosos não costumam se esforçar para abrir canal direto com a vítima. O perfil mais consistente com as evidências é o de um grey hat com conhecimento profundo de Elements: alguém que viu a correção no GitHub, calculou que a janela até o release era curta, e decidiu que US$ 47 milhões “de recompensa” era um preço justo por não ter sido o Lazarus.
Placar da atribuição
0
Evidências ligando ao Lazarus
85%
Devolvido em 24h (atípico p/ Lazarus)
15%
Retido sem acordo público
5 dias
Entre fix público e ataque
7. O que a Blockstream errou
Dizer que “foi só um bug” seria generoso. Três decisões de processo abriram a janela:
- Correção de bug de consenso publicada sem release. No Bitcoin Core, correções de inflação são tratadas como segredo até a versão estar pronta e distribuída (foi assim no CVE-2018-17144). No Elements, o diff ficou 5 dias exposto no GitHub com a rede inteira vulnerável.
- Sem limite de velocidade no peg-out. Um peg-out de 95% da reserva em uma única transação passou sem alarme, sem atraso, sem aprovação humana. Uma trava de valor por bloco teria transformado US$ 320 milhões em um incidente de dezenas de milhares.
- Sem monitoramento de oferta. A cunhagem de 3.996 L-BTC deveria ter disparado um alerta imediato de discrepância entre L-BTC circulante e BTC na federação. O tempo entre cunhagem e saque foi de 35 minutos.
“Quem vai confiar na Liquid com o próprio dinheiro depois disso?”
— Seth for Privacy, COO da Cake Wallet
Nicolas Burtey, CEO da Galoy, foi mais direto: o incidente “matou a Liquid”, com ou sem devolução. Talvez seja exagero. Mas a Liquid vendia exatamente duas coisas, confiança na federação e confiança no código, e as duas falharam ao mesmo tempo.
Perguntas Frequentes
O que é uma rangeproof?
É uma prova criptográfica de que um valor escondido está dentro de um intervalo válido (por exemplo, entre zero e 21 milhões). Em redes com Confidential Transactions, como a Liquid, ela impede que alguém crie saídas negativas e, com isso, moedas do nada.
Por que um cache causou o problema?
O Elements guardava rangeproofs já verificadas para não recalculá-las. A chave do cache ignorava o ativo e o script de destino. Assim, uma prova válida em um contexto era aceita em outro, onde não deveria ser. O atacante plantou 68 provas idênticas para garantir que o cache de todos os nós estivesse “aquecido” antes da transação final.
O atacante pode ser preso?
Em tese, sim. Explorar uma falha para retirar fundos e condicionar a devolução a uma exigência pode configurar extorsão em várias jurisdições, mesmo com devolução parcial. Na prática, depende de identificação. Até agora, o grupo não foi identificado.
Foi o Lazarus Group?
Não há evidência. A devolução de 85% do valor, o diálogo assinado e a verificação de endereços contrariam o padrão do grupo norte-coreano, que nunca devolve fundos. Nenhuma empresa de análise forense atribuiu o ataque ao Lazarus até agora.
O Bitcoin Core tem o mesmo bug?
Não. O Bitcoin não usa Confidential Transactions nem rangeproofs. O código vulnerável é específico do Elements, o fork usado pela Liquid. O cache de assinaturas do Bitcoin Core tem chave completa e não é afetado.
Leia também: Hack da Liquid Network: 4.000 BTC somem em 20 minutos (resumo em linguagem simples)
Leia também: O que é sidechain: de Liquid a Polygon, e a lição do The DAO
Mais lidas no Blog
- Bitcoin rompe US$ 80 mil e liquida US$ 240 milhões em shorts
- 77 extensões do Firefox roubavam seed phrase por 5 meses
- Harmony vai apagar 109 mil transações: rollback após 3 trilhões de ONE forjados
- Dust attack na Kraken: 12 mil transferências travaram contas
- Bridge de USDC entre Solana, Base e Arbitrum em segundos