Neste fim de semana a Liquid Network, a sidechain de Bitcoin operada pela Blockstream, perdeu cerca de 4.000 BTC em uma única transação. Era praticamente tudo o que a federação guardava em reserva, algo perto de 320 milhões de dólares. Um dia depois, 3.400 BTC voltaram. Os outros 598,5 ficaram com quem tirou, que se apresentou desde a primeira mensagem como “hacker do bem”.
O bug em si é interessante, e vou explicar o que se sabe dele. Mas o que me fez escrever este post foi a proporção. Quem tinha 4.000 BTC na mão e devolveu 85% não estava fazendo uma conta financeira, estava fazendo uma conta moral, e essa conta tem um comportamento previsível que a economia comportamental estuda há bastante tempo. É a mesma lógica de quem acha uma carteira na rua e, em vez de levar tudo, leva só uma parte.
O que é a Liquid
A Liquid é uma sidechain federada. Você envia bitcoin para um endereço controlado pela federação (peg-in), e a mesma quantidade aparece como L-BTC na Liquid. Para sair, faz o caminho inverso (peg-out): queima L-BTC na sidechain e a federação libera o BTC correspondente na rede principal. A federação é um grupo de exchanges, empresas e operadores que rodam nós chamados functionaries, e os bitcoins ficam em um multisig entre eles.
A troca que a Liquid oferece é: você abre mão de parte da descentralização do Bitcoin (a federação, em tese, pode conluiar) em troca de blocos de um minuto, liquidação rápida entre exchanges e transações confidenciais, em que o valor transferido fica escondido na blockchain. Esse último ponto importa para a história.
flowchart LR BTC["Bitcoin<br/>(mainnet)"] Fed["Federação<br/>(multisig)"] LQ["Liquid<br/>(L-BTC)"] BTC -->|"peg-in: BTC entra no multisig"| Fed Fed -->|"L-BTC emitido 1:1"| LQ LQ -->|"peg-out: L-BTC é queimado"| Fed Fed -->|"BTC sai do multisig"| BTC
O software que roda a Liquid é o Elements, um fork do Bitcoin Core mantido pela Blockstream com essas funcionalidades extras. E a garantia inteira do sistema é uma igualdade: a quantidade de L-BTC em circulação nunca pode ser maior do que a quantidade de BTC que a federação guarda. Enquanto essa igualdade vale, todo L-BTC tem lastro. Quando ela quebra, alguém consegue sacar bitcoin que nunca depositou.
O ataque
Pelo que foi divulgado até agora, foi exatamente essa igualdade que quebrou, e o caminho passou pela confidencialidade.
Em uma transação confidencial, o valor não aparece em texto. Ele fica escondido em um compromisso criptográfico, e para a rede aceitar a transação o remetente precisa anexar um range proof: uma prova de que o valor escondido está dentro de um intervalo válido e que as entradas batem com as saídas, sem revelar os números. Verificar range proof é caro, então o Elements mantém um cache dos resultados.
O bug estava nesse cache. Em determinada condição ele respondia que uma prova era válida sem que ela tivesse sido validada, e com isso foi possível montar uma transação que criava L-BTC do nada. Nenhuma chave foi comprometida, nenhum functionary foi invadido. A federação fez exatamente o que deveria fazer: viu L-BTC aparentemente válido sendo queimado em um peg-out e liberou o BTC correspondente.
O peg-out passou pela SideSwap, um serviço da rede que facilita a saída para a mainnet. Ela confirmou depois que o L-BTC veio de um bug do Elements, não de uma falha nos sistemas dela. No domingo, 6 de setembro, cerca de 4.000 dos aproximadamente 4.200 BTC da reserva saíram em uma única operação. A Blockstream pausou a rede, desligou os bridge nodes, e as exchanges suspenderam depósito e saque de L-BTC.
Roubo de chave você detecta por assinatura indevida. Emissão sem lastro passa por todas as assinaturas legítimas, porque a federação não foi enganada sobre quem estava pedindo, foi enganada sobre quanto existia. É um bug de contabilidade, e bug de contabilidade não dispara nenhum alarme de segurança.
A negociação por OP_RETURN
Quem tirou o dinheiro não fugiu. Na mesma janela apareceu na blockchain do Bitcoin uma mensagem em OP_RETURN, o campo de dados livre de uma transação: “we are whitehats. contact us on chain”.
Dali em diante a conversa aconteceu em público, bloco a bloco, parte em texto puro, parte cifrada com PGP. Reconstruindo pelas fontes:
| Quando | Quem | Mensagem |
|---|---|---|
| Dom, 6 de set | Atacantes | ”we are whitehats. contact us on chain” |
| Bloco 965.822 | Blockstream | Pediu contato pelo e-mail de segurança |
| Bloco 965.875 | Atacantes | ”Please fix the bug first. The chain is under risk at latest commit right now” |
| Seg, 7 de set | Atacantes | Perguntaram se devolver “most” (a maior parte) ao endereço da federação servia |
| Seg, 7 de set | Blockstream | ”Yes, thank you” |
| Seg, 7 de set | Blockstream | Assinado com PGP: “Bridge nodes are patched, safe to return the funds” |
| Bloco 965.950 | Atacantes | 3.400 BTC devolvidos ao endereço de peg da federação |
| Depois | Atacantes | 🙁 |
Os 598,5 BTC restantes, cerca de 47 milhões de dólares, ficaram no endereço de origem. A última mensagem foi um emoji triste, o que sugere que a conversa sobre o tamanho da “recompensa” não chegou onde eles queriam.
Repare no “most”. A pergunta não foi “podemos devolver?”, foi “podemos devolver a maior parte?”, e a Blockstream respondeu “sim, obrigado” a essa pergunta. Foi o mais perto de um acordo de bounty que a história teve.
Hacker do bem
Hacker do bem, ou white hat, é um termo com significado razoavelmente estabelecido: alguém que encontra uma vulnerabilidade e a reporta para quem pode corrigir, sem explorá-la para ganho próprio. Muitos projetos formalizam isso com programas de recompensa, em que a empresa define de antemão quanto paga por bug e qual é o teto.
O que aconteceu na Liquid inverte a ordem. Primeiro sacou-se 320 milhões, depois avisou-se do bug, e o valor da recompensa foi definido unilateralmente por quem estava com o dinheiro. O CTO da Ledger, Charles Guillemet, apontou exatamente isso: pegar primeiro e negociar depois não é o que a palavra descreve, ainda que ele tenha admitido depois que podem ser pesquisadores inexperientes. A própria Blockstream, no comunicado, chamou-os de “purported white-hat hackers”, supostos hackers do bem.
Há precedente para os dois lados. Em 2021 a Poly Network perdeu mais de 600 milhões de dólares para um atacante que devolveu tudo, e a empresa ofereceu 500 mil dólares de recompensa por conta própria. Há também casos em que o projeto aceitou que o atacante ficasse com uma fração como custo de recuperar o resto. Os 15% da Liquid caem nessa segunda categoria, com um detalhe: ninguém ofereceu, eles tomaram.
Dá para discutir o rótulo o dia inteiro. Acho mais interessante perguntar por que devolveram.
A carteira na rua
Imagine que você acha uma carteira na rua com mil reais e documentos. Existem três comportamentos possíveis: devolver tudo, ficar com tudo, ou ficar com uma parte e devolver o resto.
O terceiro parece o mais irracional. Se você já decidiu que vai ficar com dinheiro que não é seu, o custo moral já foi pago, e o custo prático de tirar 200 é igual ao de tirar 1.000. Mesmo assim, é o que a maioria faz quando é observada em experimento. Quase ninguém rouba tudo, quase ninguém devolve tudo. Rouba-se só um pouco.
A explicação é que o custo moral não é pago de uma vez. Ele cresce com o valor, mas não em dinheiro, e sim na dificuldade de continuar se achando uma pessoa honesta. Levar 200 reais de uma carteira achada cabe em várias histórias que a gente conta para si mesmo: “é pelo trabalho de devolver”, “quem anda com mil reais na carteira não vai sentir falta de 200”, “eu devolvi os documentos, que é o que importa”. Levar os mil não cabe em história nenhuma. Quem leva os mil precisa admitir que é ladrão, e a maioria das pessoas prefere o dinheiro a menos do que essa admissão.
O fudge factor
Dan Ariely, professor de economia comportamental, passou anos medindo isso em laboratório e escreveu um livro sobre o resultado, A Mais Pura Verdade sobre a Desonestidade (The Honest Truth About Dishonesty, 2012). A teoria central ele chamou de fudge factor, algo como “margem de enrolação”.
O experimento base é simples. Participantes recebem uma folha com 20 matrizes de números e cinco minutos para achar, em cada uma, os dois números que somam 10. Cada matriz resolvida vale um valor em dinheiro. No grupo de controle, alguém confere a folha, e a média é de 4 matrizes resolvidas. No grupo de teste, o participante passa a folha pelo triturador e declara quantas resolveu. A média sobe para 6.
Dois detalhes desse resultado importam mais do que o número:
- Quase ninguém declara 20. Com o triturador, mentir 20 era tão seguro quanto mentir 6. Mesmo assim, o comportamento típico foi exagerar um pouco, não muito.
- O valor da recompensa não muda quanto se mente. Ariely variou o pagamento por matriz de 25 centavos a 10 dólares. A quantidade de trapaça ficou praticamente igual, e no valor mais alto até caiu um pouco.
A leitura dele é que a gente opera com duas motivações opostas ao mesmo tempo: quer o ganho de trapacear, e quer continuar se vendo como pessoa honesta. O fudge factor é o tamanho da trapaça que cabe entre as duas, ou seja, o máximo que você consegue tirar sem quebrar a imagem que tem de si. Acima disso, a pessoa para de trapacear não por medo de ser pega, mas porque não consegue mais se explicar.
Um segundo experimento, do livro anterior dele (Previsivelmente Irracional), completa o quadro. Ariely deixou six-packs de Coca-Cola em geladeiras coletivas de um alojamento do MIT, e pratos com notas de um dólar em outras. Em 72 horas todas as latas tinham sumido. Nenhuma nota foi tocada. Pegar uma lata do vizinho é fácil de encaixar em uma história; pegar dinheiro do vizinho é roubo, e a distância entre as duas coisas é de um passo de abstração.
Quanto mais longe do dinheiro em espécie, maior o fudge factor. Fichas, pontos, ativos digitais, “uma lata”.
As carteiras de verdade
O exemplo da carteira não é só metáfora. Em 2019 um grupo de economistas publicou na Science o maior experimento de campo sobre honestidade que conheço: mais de 17 mil carteiras “perdidas” em 355 cidades de 40 países, entregues a funcionários de bancos, hotéis, correios e delegacias como se tivessem sido achadas na porta. Cada carteira tinha um e-mail de contato, e a métrica era quantas pessoas escreviam para devolver.
O resultado contraria a intuição de que mais dinheiro atrai mais desonestidade:
| Conteúdo da carteira | Taxa de devolução |
|---|---|
| Sem dinheiro | 40% |
| Com cerca de 13 dólares | 51% |
| Com cerca de 94 dólares | 72% |
Quanto mais dinheiro, mais gente devolveu. A explicação dos autores é a mesma de Ariely, vista pelo outro lado: ficar com uma carteira vazia é quase nada, ficar com uma carteira com 94 dólares exige se ver como ladrão, e esse custo de autoimagem pesa mais do que o dinheiro para a maioria.
O que a Liquid tem a ver com a carteira
Volte para os 4.000 BTC com isso em mente.
Quem explorou o bug tinha, na prática, a carteira inteira na mão. A rede estava pausada, o peg-out já tinha sido liquidado, e Bitcoin não tem chargeback. A escolha entre ficar com tudo, devolver tudo ou ficar com uma parte era genuína, e a resposta foi a mesma do participante com o triturador: a maior parte de volta, um pouco retido.
Os elementos da teoria aparecem um por um:
- A trapaça precisa caber numa história. “Somos white hats” foi a primeira mensagem, antes de qualquer negociação. O rótulo não era para a Blockstream, era para eles. Os 15% precisavam se chamar recompensa, porque 598 BTC chamados de roubo não cabem na autoimagem de quem reporta bug.
- A unidade do fudge factor é a narrativa, não o valor. 598 BTC são 47 milhões de dólares. Ninguém consegue contar para si mesmo a história de “só 47 milhões”. Mas “só 15%” é uma história perfeitamente contável, e é por isso que a fração importa mais do que o montante. O mesmo mecanismo que faz alguém tirar 200 de mil faz alguém tirar 600 de 4.000, desde que dê para chamar os dois de “um pouco”.
- A distância do dinheiro. Não havia vítima com rosto. O L-BTC saiu de um bug de cache, o BTC saiu de um multisig de uma federação de empresas. É a lata de Coca-Cola, não a nota de um dólar. O caminho até “isso é dinheiro de alguém” tem tantos passos de abstração que a história de white hat quase se conta sozinha.
- O emoji triste. É a parte mais reveladora. Depois de ficar com 47 milhões, a última mensagem foi de frustração. Se fosse só sobre dinheiro, o emoji não faria sentido: eles já tinham o dinheiro. O que faltou foi a outra metade da equação, o reconhecimento de que a recompensa era legítima. Sem isso, os 598 BTC ficam desconfortavelmente parecidos com roubo, e a autoimagem que a mensagem de abertura tentou estabelecer fica sem a assinatura da outra parte.
Não estou dizendo que essas pessoas são iguais a quem acha uma carteira e tira 20%. Estou dizendo que o mecanismo é o mesmo, e que ele escala. Ariely mediu o fudge factor em matrizes de 50 centavos; a Liquid mediu em uma reserva de 320 milhões, e o formato do resultado foi idêntico: a maior parte de volta, um pouco retido, e um esforço visível para que o “pouco” tenha um nome aceitável.
Conclusão
O bug do Elements vai ser corrigido, auditado e esquecido, como todo bug. O que fica é um dado de comportamento humano medido em condições que nenhum laboratório conseguiria montar: alguém com 320 milhões de dólares e nenhuma barreira para ficar com eles devolveu 85%.
A leitura otimista é que a consciência funciona mesmo quando a criptografia falha. A leitura prática é mais útil: se você opera um sistema que guarda valor, o comportamento de quem encontrar um bug dificilmente vai ser “tudo ou nada”. Vai ser “quase tudo de volta, mais um pouco”. Um programa de recompensa com valor e regras definidos antes serve exatamente para isso: dar um nome legítimo ao “pouco”, num tamanho que você escolheu, antes que alguém escolha por você.
E, no nível pessoal, o experimento da carteira serve de espelho. Ninguém se acha o tipo de pessoa que roubaria 320 milhões. A pergunta que o fudge factor faz é outra: qual é o 15% que você ficaria e ainda conseguiria se explicar?
Referências
- Ariely, Dan. A Mais Pura Verdade sobre a Desonestidade (The (Honest) Truth About Dishonesty), 2012.
- Ariely, Dan. Previsivelmente Irracional (Predictably Irrational), 2008. Capítulo sobre o experimento das latas de Coca-Cola.
- Cohn, A., Maréchal, M. A., Tannenbaum, D., Zünd, C. L. Civic honesty around the globe. Science, 2019.
- Gerlach, P., Teodorescu, K., Hertwig, R. The truth about lies: A meta-analysis on dishonest behavior. Psychological Bulletin, 2019.
- Bitcoin Magazine — Liquid gets 3,400 BTC back after on-chain talks; white hats keep 598.5 BTC
- CoinDesk — $320 million bitcoin exploit hits Liquid Network
- The Block — Liquid Network attacker says they will return most of 4,000 BTC after bug fix
- Bitcoin.com News — Liquid hackers return 3,400 BTC, keep $47M as network stays frozen
- Blockstream — documentação da Liquid Network