Back to Blog

Troca entre Conveniência e Segurança: Aprovação Ilimitada no ERC20

August 17, 2021
12 min read

Resumo

No Ethereum, o token ERC20 é amplamente utilizado por empresas ou usuários para construir aplicações descentralizadas (DApps). Muitos tokens ERC20 adquirem grande valor e circulam no mercado de criptomoedas. Além disso, com o desenvolvimento próspero do ecossistema DeFi, as negociações com tokens ERC20 tornaram-se mais frequentes. Com base no padrão ERC20, o método approve() é invocado para conceder permissão a DApps ou outros usuários para sacar tokens. Na prática, muitos DApps exigem aprovação ilimitada dos usuários e esse design trouxe um problema grave. Uma série de incidentes ocorreu e causou perdas enormes tanto para usuários quanto para os próprios DApps.

0xffffff. Prefácio

Como um tema discutido há muito tempo, a "Aprovação Ilimitada" surgiu com o desenvolvimento próspero do DeFi e alguns incidentes de segurança. Com a inspiração de muitos incidentes de segurança, estamos tentando novamente realizar uma investigação abrangente sobre a "Aprovação Ilimitada" em diferentes aspectos. Ao mesmo tempo, fomos convidados a participar da 29ª conferência Blockchain Village e falar sobre esse assunto.

Recomendação de leitura:

  • Se você está começando no Ethereum, recomendamos fortemente a leitura do blog completo.
  • Se você é especialista em Ethereum e já tem experiência com aprovação ilimitada, pode começar a leitura a partir da seção 0x2.

0x0. Contexto

Antes de entrarmos na discussão sobre "O que é a aprovação ilimitada?", gostaria de recapitular "O que é a aprovação no token ERC20?".

Tokens ERC20

No Ethereum, além do Ether, diversos tokens circulam no mercado de criptomoedas com grande valor. O ERC20 é o padrão de token mais popular. Com base em nossas estatísticas incompletas, mais de 5.600 e 44.000 tokens ERC20 foram registrados no CoinGecko (um site que agrega preços de tokens) e na Uniswap (atualmente uma das exchanges descentralizadas mais famosas).

Mecanismo de Aprovação

O processo de aprovação envolve principalmente três entidades (remetente, gastador e contrato do token), bem como duas funções (approve, transferFrom) e duas variáveis (balanceOf, allowance) no padrão ERC20 (conforme mostrado na figura abaixo).

Para entender o processo de aprovação, apresentamos a figura abaixo e explicamos como as funções approve e transferFrom alteram o estado do contrato do token.

  1. (Etapa 1) Como status inicial, o remetente possui 100 tokens no contrato e o gastador não possui nenhuma allowance aprovada pelo remetente.
  2. (Etapa 2) O remetente invoca a função approve para conceder permissão de 100 tokens ao gastador. Portanto, allowance[sender][spender] aumenta de 0 para 100 e não há alteração no balanceOf do remetente.
  3. (Etapa 3) Por fim, o gastador invoca transferFrom para mover 80 tokens do remetente para si mesmo. Como resultado, o balanceOf tanto do remetente quanto do gastador são atualizados (ou seja, 20 e 80), e a allowance do gastador diminui para 20.

Três tipos de aprovação na prática

No mundo real, podemos classificar todas as aprovações em três tipos com base no valor aprovado.

  • Aprovação Zero: O valor de aprovação é igual a zero. Isso basicamente significa que o usuário/remetente está tentando revogar sua allowance de uma determinada plataforma/gastador.
  • Aprovação Ilimitada: O valor de aprovação é igual ao valor máximo de uint256 (0xffff...ffff) ou ao fornecimento total dos tokens. Esse tipo de aprovação é frequentemente utilizado por muitas plataformas DeFi (como exchanges e plataformas de empréstimo).
  • Outras Aprovações: Este tipo cobre o restante. Os usuários normalmente realizam essa aprovação com base no recurso de modificação suportado por plataformas ou carteiras.

0x1. Incidentes do Mundo Real

Existem também alguns incidentes do mundo real relacionados ao problema de aprovação mencionado anteriormente. Em nossa palestra, abordamos dois (UniCat, Bancor Finance) dessas histórias com detalhes. Se quiser saber mais sobre esses incidentes, basta seguir os links fornecidos abaixo:

0x2. Algumas Medições

