A carregar preços…

Como revogar aprovações de contratos inteligentes (e porque deve fazê-lo)

Aprovações de tokens inativas são um dos principais vetores de ataque. Veja uma rotina mensal para encontrar, classificar e revogar autorizações arriscadas na Ethereum e nas L2.

Como revogar aprovações de contratos inteligentes (e porque deve fazê-lo)

O que é realmente uma aprovação de tokens, e porque sobrevive à transação

Quando trocas um token numa exchange descentralizada, emprestas ativos num mercado monetário ou fazes stake através de um painel de DeFi, não entregas os teus tokens a uma pessoa. Assinas uma mensagem que pede ao contrato inteligente do token que permita que outro contrato inteligente mova um número específico dos teus tokens em teu nome. Essa mensagem assinada é a aprovação, e permanece on-chain indefinidamente até tu ou alguém a cancelar explicitamente.

Esta é a parte que a maioria dos iniciantes compreende mal. A aprovação não está ligada a uma única transação. É uma permissão permanente. A DEX ou o protocolo de empréstimo com que interagiste em 2023 pode, em princípio, continuar a mover tokens da tua carteira hoje, porque o próprio contrato do token registou que tem autorização para o fazer.

Existem duas variantes que verás numa ferramenta como o Etherscan. Uma aprovação 'limitada' define um teto, por exemplo 100 USDC, após o qual o contrato tem de te pedir para assinar de novo. Uma aprovação 'infinita' (tecnicamente o valor máximo representável num uint256, que é um número inteiro sem sinal de 256 bits, ou um número tão grande que é praticamente ilimitado) não define qualquer teto. A maioria das interfaces de DeFi usa como predefinição a aprovação infinita, porque poupa ao utilizador uma assinatura extra em cada transação futura, e porque pagar gas duas vezes para a mesma dapp parece desperdício.

A compensação é real: uma aprovação infinita é cómoda para ti, e também é cómoda para quem quer que, mais tarde, assuma o controlo desse contrato.

O risco: como uma aprovação esquecida se torna num esvaziamento

O modo de falha raramente é um novo ataque engenhoso. É quase sempre um de três padrões mais antigos, e todos são agravados por aprovações que estão on-chain há meses.

1. O próprio contrato é comprometido. Uma chave de developer é alvo de phishing, uma carteira multisig é sequestrada, ou o protocolo sofre um ataque de governance em que os atacantes aprovam uma proposta que atualiza os contratos para uma versão maliciosa. Quando o contrato se torna hostil, cada aprovação ainda ativa que detém é uma arma carregada apontada à carteira do utilizador. O utilizador não precisa de interagir com nada de novo. O contrato limita-se a chamar transferFrom por iniciativa própria.

2. O protocolo é abandonado, mas o contrato não é pausado. Muitos projetos de DeFi são lançados, angariam dinheiro, perdem interesse e encerram discretamente. Os contratos continuam a correr. Se mais tarde for encontrada uma vulnerabilidade e não houver equipa para a corrigir, os atacantes podem esvaziar todas as carteiras que alguma vez aprovaram esse endereço. Isto aconteceu repetidamente com contratos antigos de staking e agregadores de yield do ciclo 2020 a 2021.

3. Aprovaste um site de phishing que parecia uma dapp real. Uma interface falsa de Uniswap ou Aave assina uma aprovação para um contrato controlado pelo atacante. O utilizador pensa que está a negociar, mas na verdade deu a um desconhecido permissão para esvaziar um token específico. Neste caso, revogar é urgente, e é também a única solução, porque a aprovação assinada já está on-chain.

Repara no que falta nesta lista: não precisas de ser 'hackeado de novo' para o esvaziamento acontecer. A vulnerabilidade é a própria aprovação, pousada em arquivo morto na blockchain, à espera de um evento futuro para a ativar.

Como ver o que já aprovou

O primeiro passo é fazer o inventário. Ligue a sua carteira a uma de três ferramentas, todas elas leem os mesmos dados da blockchain subjacente e apresentam-nos de formas ligeiramente diferentes.

O Revoke.cash é o mais acessível para principiantes. Entra no site, liga a carteira, e ele lista todas as aprovações que assinou nas cadeias que suporta, que hoje incluem Ethereum, Arbitrum, Optimism, Base, Polygon, BNB Chain e quase todas as outras redes EVM (Ethereum Virtual Machine) relevantes. Cada linha mostra o token, o spender (o contrato que pode movimentar o token), o allowance (a quantidade que pode movimentar) e um botão “Revoke”. Também assinala contratos que não são usados há muito tempo como potencialmente inativos.

