O Que Aconteceu
Em 28 de janeiro de 2022, a Qubit Finance foi explorada em aproximadamente $80 milhões de dólares em criptoativos. Continua sendo um dos maiores hacks de DeFi da história. Nenhum fundo jamais foi devolvido.
Contexto
Seção intitulada “Contexto”A Qubit Finance era um protocolo de empréstimo DeFi na Binance Smart Chain, construído pela empresa sul-coreana Mound Inc. — a mesma equipe por trás da PancakeBunny, que já havia sido explorada em ~$45M em maio de 2021. A Qubit foi sua segunda tentativa.
O protocolo incluía o QBridge — uma ponte cross-chain que permitia aos usuários depositar ETH no Ethereum e receber tokens qXETH equivalentes na BSC, que podiam ser usados como garantia para tomar empréstimos de outros ativos.
A Qubit Finance foi explicitamente endossada pela Binance e operava na Binance Smart Chain.
O Exploit
Seção intitulada “O Exploit”Etapa 1 — Duas funções, um evento
Seção intitulada “Etapa 1 — Duas funções, um evento”O QBridge tinha duas formas de depositar ETH:
depositETH()— Função correta. Exigia ETH real (msg.value > 0). Emitia um eventoDeposit.deposit()— Projetada para tokens ERC-20. ChamavasafeTransferFrom()em um contrato de token. Também emitia um eventoDeposit— o exato mesmo tipo de evento.
O relayer off-chain que processava os eventos da ponte não tinha como distinguir entre os dois.
Etapa 2 — O endereço zero estava na whitelist
Seção intitulada “Etapa 2 — O endereço zero estava na whitelist”Para ETH, como o ETH nativo não possui endereço de contrato ERC-20, o QBridge usava o endereço zero (0x0000000000000000000000000000000000000000) como placeholder. O endereço zero foi adicionado à whitelist do contrato.
Etapa 3 — Chamar um EOA é silenciosamente bem-sucedido
Seção intitulada “Etapa 3 — Chamar um EOA é silenciosamente bem-sucedido”Quando deposit() era chamada com o resourceID do ETH, o contrato resolvia o endereço do token para o endereço zero e chamava safeTransferFrom() nele.
No EVM, chamar qualquer função em um endereço sem código de contrato (um EOA) é silenciosamente bem-sucedido — sem revert, sem erro, sem transferência real. O endereço zero é um EOA. Então safeTransferFrom() “teve sucesso”, nada foi movido, e o contrato emitiu um evento Deposit idêntico a um depósito legítimo de ETH.
Esse comportamento do EVM havia sido documentado em uma atualização de segurança do 0x Protocol em 2019. A equipe da Qubit não sabia disso, ou ignorou.
Etapa 4 — O relayer cunhou tokens reais na BSC
Seção intitulada “Etapa 4 — O relayer cunhou tokens reais na BSC”O relayer viu o evento Deposit, não tinha como saber que era falso, e cunhou tokens qXETH na BSC para o atacante — sem lastro algum.
O atacante repetiu esse processo diversas vezes, acumulando uma quantidade massiva de qXETH falsos.
Etapa 5 — Garantia falsa, empréstimos reais
Seção intitulada “Etapa 5 — Garantia falsa, empréstimos reais”Usando qXETH cunhados de forma fraudulenta como garantia, o atacante tomou emprestado aproximadamente $80 milhões em ativos reais dos pools de empréstimo da Qubit Finance na BSC: WETH, BTCB, BNB, MATIC, CAKE, BUSD e outros.
O contrato de empréstimo verificava corretamente o valor da garantia — mas a fraude já havia ocorrido no nível da ponte.
A Mudança Suspeita de Parâmetro
Seção intitulada “A Mudança Suspeita de Parâmetro”Investigadores encontraram algo que nunca foi explicado.
Originalmente, a função deposit() com seu resourceID era usada para fazer bridge de WETH — um token ERC-20 real com um endereço de contrato real. Isso funcionava corretamente.
Em algum momento antes do hack, uma função exclusiva do proprietário (onlyOwner) foi chamada para reatribuir o mapeamento do resourceID — trocando o endereço de contrato do WETH pelo endereço zero. Essa foi a mudança que tornou o exploit possível.
Fatos importantes:
- Apenas o proprietário do contrato poderia fazer essa mudança
- Não havia timelock — a mudança entrou em vigor imediatamente
- Não houve anúncio público
- Nenhuma explicação jamais foi dada
A Resposta da Equipe
Seção intitulada “A Resposta da Equipe”O que a Mound Inc. fez depois:
- Ofereceu ao hacker $250.000 para devolver $80M (sem resposta)
- Alegou ter registrado boletins de ocorrência — nunca forneceu números de caso
- Removeu vítimas do Telegram através do moderador @moleh
- O CTO deletou seu LinkedIn em 1º de fevereiro de 2022, quatro dias após o hack
- Não contatou a segurança da Binance nem grandes exchanges para colocar a carteira do hacker em lista negra
- Não respondeu a membros da comunidade que se apresentaram com informações sobre o hacker
Para um registro completo, veja Resposta da Equipe e Nove Perguntas Sem Resposta.
Carteira do Hacker
Seção intitulada “Carteira do Hacker”0xd01ae1a708614948b2b5e0b7ab5be6afa01325c7Ativos Roubados Estimados
Seção intitulada “Ativos Roubados Estimados”| Ativo | Valor Aprox. em USD |
|---|---|
| WETH | ~$26,6M |
| BTCB | ~$15,3M |
| BNB | ~$9,5M |
| MATIC | ~$5,6M |
| CAKE | ~$8M |
| BUSD + outros | ~$15M |
| Total | ~$80M |