WEB3DEV

Cover image for Hackeando o Etherscan: Verificação de contrato falso
Paulo Gio
Paulo Gio

Posted on

Hackeando o Etherscan: Verificação de contrato falso

Bem-vindo ao episódio 3 do “Hackeamento” do Etherscan.

A maioria das pessoas confia no Etherscan para ver se um contrato inteligente é “verificado”, para ver listas de transferências, saldos de tokens, detentores e assim por diante… para avaliar se o contrato inteligente é “seguro”.

Se o contrato no Etherscan estiver marcado como verificado, ele deve ser de código aberto e “confiável”, certo?

Não, isso está errado e veremos o porquê.

Usando um proxy

A maioria de vocês já ouviu falar que qualquer contrato inteligente na Ethereum pode ser atualizado sem a modificação do endereço.

Isso é VERDADEIRO, quando se usa um proxy.

Aqui está como funciona:

  1. Você implanta um contrato inteligente PROXY e o endereço dele é, digamos, 0x01.
  2. Você implanta o contrato de implementação e o endereço dele é 0x02.
  3. Toda vez que alguém chama o contrato inteligente 0x01, a chamada é “redirecionada” para a função fallback() do 0x01, que delega chamada para o 0x02

https://miro.medium.com/max/1100/1*7VqGmy2iXgv5haCqiU5EEA.webp

Fonte da imagem: https://mycelium.xyz
  1. Digamos que você cometeu um erro no contrato 0x02. Você pode implantar um outro contrato no endereço 0x03 e agora pode definir o proxy para delegar na próxima vez para o 0x03.

O endereço 0x02 é descartado e as pessoas ainda interagem com o mesmo contrato. (0x01).

Esta é uma explicação muito simplificada, mas é isso que você precisa saber :)

Resumindo: os proxies são úteis para tornar o contrato inteligente atualizável.

Agora, digamos que você tenha um token sob um proxy e deseja verificar no Etherscan seu token, o que você fará?

https://miro.medium.com/max/1100/1*8XkpGL__-x3nV9CF0bSalA.webp

Você pode enviar o código do token do Solidity no Etherscan, mas não corresponderá…

Por quê?

Como há um proxy, você precisa especificar o código do proxy.

Apenas o proxy é verificado, sem verificar o código VERDADEIRO.

https://miro.medium.com/max/1100/1*kcu3wk_Ar_CTMfJ9bWebDg.webp

Então, como os hackers podem usar esse “truque”?

“Este contrato é verificado, portanto deve ser seguro”

As pessoas vão pensar que o contrato inteligente é verificado, mas na realidade apenas o código do proxy é verificado!

Isso pode dar ao usuário uma falsa sensação de segurança, especialmente se o contrato inteligente for uma farsa.

Como os hackers podem “melhorar” esse ataque?

  1. Ao clicar no botão do contrato, você pode ver “nome do contrato: proxy ERC1967” (o exemplo está acima). Portanto, é fácil ver que este é um contrato de proxy.

    Mas você também pode criar seu próprio proxy usando o padrão de proxy transparente: https://blog.openzeppelin.com/the-transparent-proxy-pattern/.

    Também é possível alterar o nome do contrato e adicionar “funções falsas” ao contrato inteligente.

  2. Ainda mais complicado, um agente mal-intencionado pode usar cadeias de proxy (um proxy, que delega uma chamada a um proxy, que delega ao contrato) para “ocultar” o código e tornar um pouco mais difícil ver o que está acontecendo no contrato.

Conclusão

Não confie cegamente em um contrato inteligente, mesmo que seja verificado no Etherscan. Sempre verifique o código para ter certeza de que não está interagindo com um proxy.

Oldest comments (0)