Uma ferramenta para detectar contratos inteligentes metamórficos PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Uma ferramenta para detectar contratos inteligentes metamórficos

Uma suposição crítica de segurança do Ethereum é que o código de contrato inteligente é imutável e, portanto, não pode ser alterado depois de implantado no blockchain. Na prática, alguns contratos inteligentes pode mudança – mesmo depois de implantados. Com alguns truques inteligentes, você pode criar contratos inteligentes metamórficos que “metamorfose” em outra coisa – e entendendo o que os torna possíveis, você pode detectá-los.

Os contratos inteligentes metamórficos são mutáveis, o que significa que os desenvolvedores podem alterar o código dentro deles. Esses contratos inteligentes representam um sério risco para os usuários da web3 que confiam no código que esperam executar com consistência absoluta, especialmente porque os maus atores podem explorar essa capacidade de mudança de forma. Imagine um invasor usando a técnica para “enrolar” pessoas que estão apostando tokens em um contrato inteligente que não percebem que é metamórfico. Ataques baseados nesta e em premissas semelhantes podem equipar os golpistas para atacar as pessoas e geralmente minar a confiança na promessa total dos sistemas descentralizados.

Para analisar se um contrato inteligente contém propriedades metamórficas, Eu construí um simples Detector de Contrato Metamórfico (inspirado e baseado no trabalho original de Jason Carver, 0 anos e outras). Qualquer pessoa pode usar a ferramenta para verificar se um determinado contrato apresenta sinais de alerta que podem indicar o potencial de metamorfismo. O método não é infalível: só porque um contrato inteligente mostra uma bandeira, não significa que seja necessariamente metamórfico; e só porque não, não significa que seja seguro. O verificador oferece apenas uma avaliação inicial rápida de que um contrato poder ser metamórfica com base em possíveis indicadores. 

Os usuários da Web3 devem se familiarizar com as ameaças representadas pelos contratos metamórficos para que possam observar e evitar possíveis ataques. Carteiras e indexadores de blockchain podem ajudar avisando os usuários antes que eles interajam com um contrato inteligente que pode conter propriedades metamórficas. Esta ferramenta destina-se a ajudar a educar as pessoas sobre essa ameaça em potencial… e a se defender dela.

Detectando contratos inteligentes metamórficos

