Os irmãos Winklevoss são mais conhecidos como supostos pais fundadores do Facebook – e até receberam, como forma de compensação, US$ 65 milhões de Mark Zuckerberg, em 2008. Em 2013, eles investiram pesadamente em Bitcoins, comprando cerca de 1% de todas as moedas existentes pelo preço de US$ 120 cada.
Um pouco mais tarde, os irmãos abriram a plataforma de trocas de criptomoedas Gemini, e em 2018, lançaram uma stablecoin: a Gemini Dollar (GUSD). Stablecoin é uma criptomoeda com taxa fixa – 1 GUSD equivale sempre a US$ 1 dólar. Stablecoins são úteis para “digitalizar” dólares reais. E tornam a movimentação de dólares de blockchain uma tarefa rápida e fácil. O responsável pela conversão reversa para dólares é a empresa que as emitiu e as vendeu para você.
No serviço Kaspersky Smart Contract Source Code Review, analisamos um contrato inteligente que fornece a funcionalidade GUSD e detectamos uma falha.
Aviso Legal
Observe que o contrato inteligente fornecido já havia sido revisado, embora não saibamos se alguma falha de código foi descrita no relatório.
De acordo com nossa Política de Divulgação Responsável, contatamos a equipe de segurança da Gemini para relatar o problema. Eles nos informaram que o assunto foi considerado durante a fase de design do projeto, mas não apresentou riscos para a GUSD.
Para uma explicação mais simples sobre como funcionam os contratos inteligentes, confira nosso post sobre contratos inteligentes, Ethereum e ICOs.
Contratos inteligentes na Gemini Dollar
De um modo geral, quando alguém deseja criar novos tokens baseados na blockchain Ethereum, eles escrevem um contrato inteligente (um miniprograma) que especifica o seguinte:
- Dados (“esses tokens estão nestes endereços”),
- Métodos (“por favor transfira meus tokens para estes endereços”, além de outros comandos).
Os criadores do sistema Gemini Dollar também implementaram os seguintes aprimoramentos:
- Eles separaram o contrato em três componentes: Proxy (a interface permanente com a qual os titulares de tokens podem interagir e executar operações), Store (o mapeamento dos titulares de tokens e seus saldos) e Impl (a lógica subjacente);
- O componente que descreve a lógica pode ser atualizado e complementado com novos recursos, como a capacidade de congelar fundos. Enquanto isso, os dados e a interface permaneceram inalterados; a atualização é visível para todos;
- Para atualização e controle, é usado um contrato inteligente “de custódia” separadamente, que é gerenciado por várias pessoas (custodiantes) para proteção adicional. Se um custodiante propõe uma ação, os outros devem confirmar antes que a ação possa ocorrer.
Os aprimoramentos são sólidos e aumentam a segurança e a flexibilidade gerais.
Pagamentos anti-spam
Se alguém que não seja o custodiante principal fizer uma proposta em um contrato de custódia, deverá pagar uma participação de 1 ETH (cerca de US $ 200 na taxa de câmbio atual). Conforme observado nos comentários do próprio contrato, essa medida anti-spam busca dissuadir os participantes de criar muitas solicitações.
Os pagamentos anti-spam acabam indo para uma pessoa: a que anuncia a aprovação de uma proposta / solicitação específica. Essa implementação pode não parecer muito justa, mas os comentários indicam claramente que seus criadores a conceberam dessa maneira.
} else {
if (address(this).balance > 0) {
// reward sender with anti-spam payments
// ignore send success (assign to ʹsuccessʹ but this will be overwritten)
success = msg.sender.send(address(this).balance);
De nossa parte, recomendamos o uso da abordagem Solidity Withdrawal Pattern.
Ataques de Front Running podem roubar todos os pagamentos anti-spam
A pessoa que determina a aprovação da solicitação também recebe todos os pagamentos anti-spam ETH. Para fazer isso, ele ou ela chama a função do contrato inteligente completeUnlock e passa as assinaturas de dois custodiantes nos parâmetros.
O problema é que o Ethereum, como qualquer outra blockchain, executa solicitações com atraso. Uma transação do cliente (transferindo dinheiro ou chamando uma função) espera na fila por algum tempo (geralmente 15 segundos ou mais). Durante esse período, qualquer pessoa pode visualizar as transferências planejadas de outros usuários do Ethereum, incluindo valores, destinatários e parâmetros. E o espectador pode usar essas informações para criar sua própria transação e empurrá-las para a frente, pagando uma comissão mais alta ao minerador.
Qualquer vantagem obtida por meio dessa espiada é considerado um ataque indevido (Conheça os ataques: Front-Running)
Da investopedia.com:
O Fron- Running é quando um corretor ou outra entidade entra em uma negociação porque tem conhecimento prévio de uma grande transação não publicada que influenciará o preço do ativo, resultando em um provável ganho financeiro para o corretor. Também ocorre quando um corretor ou analista compra ou vende ações por sua conta antes da recomendação de compra ou venda da empresa para os clientes.
No nosso caso, uma pessoa de fora pode configurar um robô para monitorar o contrato de custódia. Se alguém perceber que alguém solicitou a função completeUnlock (isto é, um custodiante está interagindo com o Gemini Dollar), copia imediatamente todos os parâmetros e chama a função para extrair o Ether acumulado.
Para conter tal ataque, recomendamos novamente o uso da Solidity Withdrawal Pattern.
Além disso, recomendamos bloquear desconhecidos para solicitação de função destinada a custodiantes.
Implementação prática de um ataque
Embora perigosa em teoria, a vulnerabilidade detectada é bastante benigna na prática. Explicamos:
- Os pagamentos anti-spam são de pouca preocupação para os custodiantes de um empreendimento tão importante como o Gemini Dollar. A capitalização GUSD (o volume total de tokens emitidos) chegou a US$ 100 milhões. Mesmo agora excede US$ 5 milhões.
- Os pagamentos anti-spam ainda não apareceram neste contrato e talvez nunca apareçam, porque o custodiante principal não é de forma alguma obrigado a depositá-las (todos os outros são).
- Conhecendo a vulnerabilidade, os usuários podem simplesmente evitar a função vulnerável ou atualizar o contrato.
- Durante a revisão, não encontramos vulnerabilidades que ameacem tokens GUSD.
Segundo a Gemini, “Escolhemos esse design porque o Gemini não pretende colocar o Ether em condições normais e, como resultado, tomamos uma decisão baseada no risco de não expandir materialmente a complexidade da nossa base de código apenas para o benefício imaterial de um mecanismo de recuperação mais robusto por uma participação anti-spam teórica e nominal. Priorizar o código simples e seguro continua sendo a melhor solução para o Gemini Dollar e seus usuários. No futuro, poderemos revisar essa decisão se o risco mudar e um contrato mais caro e complexo se tornar apropriado.”
Decidimos publicar este post em coordenação com a Gemini, já que os riscos anti-spam estão apenas em uma combinação de circunstâncias específicas e improváveis, e o Gemini Dollar não está em risco.
Mais uma vez, lembramos a todos da necessidade de uma abordagem holística de segurança para as ICOs e outras atividades relacionadas a criptomoedas e blockchains.