Nesta seção, apresentaremos nossa investigação detalhada tanto dos aspectos off-chain quanto on-chain. Para entender melhor a situação atual da "aprovação ilimitada", assumimos o papel de usuário frontend para conduzir nossa medição.

Processo de Aprovação no Mundo Real

A figura acima mostra que os usuários frontend podem seguir seis etapas para concluir uma transação de aprovação. Há quatro entidades principais (usuários frontend, carteiras, plataformas, contratos de token). Agora, vamos percorrer o fluxo passo a passo:

Etapas 1 e 2: Primeiro, a maioria dos usuários frontend (mobile, website) conecta suas carteiras à plataforma selecionada e envia suas solicitações de serviço.

Etapa 3: Em seguida, das plataformas para a carteira do usuário, a plataforma constrói a transação de aprovação com os dados necessários (mais importante, o valor de aprovação) e a envia para a carteira do usuário para confirmação.

Etapas 4 e 5: Após receber a transação de aprovação, a carteira exibirá as informações correspondentes para o usuário e aguardará sua confirmação.

Etapa 6: Assim que o usuário confirmar a transação, a carteira enviará a transação para a rede para validação. Além disso, a transação validada modificará o estado do contrato do token (Allowance[Usuário][Plataforma]).

(Na próxima seção, apresentaremos primeiro nossa motivação para cada tipo de medição (off-chain e on-chain). Em seguida, apresentaremos nossos resultados e descobertas com diferentes aspectos.)

Investigação Off-chain

Motivação

No processo de aprovação do mundo real, podemos facilmente perceber que os usuários frontend interagem diretamente com a interface do usuário da carteira e da plataforma. Portanto, escolhemos 15 carteiras conhecidas e 24 plataformas DeFi (Finanças Descentralizadas) e realizamos a investigação off-chain.

(Os resultados da investigação estão resumidos em duas figuras mostradas abaixo.)

Além disso, consideramos principalmente a explicação e a flexibilidade na aprovação:

  • Explicação
  • Carteira: 1) Se a carteira exibe informações adequadas sobre a transação de aprovação (incluindo usuário, gastador, token e valor de aprovação); 2) Se a carteira fornece um aviso especial ou notifica os usuários sobre a "aprovação ilimitada"
  • Plataforma:(Critério 1)Se a plataforma fornece uma explicação adequada para transações de aprovação em sua interface web;(Critério 2)Se a plataforma notifica os usuários sobre a existência da transação de aprovação;(Critério 3)Se a plataforma notifica os usuários que duas transações são executadas sequencialmente
  • Flexibilidade: Tanto em carteiras quanto em plataformas, se a interface oferece recurso de modificação do valor de aprovação

(Na próxima seção, mostraremos o resultado de como os dois aspectos acima são executados tanto em carteiras quanto em plataformas. Selecionamos dois casos para cada uma das carteiras e plataformas.)

0x222. Carteiras: Metamask & Coinbase

Apresentaremos nosso resultado de investigação na carteira Coinbase e na carteira Metamask (extensão do Chrome). De acordo com as informações da Google Play Store (mostradas na figura abaixo), Coinbase e Metamask ambos têm mais de 1 milhão de instalações. De alguma forma, Coinbase obteve mais avaliações de clientes e também possui uma pontuação mais alta.

Quanto à investigação das duas carteiras, usamos ambas para testar a função de troca na plataforma Compound. Observe que a plataforma Compound define a aprovação ilimitada como padrão para os usuários.

Carteira 1: Metamask

Conforme mostrado na figura abaixo, enquanto os usuários estão revisando a transação de aprovação construída pelo Compound, eles podem ver basicamente as informações completas, incluindo o endereço do gastador, a assinatura de aprovação e o valor de aprovação (Etapa 2). Além disso, o Metamask até permite que os usuários modifiquem o valor de aprovação com o botão "Editar" (Etapas 2, 3, 4).

Carteira 2: Coinbase

Em comparação com a carteira Metamask, a carteira Coinbase não apresenta nenhuma informação importante. Os usuários só podem ver mais detalhes após confirmar a transação de aprovação (figura abaixo). Observe que as etapas 2, 3 e 4 são mostradas apenas durante ou após a transação de aprovação estar em modo pendente ou concluído. Portanto, a carteira Coinbase oculta as informações necessárias da transação de aprovação e não oferece nenhum recurso de modificação para o valor aprovado.

