Vulnerabilidade de replay de assinatura ERC-1271
Autor: Howy Ho

Em 27 de outubro de 2023, a Alchemy descobriu uma vulnerabilidade de replay de assinatura de contrato ERC1271 que afetou um grande número de contas de contrato inteligente (SCA), e levou a riscos ao interagir com diversas aplicações. As SCAs afetadas incluíam nossa LightAccount e a SmartAccount da OKX, e as interações com aplicações que identificamos como estando em risco incluíram Permit2 e Cowswap. Rapidamente levamos essa questão às várias SCAs e aplicações afetadas e descobrimos que curiousapple, um pesquisador de segurança independente, havia encontrado a mesma vulnerabilidade um mês antes. Colaboramos com curiousapple, Frangio (autor do ERC1271), o time do ERC4337, e outros especialistas técnicos em SCA em uma correção. Neste momento, nenhum fundo está em risco e o impacto às aplicações é bastante limitado. Todas as SCAs envolvidas já reconheceram o risco ou lançaram uma correção.
Detalhes técnicos
Assinaturas de contrato ERC-1271
No Ethereum e em todas as chains baseadas na Ethereum Virtual Machine (EVM), existem dois tipos diferentes de contas - Externally Owned Accounts (EOA) e Smart Contracts. EOAs conseguem autenticar mensagens assinando com a chave privada do seu par de chaves ECDSA associado. No entanto, como os smart contracts recebem um endereço predeterminado durante a criação do contrato, eles não têm acesso fácil a uma chave privada para assinar mensagens.
Para resolver esse problema, o padrão de assinaturas de contrato ERC-1271 foi proposto em 2018. Com esse padrão, smart contracts podem implementar restrições/verificações para o que constitui uma assinatura válida, e aplicações podem chamar contract.isValidSignature para verificar se alguma ação foi autorizada pelo smart contract.
No contexto de contas de contrato inteligente (SCAs), o ERC-1271 é bastante útil, pois permite que usuários de SCAs usem aplicações baseadas em assinatura exatamente como as EOAs fazem. Essas aplicações incluem OpenSea, e a maior parte do DeFi (que dependem do fluxo de aprovação de token → chamada).
Vulnerabilidade de replay de assinatura ERC1271
A maioria das SCAs implementa o ERC-1271 usando sua implementação de referência mostrada acima. Do ponto de vista de engenharia, é uma implementação leve, e torna as integrações de clientes muito mais fáceis, já que poderíamos reutilizar métodos como signTypedData, signMessage, eth\_signTypedData\_v e personal\_sign da mesma forma que são usados para EOAs.
No entanto, no caso em que o mesmo endereço possui múltiplas SCAs, e a aplicação não inclui o endereço de origem da interação, a mesma assinatura seria válida em ambas as contas para aquela aplicação.
Como essa vulnerabilidade só é possível com uma combinação de SCA e aplicação, o quão grave essa vulnerabilidade seria depende de quais aplicações essa interação funcionaria. A primeira aplicação que investigamos foi a Permit2, que é infraestrutura pública construída pela Uniswap que melhora a segurança e a UX dos fluxos de aprovação de tokens ERC20 em toda a indústria, e por isso é amplamente usada hoje.
O bloco de código abaixo mostra as structs que a assinatura do Permit2 cobre. Notavelmente, address owner, o endereço de onde os tokens são retirados, não é coberto pela assinatura e é passado como argumento nas chamadas ao Permit2.
Como um atacante tiraria proveito dessa vulnerabilidade de replay de assinatura é algo como:
- Bob solicita um pagamento de
Xtokens de Alice, que possuinSCAs, e solicita que isso seja feito via Permit2 - Depois que Alice assina o primeiro permit, Bob pode fazer replay desse permit em todas as SCAs de Alice para receber um total de
n Xtokens.

