Em 5 de dezembro de 2023, a proeminente plataforma de desenvolvimento Web3 Thirdweb divulgou vulnerabilidades significativas de segurança em contratos inteligentes que afetavam seus contratos pré-construídos. Essa falha crítica impactou todos os tokens ERC-20, ERC-721 e ERC-1155 implantados usando esses contratos vulneráveis específicos. Nos dias seguintes à divulgação, os tokens implantados com esses contratos vulneráveis foram progressivamente explorados em uma série de ataques, ressaltando a gravidade da incompatibilidade subjacente.
Entendendo a Vulnerabilidade dos Contratos Inteligentes da ThirdWeb
A causa raiz do incidente da ThirdWeb está na interação inesperada entre dois componentes fundamentais do desenvolvimento de contratos inteligentes: ERC-2771 e a implementação de Multicall da OpenZeppelin. Para compreender totalmente a vulnerabilidade, é essencial entender cada componente individualmente e, em seguida, como a interação entre eles criou um caminho explorável.
ERC-2771: Meta-Transações e Forwarders Confiáveis
EIP-2771 define um protocolo em nível de contrato que permite que contratos Recipient aceitem meta-transações por meio de contratos Forwarder confiáveis. Esse padrão é essencial para melhorar a experiência do usuário, permitindo que terceiros (forwarders) paguem taxas de gás em nome dos usuários, abstraindo a necessidade de os usuários possuírem tokens nativos da blockchain.
Na prática, o ERC2771Context da OpenZeppelin é uma implementação amplamente adotada. Sua funcionalidade principal envolve tratar os últimos 20 bytes do calldata de um forwarder confiável como o _msgSender() efetivo. Para os desenvolvedores que usam essa biblioteca, a prática comum é substituir todos os usos diretos de msg.sender por _msgSender() para garantir compatibilidade com meta-transações. Da mesma forma, _msgData() é usado para recuperar os dados originais da transação, excluindo as informações do remetente anexadas.
function _msgSender() internal view virtual override returns (address) {
uint256 calldataLength = msg.data.length;
uint256 contextSuffixLength = _contextSuffixLength();
if (isTrustedForwarder(msg.sender) && calldataLength >= contextSuffixLength) {
return address(bytes20(msg.data[calldataLength - contextSuffixLength:]));
} else {
return super._msgSender();
}
}
function _msgData() internal view virtual override returns (bytes calldata) {
uint256 calldataLength = msg.data.length;
uint256 contextSuffixLength = _contextSuffixLength();
if (isTrustedForwarder(msg.sender) && calldataLength >= contextSuffixLength) {
return msg.data[:calldataLength - contextSuffixLength];
} else {
return super._msgData();
}
}
Multicall: Agrupamento de Transações para Eficiência
A funcionalidade Multicall permite que os usuários agrupem múltiplas chamadas de função em uma única transação, reduzindo significativamente os custos de gás e melhorando a eficiência das transações. O MulticallUpgradeable da OpenZeppelin é uma implementação popular para essa finalidade. Ele recebe um array de bytes de calldata e realiza um delegatecall para cada entrada, executando-os dentro do contexto do contrato chamador.
function multicall(bytes[] calldata data) external virtual returns (bytes[] memory results) {
results = new bytes[](data.length);
for (uint256 i = 0; i < data.length; i++) {
results[i] = _functionDelegateCall(address(this), data[i]);
}
return results;
}
(Nota: O bug discutido aqui foi corrigido em versões posteriores do Multicall da OpenZeppelin.)
A Incompatibilidade: Conflito entre ERC-2771 e Multicall
O núcleo da vulnerabilidade dos contratos inteligentes do incidente da ThirdWeb emergiu de uma inconsistência crítica na forma como o calldata é processado pelo ERC-2771 e pelo Multicall. O ERC-2771 espera que o forwarder confiável empacote os dados da mensagem e as informações do remetente juntos. O contrato destinatário então usa _msgData() e _msgSender() para desempacotar corretamente essas informações.
No entanto, a função Multicall, em sua implementação vulnerável, não foi projetada para ser compatível com a forma como o ERC-2771 empacota dados para meta-transações. Especificamente, quando o Multicall processa um lote de chamadas, ele deveria ter extraído corretamente o _msgSender() da meta-transação inicial e então anexado essas informações do remetente ao calldata de cada chamada individual antes de executá-las. Essa etapa crucial estava ausente.
Sem as informações do remetente sendo corretamente anexadas ao calldata dentro de cada sub-chamada processada pelo Multicall, o contexto ERC-2771 dentro do contrato alvo tentaria desempacotar as informações do remetente a partir dos últimos 20 bytes do _msgData() da sub-chamada. Crucialmente, um atacante poderia controlar esses últimos 20 bytes. Isso permitiu que um agente malicioso criasse calldata específico que, quando processado pelo Multicall e então interpretado por um contrato habilitado para ERC-2771, executaria lógica arbitrária com um valor _msgSender() manipulado (por exemplo, um endereço controlado pelo atacante ou até mesmo o endereço do pool de um protocolo). Isso efetivamente contornou as verificações de segurança pretendidas e violou as expectativas estabelecidas por ambas as especificações, levando a ações não autorizadas.
Incidente ThirdWeb: Análise e Exploração do Ataque
Vamos examinar um exemplo real da exploração da vulnerabilidade dos contratos inteligentes do incidente da ThirdWeb, usando uma transação de ataque analisada pela plataforma Phalcon da BlockSec.
A estratégia do atacante envolveu manipular o _msgSender() para se passar por um pool Uniswap, drenando assim seu saldo de tokens.
-
Passo 1: Aquisição Inicial de Tokens. O atacante começou trocando 5 WETH por 3.455.399.346 tokens TIME em uma exchange descentralizada. Isso forneceu os tokens necessários para a manipulação subsequente.
-
Passo 2: Execução Maliciosa do Multicall. Este é o núcleo da exploração. O atacante invocou um forwarder confiável com calldata cuidadosamente elaborado para explorar a incompatibilidade ERC-2771/Multicall. Quando esse calldata foi analisado pela função
Multicall, resultou na chamada da funçãoburndo contrato de token TIME. Crucialmente, devido à vulnerabilidade, o_msgSender()foi incorretamente interpretado como o endereço do Pool Uniswap. Isso permitiu ao atacante efetivamente queimar uma parcela significativa dos tokens TIME mantidos pelo pool Uniswap, sem autorização real. A plataforma Phalcon da BlockSec fornece rastreamento detalhado de transações para visualizar esse fluxo.
Rastreamento de transação mostrando o multicall malicioso A imagem acima ilustra como a chamada
Forwarder.executedo atacante é processada. A funçãomulticallrecebe um array de bytes, que então leva à chamada da funçãoburncom o_msgSender()manipulado.
Visão detalhada da análise do multicall e chamada da função burn Esta visão detalhada do Phalcon mostra o
bytes[]de comprimento 1 sendo usado como dados para chamar o contrato, levando à execução da funçãoburnsob o falso_msgSender(). -
Passo 3: Manipulação de Preço. Ao queimar uma grande quantidade de tokens TIME do pool Uniswap, o atacante reduziu drasticamente a liquidez do pool para TIME. Essa escassez artificial fez com que o preço de TIME em relação ao WETH disparasse dentro do pool.
-
Passo 4: Arbitragem Lucrativa. Com o preço de TIME artificialmente inflacionado, o atacante então trocou seus 3.455.399.346 tokens TIME restantes de volta por 94 WETH, obtendo um lucro substancial com o preço manipulado.
Essa sequência de eventos demonstra um ataque sofisticado que aproveita uma sutil vulnerabilidade de contrato inteligente decorrente de incompatibilidade entre módulos.
Proteja Seus Contratos Inteligentes com a BlockSec
Não deixe incompatibilidades ocultas exporem seu projeto a riscos. Nossos auditores especializados realizam auditorias abrangentes de contratos inteligentes para identificar e mitigar vulnerabilidades antes que possam ser exploradas.
Melhor Auditor de Segurança para Web3
Valide design, código e lógica de negócios antes do lançamento
Principais Conclusões e Lições do Incidente da ThirdWeb
O incidente da ThirdWeb serve como um lembrete crítico das complexidades inerentes à segurança Web3, particularmente no que diz respeito à interação de bibliotecas de terceiros.
- Riscos de Interoperabilidade: No espaço DeFi em rápida evolução, os projetos dependem fortemente de uma pilha de bibliotecas e módulos de terceiros. Embora esses componentes acelerem o desenvolvimento, suas interações podem introduzir vulnerabilidades inesperadas e ocultas. O incidente da ThirdWeb ilustra claramente que mesmo componentes amplamente utilizados e aparentemente robustos, como o
ERC2771Contexte oMulticallUpgradeableda OpenZeppelin, podem criar lacunas de segurança críticas quando sua integração não é tratada meticulosamente. - Auditoria Técnica Aprofundada é Essencial: Esse tipo de vulnerabilidade de contrato inteligente não é facilmente detectado por verificações superficiais. Requer profunda expertise técnica para analisar como diferentes módulos processam e interpretam dados, especialmente calldata, e identificar possíveis inconsistências. Uma auditoria completa de contratos inteligentes, com foco nas interações entre módulos e casos extremos, é fundamental.
- Monitoramento Contínuo e Resposta a Incidentes: Mesmo com auditorias robustas, novos vetores de ataque podem surgir. O monitoramento contínuo de segurança em blockchain, como o fornecido pelo Phalcon da BlockSec, é crucial para detectar atividades suspeitas em tempo real e permitir uma resposta rápida a incidentes para minimizar danos.
- Além da Segurança de Módulos Individuais: Os desenvolvedores devem pensar além da segurança de componentes individuais e considerar a postura de segurança holística de todo o sistema de contratos inteligentes. Como os dados fluem entre diferentes módulos, como os contextos são preservados ou alterados, e como as chamadas externas são tratadas são todas considerações críticas.
O incidente da ThirdWeb ressalta a importância de uma abordagem proativa e abrangente para a segurança em blockchain. Depender unicamente da reputação de bibliotecas individuais é insuficiente; as interações entre elas devem ser rigorosamente examinadas.
Investigue Incidentes On-Chain com o Phalcon
O Phalcon da BlockSec é a principal plataforma de segurança Web3 para monitoramento em tempo real, resposta a incidentes e análise aprofundada de transações. Compreenda exploits complexos como o incidente da ThirdWeb com uma clareza incomparável.
Leia outros artigos desta série:
- Introdução: Os Dez Principais Incidentes de Segurança "Incríveis" de 2023
- #1: Colhendo Bots MEV ao Explorar Vulnerabilidades no Flashbots Relay
- #2: Incidente Euler Finance: O Maior Hack de 2023
- #3: Incidente KyberSwap: Exploração Magistral de Erros de Arredondamento com Cálculos Extremamente Sutis
- #4: Incidente Curve: Erro do Compilador Produz Bytecode Defeituoso a partir de Código-Fonte Inocente
- #5: Platypus Finance: Sobrevivendo a Três Ataques com um Golpe de Sorte
- #6: Incidente Hundred Finance: Catalisando a Onda de Exploits Relacionados à Precisão em Protocolos Bifurcados Vulneráveis
- #7: Incidente ParaSpace: Uma Corrida Contra o Tempo para Frustrar o Ataque Mais Crítico da Indústria até Então
- #8: Incidente SushiSwap: Uma Tentativa de Resgate Desajeitada Leva a uma Série de Ataques Imitadores
- #9: MEV Bot 0xd61492: De Predador a Presa em uma Exploração Engenhosa