A ferramenta de aprovação de tokens do Etherscan está disponível em etherscan.io/tokenapprovalchecker. É mais rudimentar que o Revoke.cash, mas é mantida por uma equipa com um longo histórico público, e por vezes deteta casos limite que o Revoke.cash deixa passar. O processo é o mesmo: ligar, analisar, revogar.

O gestor de aprovações integrado no Rabby é a única opção on-chain que não exige visitar um site externo. O Rabby é uma carteira (uma extensão de navegador e uma aplicação móvel) que lê as suas aprovações e apresenta uma lista de “aprovações perigosas” dentro da própria interface da carteira. Se já usa o Rabby, este é o caminho com menos atrito. Os dados são os mesmos; a interface apenas vive onde já confia.

Seja qual for a ferramenta escolhida, utilize apenas uma por sessão. O risco de andar a alternar entre vários separadores de verificadores de aprovações é perder o controlo de que site está ligado à sua carteira, o que por si só já é um risco ligeiro de phishing.

Como perceber que aprovações são realmente perigosas

Depois de ter a lista, não precisa de revogar tudo. Uma boa primeira passagem dá prioridade às entradas mais arriscadas.

As aprovações infinitas vêm primeiro. Ordene ou filtre a lista por qualquer linha que apresente um número enorme, frequentemente em notação científica como 1.15792e+59, que é a forma codificada do uint256 máximo. Estas são as limpezas com maior impacto. Cada uma é um contrato que pode movimentar 100% desse token da sua carteira sem voltar a pedir autorização.

A seguir vêm as aprovações limitadas a contratos que já não utiliza. Se aprovou um contrato de staking para exatamente 500 tokens há dois anos e já não o utiliza, essa aprovação continua ativa. Tem um raio de impacto mais pequeno do que uma infinita, mas continua a ser uma arma carregada apontada a um contrato que não monitoriza.

Contratos inativos merecem atenção. A maioria das ferramentas de aprovação mostra uma data de “última utilização” ou marca contratos que não transacionam há mais de um ano. Estas são as aprovações com maior probabilidade de pertencerem a projetos abandonados, e projetos abandonados são as aprovações com maior probabilidade de serem exploradas mais tarde. Revogue-as.

Contratos ativos que ainda utiliza podem esperar. Se negoceia ativamente na Uniswap e empresta na Aave, pode manter essas aprovações abertas. Revogar e voltar a aprovar a cada transação desperdiça gás e gera fadiga de assinaturas, o que é um risco de segurança por si só. O objetivo de uma limpeza mensal não é zero aprovações; é zero aprovações obsoletas.

A mecânica de revogar e quanto custa na prática

Revogar é, por si só, uma transação on-chain. Está a chamar a função approve no contrato do token e a definir o seu allowance para esse spender como zero. O contrato do token regista o novo allowance, e a partir desse bloco o spender deixa de poder movimentar os seus tokens.

Na mainnet da Ethereum, uma única revogação custa tipicamente entre um e cinco dólares em gás, dependendo do congestionamento. Se tiver vinte aprovações obsoletas, a fatura é considerável. Em redes layer-2 (L2s) como Base, Arbitrum ou Optimism, a mesma chamada custa cêntimos, por vezes frações de cêntimo, porque as L2s agrupam transações e herdam a segurança da Ethereum cobrando taxas muito mais baixas. Se está a escolher onde fazer a limpeza mensal, fazê-la na L2 que realmente utiliza é quase sempre a decisão certa.

Há uma armadilha pequena mas real. Quando submete uma transação de revogação, a carteira ainda tem de pagar gás, e o gás tem de vir do ativo nativo dessa cadeia, ou seja, ETH na Ethereum e na Arbitrum, MATIC na Polygon, BNB na BNB Chain. Se a sua carteira só tem stablecoins e o saldo do ativo nativo é zero, a revogação vai falhar. Mantenha uma pequena quantidade do token nativo em qualquer carteira que pretenda limpar, da ordem de alguns dólares.

Outra armadilha: revogar é irreversível no sentido de que não recupera o gás, mas é trivialmente reversível no sentido de que pode voltar a aprovar o mesmo contrato no dia seguinte. Não há qualquer penalização por revogar um contrato que mais tarde decida usar de novo; apenas terá de assinar uma nova aprovação, pagar o respetivo gás, e seguir em frente.

O que revogar não faz

Revogar impede futuros esvaziamentos a partir do contrato que revogou. Não desfaz, nem pode desfazer, um esvaziamento que já aconteceu. Se a sua carteira foi esvaziada em março e revoga em maio, os tokens de março estão perdidos, e a transação de revogação não tem qualquer relação legal, forense ou recuperável com o roubo.

Revogar também não o protege de uma nova aprovação que assine amanhã. Se visitar um site de phishing, assinar uma aprovação para um contrato malicioso e depois tentar fazer a limpeza, a nova aprovação é o problema, e revogar o seu antigo allowance da Uniswap não ajuda em nada.