A Detector de Contrato Metamórfico Construí análises de seis propriedades que podem indicar se um contrato inteligente é metamórfico.

    1. O código metamórfico conhecido foi usado para implantar o contrato? Se o bytecode metamórfico conhecido – o código legível por máquina virtual de nível inferior em que os contratos inteligentes Ethereum, normalmente escritos em Solidity, se transformam após serem compilados – aparece em uma transação para a implantação de um determinado contrato inteligente, isso é uma grande bandeira vermelha. Nas seções a seguir, discutiremos um exemplo de bytecode metamórfico desenvolvido por 0age. Uma ressalva importante: existem potencialmente inúmeras variações de bytecode metamórfico, o que dificulta a detecção de todas as variedades. Ao escanear instâncias conhecidas, porém, o detector elimina os frutos mais fáceis para os invasores que estão apenas copiando e colando exemplos existentes.
    2. O código de contrato inteligente pode se autodestruir? Para substituir o código em um contrato – uma etapa fundamental na criação de um contrato metamórfico – um desenvolvedor primeiro precisa excluir o código pré-existente. A única maneira de fazer isso é usando o Código de operação AUTOESTRUTURA, um comando que faz exatamente o que parece – apaga todo o código e armazenamento em um determinado endereço de contrato. A presença de código autodestrutivo em um contrato não prova que ele seja metamórfico; no entanto, oferece uma pista de que o contrato poder ser metamórfico e vale a pena saber, de qualquer forma, se os contratos nos quais você está confiando podem se destruir.
    3. O contrato inteligente chama código de outro lugar? Se o contrato inteligente em questão não puder se autodestruir diretamente, ele ainda poderá se apagar usando o Código de operação DELEGATECALL. Este opcode permite que um contrato inteligente carregue e execute dinamicamente o código que reside dentro de outro contrato inteligente. Mesmo que o contrato inteligente não contenha o opcode SELFDESTRUCT, ele pode usar DELEGATECALL para carregar código autodestrutivo de outro lugar. Embora a funcionalidade DELEGATECALL não indique diretamente se um contrato inteligente é metamórfico, é uma pista possível – e um possível problema de segurança – que vale a pena notar. Esteja avisado que este indicador tem o potencial de levantar muitos falsos positivos. 
    4. Outro contrato implantou este contrato? Contratos metamórficos podem ser implantados por outros contratos inteligentes. Isso ocorre porque os contratos metamórficos são habilitados por outro opcode, utilizável apenas por outros contratos inteligentes, chamados CREATE2. (Discutiremos CREATE2 – como funciona e por que é importante – mais em uma seção posterior.) Essa característica é um dos indicadores menos conspícuos de um possível metamorfismo; é uma pré-condição necessária, mas insuficiente. A verificação dessa característica provavelmente gerará muitos falsos positivos – mas é uma informação valiosa, pois pode levantar suspeitas e fornecer um motivo para examinar um contrato ainda mais, especialmente se o contrato inteligente contiver o opcode descrito a seguir.
    5. O contrato do implantador contém o opcode CREATE2? Como mencionado acima, a implantação via CREATE2 é uma pré-condição essencial para o metamorfismo. Se um contrato de implantador contiver o opcode CREATE2, isso pode indicar que ele usou CREATE2 para implantar o contrato em questão. Se o implantador realmente usou CREATE2 para implantar o referido contrato, embora isso não signifique que o contrato seja necessariamente metamórfico, significa que ele poder ser metamórfico e pode ser sábio proceder com cautela e investigar mais. Mais uma vez, cuidado com falsos positivos: CRIAR2 tem bastante de usos legítimos, incluindo o reforço Soluções de dimensionamento “Camada 2” e facilitando a criação de carteiras de contratos inteligentes que podem melhorar a web3 integração do usuário e opções de recuperação de chave.
    6. O código mudou? Essa é a dica mais óbvia, mas só aparecerá depois que um contrato metamórfico já tiver se transformado. Se o hash de código do contrato inteligente – um identificador criptográfico exclusivo – for diferente de quando o contrato foi implantado inicialmente, é provável que o código tenha sido removido, substituído ou alterado. Se os hashes não corresponderem mais, algo no código mudou e o contrato pode ser metamórfico. Esse sinalizador é o indicador mais seguro de metamorfismo, mas não ajudará a prever ou antecipar a transformação, pois apenas verifica se isso já aconteceu.

Além de criar uma ferramenta de linha de comando simples para o Metamorphic Contract Detector, criei alguns exemplos de contratos inteligentes que demonstram um cenário de staking de contrato metamórfico de fraude, que descrevo na próxima seção. Todo o código está disponível neste Repositório GitHub

Como um ator malicioso pode usar contratos metamórficos para roubar fundos das pessoas

Aqui está como alguém pode usar um contrato inteligente metamórfico como parte de um golpe. 

A primeira é a fase de configuração. O invasor implanta um contrato inteligente em um endereço específico no blockchain usando duas ferramentas: bytecode metamórfico e o opcode CREATE2. (Vamos expandir esses dois conceitos mais tarde.) O bytecode metamórfico então faz o que seu nome sugere e “transforma”. Aqui, transforma-se em contrato de aposta onde os usuários podem apostar tokens ERC-20. (Mais uma vez, discutiremos os detalhes desse truque de transformação mais tarde. Prometo!)

Em seguida vem a isca e o switch. Usuários desavisados ​​apostam seus tokens neste contrato, atraídos pela possibilidade de ganhar um rendimento ou algum outro benefício. O invasor exclui todo o código de staking e “estado” – armazenamento ou memória blockchain – neste endereço de contrato inteligente usando o Código de operação AUTOESTRUTURA discutido na seção anterior. (Deve-se notar que os tokens – que existem como parte de um contrato ERC-20 separado – persistem, não afetados pelo contrato autodestruído.)

Por fim, o puxão de tapete. O invasor reutiliza o mesmo bytecode metamórfico usado na fase de configuração para “reimplantar” um novo contrato. Este novo contrato é implantado no mesmo endereço recentemente desocupado pelo contrato de autodestruição. Desta vez, no entanto, o bytecode “se transforma” (novamente, explicaremos como mais tarde) em um contrato malicioso que pode roubar todos os tokens apostados no endereço do contrato. Golpe completo. 

Os riscos que os contratos inteligentes metamórficos representam agora são claramente aparentes. Mas você ainda pode estar se perguntando, como esse truque de metamorfismo realmente funciona? Para entender isso, você precisa investigar mais profundamente, no nível do bytecode. 