0x223. Plataformas: Bancor & Curve Finance

Nesta seção, vamos comparar Bancor e Curve Finance. Conforme mostrado na figura abaixo, com base nas estatísticas mais recentes (em 7 de agosto de 2021) do defipulse, Curve Finance e Bancor são a primeira e a quinta DEX (exchange descentralizada) em termos de valor total bloqueado.

Para a configuração de nossa investigação em ambas as plataformas, usaremos a carteira Metamask para testar o recurso de troca fornecido por ambas.

Plataforma 1: Bancor

Enquanto testávamos o recurso de troca no Bancor, ele explica a necessidade da transação de aprovação (figura abaixo) e ainda oferece aos usuários duas opções (aprovação ilimitada/limitada). Além da aprovação ilimitada, a aprovação limitada no Bancor exige apenas o valor exato de allowance que os usuários pretendem usar para a troca.

Plataforma 2: Curve Finance

No entanto, no Curve Finance, algo 'interessante' acontece. Conforme mostrado na figura abaixo, quando solicitamos uma troca, a interface do Curve Finance exibe "Por favor, aprove 10 USDT para a exchange" (figura abaixo), mas o Metamask recebe uma transação de aprovação ilimitada. Esta é definitivamente uma informação enganosa para os usuários.

Posteriormente, quando tentamos confirmar o problema com o Curve Finance, eles reconheceram nossa preocupação e disseram que isso ocorre porque "os usuários não gostavam de aprovar toda vez" (figura abaixo).

Semelhante ao Curve Finance, a interface do Yearn Finance tem o mesmo problema. (Também mencionamos e mostramos as evidências em nossa palestra)

0x23. Investigação On-chain

0x231. Motivação

Para entender melhor a situação da "aprovação ilimitada" na blockchain, coletamos todas as transações (até 30 de abril de 2021) para continuar nossa exploração. Conforme mostrado na figura abaixo, o número de "aprovações ilimitadas" cresce muito rapidamente atualmente. Em nossa investigação, descobrimos que a introdução do UniswapV2 parece ser o principal fator que estimulou o crescimento da "aprovação ilimitada". E explicaremos mais sobre este ponto com base em nossos resultados de medição.

Ao mesmo tempo, para explorar a "aprovação ilimitada" tanto em nome do token quanto da plataforma (pois são os termos mais relacionados, em vez dos próprios usuários), conduziremos nossa investigação em dois aspectos:

  • A distribuição da "Aprovação Ilimitada"
  • Análise de Risco

0x232. A Distribuição da "Aprovação Ilimitada"

Para ajudar a entender os gráficos abaixo, explicaremos primeiro cada termo mencionado nas figuras:

  • Eixo Y (Proporção Máxima de Aprovação): Valor maior -> Maior percentual de "Aprovação Ilimitada" entre todas as transações de aprovação
  • Eixo X (Atividade): Valor maior -> Plataformas ou tokens mais ativos. O valor da atividade depende do número de transações de aprovação e da diferença de tempo entre a primeira e a última transação de aprovação
  • Tamanho do Ponto: Tamanho maior -> Mais transações de aprovação envolvendo o token ou plataforma

(As duas figuras abaixo mostram apenas os 1000 principais tokens/plataformas mais frequentemente envolvidos em transações de aprovação)

(Plataforma)

(Token)

Plataforma: Ao observar o gráfico das plataformas, o UniswapV2 claramente domina todas as outras plataformas nos três critérios. É por isso que declaramos que "a introdução do UniswapV2 parece ser o principal fator que estimulou o crescimento da 'aprovação ilimitada'".

Token: Quanto à distribuição, USDC, USDT e DAI têm o melhor desempenho com base nos três critérios definidos acima. Esses tokens são todos stablecoins, o que faz sentido, pois stablecoins são geralmente usadas para realizar negociações no mercado de criptomoedas. Quanto aos outros tokens destacados (Top 10 tokens), eles são bastante semelhantes em Proporção Máxima de Aprovação.

0x233. Análise de Risco

De acordo com os resultados anteriores, selecionamos USDC, USDT, DAI (top 3 tokens) e duas plataformas (Bancor, UniCat) para conduzir nossa análise de risco. Ao mesmo tempo, também definimos dois termos (conforme mostrado na figura abaixo) para ajudar a desmistificar o risco dos tokens aprovados.