Revogar não move os seus tokens. Não exige uma troca, uma assinatura de terceiros, nem qualquer interação com o contrato do spender. É uma única chamada de função ao próprio contrato do token, a dizer-lhe para zerar uma linha do seu registo de allowances.

Uma rotina mensal que consegue realmente manter

O maior motivo pelo qual as pessoas nunca revogam aprovações é porque parece uma tarefa pontual, o que garante que nunca será feita. A solução mais fiável é associá-la a um evento no calendário. O primeiro domingo do mês é uma escolha popular porque os fins de semana são mais calmos e é menos provável que esteja a meio de uma negociação; algumas pessoas escolhem o dia em que o extrato do cartão de crédito fecha, pela mesma razão. O dia específico não importa. O que importa é a repetição.

No dia da limpeza, o procedimento é curto. Abra o Revoke.cash, o Etherscan ou o gestor de aprovações da Rabby. Ligue a carteira que utiliza ativamente. Ordene primeiro pelas aprovações infinitas e revoque-as. Depois procure contratos inativos, que a ferramenta geralmente assinala, e revoque-os. Deixe intactos os contratos ativos que ainda utiliza. Confirme cada transação, aguarde que seja processada e feche o separador.

Tempo necessário numa L2: cerca de cinco a dez minutos. Tempo necessário na mainnet: semelhante, mais alguns dólares em gas. O hábito, depois de instalado, demora menos tempo do que verificar o extrato bancário e paga-se da primeira vez que travar um drain.

Como acompanhar as notícias de segurança de carteiras de forma inteligente

Os incidentes de segurança em carteiras acontecem depressa, e a diferença entre um 'hack controlável' e uma 'perda total' está quase sempre na rapidez com que um utilizador ouve falar de um contrato vulnerável e revoga a sua aprovação antes de um atacante a esvaziar. Acompanhar manualmente o fórum de governação, os relatórios de auditoria e as análises pós-incidente de cada protocolo é uma batalha perdida. A Zippfeed destaca notícias de segurança de carteiras e explorações de DeFi com classificação de sentimento (bullish, neutral ou bearish) e uma avaliação de importância, para que possa revogar as aprovações certas antes do próximo drain, e não depois.

Perguntas frequentes

É seguro usar o Revoke.cash?
O Revoke.cash é uma das ferramentas de gestão de aprovações mais utilizadas e, por defeito, é apenas de leitura: ao ligar a sua carteira, o site lê as suas aprovações, mas não pode movimentar fundos sem uma transação que você assine. Ainda assim, aplicam-se os riscos habituais de qualquer dapp, por isso confirme sempre o URL, guarde-o nos favoritos em vez de pesquisar e nunca assine uma transação que não compreenda. Educação, não aconselhamento financeiro: usar uma ferramenta reputada é um bom hábito, mas nenhuma ferramenta elimina a necessidade de ler o que está a assinar.
Como funciona, na prática, uma aprovação ERC-20?
Quando assina uma aprovação, está a chamar a função approve no contrato inteligente de um token, indicando que pretende autorizar um endereço gastador específico a movimentar uma determinada quantidade dos seus tokens. O contrato do token regista essa allowance e o gastador pode chamar transferFrom em seu nome até esse limite. A aprovação permanece on-chain até que a defina novamente como zero. É por isso que uma aprovação atribuída a um contrato já extinto continua a ser um risco ativo anos depois.
Devo revogar todas as aprovações que tenho?
Não precisa de revogar tudo e, ao tentar fazê-lo, normalmente desperdiça gás e acumula fadiga de assinaturas. Dê prioridade às aprovações infinitas em contratos que já não utiliza, depois aos contratos inativos e, por fim, às aprovações limitadas em protocolos antigos. Mantenha abertas as aprovações relativas a protocolos que utiliza com regularidade, porque revogar e voltar a aprovar a cada operação custa dinheiro e não traz benefícios reais de segurança. O objetivo de uma limpeza é chegar a zero aprovações obsoletas, não a zero aprovações.
Revogar uma aprovação devolve-me os fundos caso já tenha sido drenado?
Não. Revogar uma aprovação é uma ação preventiva: impede que o contrato revogado movimente os seus tokens no futuro, mas não reverte, nem reembolsa, nem recupera tokens que já tenham sido roubados. Se já foi drenado, o caminho a seguir é a resposta a incidentes, não a limpeza de aprovações: transfira os fundos restantes para uma carteira nova, registe as transações e reporte ao projeto em causa e a empresas de análise de blockchain. A higiene de aprovações é prevenção, não um mecanismo de reembolso.