Skip to main content
Nordlys logo, a drawing of two gray mountains with green northern lights in the background @phpeterle Blog

Back to all posts

O hacker do bem que ficou com 15%

Published on by Pedro Peterle · 13 min read

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:

QuandoQuemMensagem
Dom, 6 de setAtacantes”we are whitehats. contact us on chain”
Bloco 965.822BlockstreamPediu contato pelo e-mail de segurança
Bloco 965.875Atacantes”Please fix the bug first. The chain is under risk at latest commit right now”
Seg, 7 de setAtacantesPerguntaram se devolver “most” (a maior parte) ao endereço da federação servia
Seg, 7 de setBlockstream”Yes, thank you”
Seg, 7 de setBlockstreamAssinado com PGP: “Bridge nodes are patched, safe to return the funds”
Bloco 965.950Atacantes3.400 BTC devolvidos ao endereço de peg da federação
DepoisAtacantes🙁

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 carteiraTaxa de devolução
Sem dinheiro40%
Com cerca de 13 dólares51%
Com cerca de 94 dólares72%

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