Valor em Risco

  • Para token, o Valor em Risco é igual ao valor total de tokens que poderia ser transferido invocando a função transferFrom
  • Para Plataforma,o Valor em Risco é igual ao valor total de um único token que poderia ser transferido invocando a função transferFrom

Taxa de Risco

  • Com um token fixo, a Taxa de Risco representa o percentual do Valor em Risco sobre o fornecimento total desse token fixo

Token: Conforme mostrado na figura abaixo, USDC e USDT são bastante estáveis (suas taxas de risco ficam em torno de 10%) durante o ano e meio. O DAI experimenta uma queda dramática no meio do ano e finalmente se estabiliza (também em torno de 10%, mas com mais oscilações). Esse fenômeno pode indicar alguns eventos específicos ou o mecanismo de funcionamento do DAI. Portanto, ainda há trabalho a ser feito para explorarmos a causa.

Plataforma: Sobre a análise de risco nas plataformas, apresentaremos um gráfico de tendência do valor em risco (figura abaixo) tanto para o Bancor (com token BNT) quanto para o UniCat (com token UNI).

O gráfico de tendência do Bancor mostra um crescimento e queda instantâneos. Isso é na verdade uma explicação perfeita de quão rapidamente a equipe transferiu seus tokens exploráveis do contrato com falha para um lugar seguro.

Quanto ao gráfico de tendência do UniCat, confirmamos que as quedas óbvias são de fato causadas pelos ataques de backdoor do UniCat.

0x3. Soluções Existentes

Conforme mencionado anteriormente, a "Aprovação Ilimitada" é um tema que existe no ecossistema há muito tempo. Através de várias discussões, algumas soluções foram propostas para melhorar o processo de aprovação:

  • ERC777
  • EIP2612

Antes de entrar nas soluções, gostaríamos de lembrá-los novamente sobre a motivação raiz da "aprovação ilimitada":

  • Duas transações são necessárias tanto para approve quanto para transferFrom
  • A aprovação personalizada obriga os usuários a aprovar toda vez antes de negociar ou depositar (o que significa mais taxas de transação a pagar)
  • As plataformas querem maximizar a experiência do usuário solicitando aprovação ilimitada uma única vez

0x31. ERC777

Como padrão de token proposto em 2017, o ERC777 tem os seguintes pontos usados para melhorar o processo de aprovação do token ERC20:

  • Os usuários podem "autorizar" um operador (como uma exchange) para transferir seus tokens com o valor desejado
  • Os usuários não precisam enviar transações de aprovação repetidamente
  • Os usuários não precisam se preocupar com o risco da "aprovação ilimitada"

Em conclusão, com o ERC777, os usuários podem realizar compras atômicas com qualquer operador autorizado.

No entanto, as desvantagens do ERC777 também são óbvias:

Alta taxa de transação, devido aos hooks aplicados no padrão (para mais detalhes). Os usuários devem selecionar um operador confiável (O que joga a questão de volta para os usuários).

0x32. EIP2612

Sobre o EIP2612, nesta proposta, o autor indica que os usuários podem usar mensagens assinadas para a validação da transação, de modo que os usuários não precisem pagar nenhuma taxa de transação para modificar sua allowance. Mais diretamente, as transações de aprovação tornam-se gratuitas com o EIP2612. Além disso, esta proposta é atualmente utilizada pelo UniswapV3 para tokens de provedores de liquidez.

0x4. Conclusão

Em conclusão, a "Aprovação Ilimitada" realmente reduz o custo para os usuários executarem múltiplas transações de aprovação. No entanto, através de nossa investigação, algumas plataformas e carteiras ainda fingem ser inofensivas na batalha entre conveniência e segurança. Pior ainda, algumas delas até tentam enganar os usuários exibindo informações incorretas. Portanto, em vez de utilizar a "Aprovação Ilimitada", sugerimos que plataformas e carteiras considerem seriamente o desenvolvimento de uma interface ou protocolo mais seguro para proteger os usuários desde o início. Como usuário de DeFi, construir o senso de segurança não deve ser o resultado de explorações, mas sim ter consciência desde o princípio. Acreditamos que construir um ambiente seguro e próspero no Ethereum não é apenas responsabilidade da comunidade, mas de cada um de nós.

Sobre nós

https://www.blocksecteam.com

[email protected]

Twitter: https://twitter.com/BlockSecTeam

Medium: https://blocksecteam.medium.com/