Como CREATE2 abre a possibilidade de metamorfismo 

CRIAR2 é uma atualização de opcode, apresentado ao Ethereum em fevereiro de 2019, que oferece uma nova maneira de implantar contratos inteligentes. 

O CREATE2 oferece aos desenvolvedores mais controle sobre a implantação de seus contratos inteligentes do que eles tinham anteriormente. O opcode CREATE original torna difícil para os desenvolvedores controlar o endereço de destino para um contrato inteligente a ser implantado. Com o CREATE2, as pessoas podem controlar e saber o endereço de um contrato inteligente específico com antecedência, antes de realmente implantá-lo no blockchain. Essa presciência – além de alguns truques inteligentes – é o que permite que as pessoas criem contratos inteligentes metamórficos. 

Como o CREATE2 pode prever o futuro? O cálculo do opcode é determinístico: enquanto as entradas não mudarem, o endereço determinado por CREATE2 não mudará. (Mesmo a menor mudança fará com que a implantação aconteça em outro lugar.)

Mais granularmente, CREATE2 é uma função que combina e faz um hash de alguns elementos. Primeiro, ele incorpora o endereço do implantador (ou remetente): o contrato inteligente inicial que atua como pai daquele a ser criado. Em seguida, ele adiciona um número arbitrário fornecido pelo remetente (ou “salt”), que permite ao desenvolvedor implantar o mesmo código em endereços diferentes (alterando o sal) e impede a substituição de contratos idênticos existentes. Por fim, ele usa o hash keccak256 de algum bytecode de inicialização de contrato inteligente (“init”), que é a semente que se transforma em um novo contrato inteligente. Essa combinação de hash determina um endereço Ethereum e, em seguida, implanta o bytecode fornecido para esse endereço. Enquanto o bytecode permanece exatamente o mesmo, CREATE2 sempre implantará o bytecode fornecido para o mesmo endereço no blockchain.

Aqui está a aparência da fórmula CREATE2. (Nota: você notará outro elemento, um “0xFF”, no exemplo abaixo. Esta é apenas uma constante que CREATE2 usa para evitar colisões com o opcode CREATE anterior.)

Agora que temos uma maneira de implantar código em um endereço determinístico, como é possível alterar o código nesse mesmo endereço? A princípio, isso pode parecer impossível. Se você deseja implantar um novo código usando CREATE2, o bytecode deve ser alterado e, portanto, CREATE2 será implantado em um endereço diferente. Mas e se um desenvolvedor construísse o bytecode de tal forma que pudesse “transformar-se” em um código diferente quando o CREATE2 implantar um contrato inteligente?

Como um contrato metamórfico realmente funciona

A receita para transformar um contrato inteligente em um contrato metamórfico exige três contratos inteligentes no total, cada um desempenhando um papel único.

Um desses componentes necessários é a Fábrica de Contratos Metamórficos, o cérebro da operação. Essa “Fábrica” é responsável por implantar o Contrato Metamórfico, bem como outro contrato inteligente chamado Contrato de Implementação, assim chamado porque seu código acaba sendo implementado dentro do Contrato Metamórfico. Uma coreografia sutil entre esses três contratos resulta em metamorfismo, conforme ilustrado no diagrama abaixo.

Uma ferramenta para detectar contratos inteligentes metamórficos PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Vamos discutir cada passo, 1-7, em detalhes para iluminar as operações no trabalho.

Etapa 1: um desenvolvedor coloca tudo em movimento

Um codificador projeta algum código de contrato inteligente – o bytecode do Contrato de Implementação – que acabará no Contrato Metamórfico. O desenvolvedor envia esse código para a Metamorphic Contract Factory, um contrato inteligente cujo principal objetivo é implantar outros contratos inteligentes. Esta ação coloca em movimento todo o processo de criação do Contrato Metamórfico.

Tudo o que se segue é resultado desse passo inicial. De fato, As etapas de 1 a 6 acontecem em uma transação atômica no blockchain, ou seja, quase todas de uma vez. Essas etapas podem ser repetidas várias vezes, ad infinitum, para substituir o código dentro do Contrato Metamórfico e mantê-lo continuamente em transformação.

Etapa 2: a fábrica implanta o contrato de implementação