Durante esse processo, criamos uma prova de conceito para confirmar essa vulnerabilidade. Ela pode ser encontrada aqui: replay-sig-poc
Impacto
Como parte de nossa investigação, descobrimos que:
-
Múltiplas SCAs estavam em risco.
-
Além da nossa LightAccount, outras SCAs incluíam a Kernel da Zerodev, Biconomy, Soul Wallet, o EIP4337Fallback da eth-infinitism para Gnosis Safes, AmbireAccount, a SmartAccount da OKX, a BaseWallet da Argent, e a Fuse Wallet.
-
Múltiplas aplicações estavam em risco:
-
Permit2 - Transferências baseadas em assinatura são replicáveis via replay. No entanto, a maior parte do uso do Permit2 é com o Universal Router, e qualquer forma de tirar proveito disso exigiria uma vulnerabilidade crítica independente no Universal Router.
-
Cowswap - Trades usando o caminho ERC-1271 são replicáveis via replay. A assinatura cobre
address recipient, então o risco aqui seria, no máximo, preços desatualizados e/ou algumas perdas para MEV. -
Gnosis Safe não era vulnerável a esse vetor de ataque.
Nesse momento, divulgamos isso às SCAs e aplicações via um grupo no telegram e descobrimos que curiousapple também havia descoberto o mesmo problema um mês antes e estava colaborando com Frangio e outros especialistas técnicos em SCA em uma correção. No geral, a lista completa de combinações afetadas de SCAs e aplicações até o momento é mostrada abaixo:

Nota: No caso da Argent, como é um aplicativo móvel e gera o signer por dispositivo, é impossível que 2 SCAs sejam possuídas pela mesma EOA, portanto o ataque de replay de assinatura não funciona contra a Argent. No entanto, projetos que fazem fork dos contratos da Argent sem fazer fork de toda a sua arquitetura podem estar em risco e devem adotar a arquitetura de wallet da Argent, ou lançar uma correção.
Correção
Foram propostas duas correções para as SCAs. Os construtores de SCA devem notar que devem implementar uma dessas duas soluções para prevenir o ataque de replay acima:
Ambas as soluções previnem o ataque de replay de assinatura ERC-1271. A segunda solução é mais leve, mas significaria que os clientes de wallet teriam que exibir um hash opaco para os usuários assinarem. A primeira correção é um caminho mais fácil para garantir que as assinaturas não sejam opacas para o usuário, e é por isso que optamos pela primeira correção para a LightAccount. A maioria das outras SCAs também optou pela mesma correção.
Agradecimentos
Muito obrigado à OKX por pagar uma recompensa por bug a Howy por esse problema!
Parabéns a curiousapple por receber recompensas por bug da Ambire, Instadapp, Biconomy e Cowswap!
Além disso, um grande agradecimento a:
- Dror Tirosh por fazer o brainstorming da abordagem de correção com struct EIP-712 que a maioria das SCAs adotou
- Frangio por compartilhar mais contexto sobre o ERC-1271 e pelo grande esforço em atualizar a implementação de referência do ERC-1271 via o comitê do EIP
- Ivo (Ambire) por seu mergulho profundo nas diferenças de implementação técnica entre as duas soluções propostas
- Vectorized por disponibilizar e financiar uma recompensa de 0,5 ETH para uma implementação cliente da solução EIP-712 aninhada
- Juno (ChainLight) por aceitar o desafio acima, lançando uma implementação cliente da solução EIP712 aninhada e reivindicando a recompensa da Vectorized
- David Eiber por sua ajuda no brainstorming de vulnerabilidades relacionadas, na indexação de SCAs e protocolos afetados, e na criação de PoCs
- Yoav Weiss por sua ajuda durante todo o processo, incluindo nos conectar com pesquisadores de segurança e outras SCAs e aplicações afetadas
Newsletter da Alchemy
Seja o primeiro a saber sobre lançamentos
Assine nossa newsletter
Receba as últimas atualizações de produtos e recursos da Alchemy
Ao inserir seu endereço de e-mail, você concorda em receber nossas comunicações de marketing e atualizações de produtos. Você reconhece que a Alchemy processa as informações que recebemos de acordo com nosso Aviso de Privacidade. Você pode cancelar a inscrição a qualquer momento.
Artigos relacionados

Arquitetando leituras Solana RPC para velocidade e confiabilidade líderes do setor
A Alchemy tem a menor latência de leitura Solana: 9,21 ms, cerca de 26% mais rápido que o próximo provedor.

O custo da latência no trading onchain
Os custos de latência aparecem como a diferença entre o estado observado e a execução. Veja onde o atraso surge, por que o p95 importa e como avaliar seu caminho de RPC.

Robinhood Chain RPC: acesso confiável e de baixa latência no lançamento
Um relato técnico de como a Alchemy preparou a infraestrutura de RPC e WebSocket em produção para o lançamento da Robinhood Chain, e o que os builders devem fazer para obter a mesma confiabilidade.