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:
- Você implanta um contrato inteligente PROXY e o endereço dele é, digamos, 0x01.
- Você implanta o contrato de implementação e o endereço dele é 0x02.
- 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
Fonte da imagem: https://mycelium.xyz
- 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á?
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.
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?
-
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.
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)