O primeiro contrato que a Fábrica implanta é o Contrato de Implementação, que contém o código de implementação. (Criativo, nós sabemos.) Pense no Contrato de Implementação como uma doca de carregamento, ou waypoint, que contém algum código antes de ser enviado ao seu destino final, que será, neste caso, dentro do Contrato Metamórfico. 

Etapa 3: endereço do contrato de implementação das lojas de fábrica

Após sua implantação no blockchain, o Contrato de Implementação necessariamente existirá em algum endereço do blockchain. A Fábrica armazena este endereço de contrato em sua própria memória (para ser usado posteriormente, no Passo 5). 

Etapa 4: a fábrica implanta o contrato metamórfico

A Fábrica implanta o Contrato Metamórfico usando CREATE2 e bytecode metamórfico. Você pode encontrar um passo a passo técnico e detalhado de como funciona o bytecode metamórfico SUA PARTICIPAÇÃO FAZ A DIFERENÇA, mas basta dizer que quando o bytecode metamórfico é executado, ele copia o código de algum outro local na cadeia – neste caso, do Contrato de Implementação – para o Contrato Metamórfico. Como falamos na última seção, como CREATE2 é determinístico – contanto que o mesmo remetente, salt e bytecode sejam usados ​​– o endereço do Contrato Metamórfico permanece o mesmo, não importa quantas vezes essas etapas sejam repetidas.

Abaixo está um exemplo de como o bytecode metamórfico se parece, a partir do repositório metamórfico por 0idade. Este é apenas um exemplo de bytecode metamórfico – existem inúmeras variações potencialmente, complicando muito a detecção de contratos metamórficos.

Uma ferramenta para detectar contratos inteligentes metamórficos PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Etapa 5: o bytecode metamórfico consulta a fábrica para o endereço do contrato de implementação

O bytecode metamórfico solicita à Fábrica o endereço do Contrato de Implementação (conforme armazenado na Etapa 3). Não importa se o endereço do Contrato de Implementação muda, desde que o bytecode metamórfico que pede o endereço permaneça o mesmo. De fato, se o desenvolvedor posteriormente implantar um novo Contrato de Implementação – como um mal-intencionado projetado para roubar tokens – ele será necessariamente implantado em um endereço blockchain diferente, conforme a Etapa 2. Isso não tem impacto na criação do Contrato Metamórfico.

- O código do contrato de implementação é copiado para o contrato metamórfico

Usando o endereço blockchain aprendido na Etapa 5, o bytecode metamórfico localiza o código no Contrato de Implementação e copia esse código no armazenamento local do Contrato Metamórfico. É assim que o Contrato Metamórfico muda de forma: copiando o código do Contrato de Implementação. 

Passo 7: Enxágue e repita

Um desenvolvedor pode repetir as Etapas 1 a 6 várias vezes e substituir o código no Contrato Metamórfico pelo que quiser por meio de um novo Contrato de Implementação. Tudo o que é necessário é usar o opcode SELFDESTRUCT – ou, mais desonesto, os opcodes DELEGATECALL que acabam resultando em um SELFDESTRUCT – para remover o código pré-existente no Contrato Metamórfico. Ao repetir o ciclo com o novo bytecode do Contrato de Implementação, o Contrato Metamórfico irá, como mágica, metamorfosear!

Usando esta técnica para criar contratos metamórficos, um desenvolvedor inteligente pode constantemente mudar o terreno sob os pés dos usuários da web3. Considere, por exemplo, o cenário de fraude novamente. Um desenvolvedor pode primeiro implantar o Contrato de Implementação com código de tokenstaking que, por meio do caminho tortuoso descrito no gráfico e elaborado nas etapas acima, termina no Contrato Metamórfico. O golpista poderia autodestruir esse código posteriormente e substituí-lo implantando um novo Contrato de Implementação contendo token-roubando código. 

O que quer que seja implantado no Contrato de Implementação acabará no Contrato Metamórfico. Essa é a essência do truque. 

***

Os contratos inteligentes metamórficos quebram o contrato social implícito da web3 de que o que você vê é o que você obtém. Da mesma forma que o jogo de conchas usa três copos móveis para esconder uma bola, a interação dos três contratos na criação de um contrato metamórfico torna difícil seguir a verdadeira função do contrato. O jogo de conchas é uma comparação particularmente adequada porque os trapaceiros de confiança geralmente usam prestidigitação e desorientação para garantir que ganhem. Na versão web3, os redatores de contratos metamórficos podem similarmente fazer a “bola” – o código de implementação, ou seja – desaparecer (leia-se: autodestruir), e podem substituí-la com o que quiserem.

A existência de contratos metamórficos significa que é possível para os usuários da web3 firmarem contratos que podem mudar à vontade – é por isso que essa ameaça é tão importante para entender e se defender. Meu detector de contrato metamórfico oferece apenas um primeiro passo para a identificação de contratos metamórficos pela prestidigitação que empregam. Existem várias maneiras de melhorar o detector no futuro. Por exemplo, verificando recursivamente a Fábrica (ou contrato de implantação) que criou o Contrato Metamórfico, pode-se ver se a Fábrica é metamórfica. Esse recurso seria uma adição útil a uma versão 2 atualizada do Detector.

Vale reiterar mais uma vez: Esta ferramenta Detector não é infalível. As bandeiras que ele pega não são todos sinais reveladores de potencial metamórfico, mas oferecem pistas. Identificar esses sinalizadores é apenas o começo para uma investigação mais completa. É por isso que expandimos o Detector para procurar sinalizadores que poderiam facilmente gerar falsos positivos, como a presença de opcodes CREATE2 ou DELEGATECALL. Se você tiver sugestões para melhorar a ferramenta ou quiser construir ou adicionar a este trabalho inicial, entre em contato comigo em .

Analise contratos inteligentes para traços metamórficos usando a ferramenta Detector e visitar o GitHub repo para mais

Editor: Robert Hackett @rhhackett

***

Agradecimentos: Quero dar um ENORME agradecimento e agradecer a Robert Hackett, Eddy Lazzarin, Sam Ragsdale, Riyaz Faizullabhoy, Noah Citron, Mason Hall e Daejun Park pelos valiosos comentários e conselhos para dar vida a este post e ferramenta. 

***

As opiniões expressas aqui são as do pessoal individual da AH Capital Management, LLC (“a16z”) citadas e não são as opiniões da a16z ou de suas afiliadas. Certas informações aqui contidas foram obtidas de fontes de terceiros, inclusive de empresas do portfólio de fundos administrados pela a16z. Embora retiradas de fontes consideradas confiáveis, a16z não verificou essas informações de forma independente e não faz representações sobre a precisão duradoura das informações ou sua adequação a uma determinada situação. Além disso, esse conteúdo pode incluir anúncios de terceiros; a16z não revisou tais anúncios e não endossa nenhum conteúdo de publicidade neles contido.

Este conteúdo é fornecido apenas para fins informativos e não deve ser considerado como aconselhamento jurídico, comercial, de investimento ou fiscal. Você deve consultar seus próprios conselheiros sobre esses assuntos. As referências a quaisquer valores mobiliários ou ativos digitais são apenas para fins ilustrativos e não constituem uma recomendação de investimento ou oferta para fornecer serviços de consultoria de investimento. Além disso, este conteúdo não é direcionado nem destinado ao uso por quaisquer investidores ou potenciais investidores, e não pode, em nenhuma circunstância, ser invocado ao tomar uma decisão de investir em qualquer fundo administrado pela a16z. (Uma oferta para investir em um fundo a16z será feita apenas pelo memorando de colocação privada, contrato de subscrição e outra documentação relevante de tal fundo e deve ser lida na íntegra.) Quaisquer investimentos ou empresas de portfólio mencionados, referidos ou descritos não são representativos de todos os investimentos em veículos administrados pela a16z, e não pode haver garantia de que os investimentos serão rentáveis ​​ou que outros investimentos realizados no futuro terão características ou resultados semelhantes. Uma lista de investimentos feitos por fundos administrados por Andreessen Horowitz (excluindo investimentos para os quais o emissor não deu permissão para a a16z divulgar publicamente, bem como investimentos não anunciados em ativos digitais negociados publicamente) está disponível em https://a16z.com/investments /.

Os gráficos e gráficos fornecidos são apenas para fins informativos e não devem ser considerados ao tomar qualquer decisão de investimento. O desempenho passado não é indicativo de resultados futuros. O conteúdo fala apenas a partir da data indicada. Quaisquer projeções, estimativas, previsões, metas, perspectivas e/ou opiniões expressas nestes materiais estão sujeitas a alterações sem aviso prévio e podem diferir ou ser contrárias às opiniões expressas por outros. Consulte https://a16z.com/disclosures para obter informações adicionais importantes.

Carimbo de hora:

Mais de Andreessen Horowitz