Teste e verificação formal para Web3 Smart Contract Security

Teste e verificação formal para Web3 Smart Contract Security

Teste e verificação formal para Web3 Smart Contract Security PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

Tempo de leitura: 9 minutos

Imagine fazer paraquedismo. Antes de pular do avião, você vai checar seu paraquedas cem vezes, certo? A verificação e o teste são parte integrante da segurança; pense em qualquer coisa relacionada à segurança. Provavelmente haveria um mecanismo de teste depois, seja a instalação do CCTV ou a verificação da tinta na caneta antes de um exame escrito na escola, todos nós seguimos as medidas de segurança. Quanto maior o risco envolvido, mais testamos as coisas. E quando falamos de contratos inteligentes, o risco é ENORME. Você não pode ser descuidado quando se trata de segurança de contrato inteligente.

1. A segurança é sempre necessária.

Você com certeza pode trancar a porta duas ou três vezes, não importa. Você pode ter certeza de que sua casa não será roubada enquanto você estiver fora? Você não pode porque não sabe o que o ladrão pode fazer para invadir a casa - o mesmo vale para todas as medidas de segurança que tomamos. Não existe um método completamente seguro que garanta a segurança. Ainda assim, a ação que tomamos rapidamente aumenta nossas chances de estarmos seguros, que é o jogo. Queremos aumentar as chances de estarmos seguros empregando diferentes medidas.

O mundo da Web3 não é diferente. Não existe um método seguro para se salvar, mas ter auditores experientes da QuillAudits pode aumentar tremendamente as chances de seu protocolo ser protegido e garantirá sua segurança atualizada. No web3, existem dois mecanismos importantes que ajudam você a entender o quão seguro você está fazendo alguns testes em seu protocolo:-

  1. Teste de contrato inteligente
  2. Verificação formal de contratos inteligentes

Vamos entendê-los em detalhes e aprender como eles nos ajudam a conhecer os pontos fracos ou vulnerabilidades de nossos contratos.

2. Teste de contrato inteligente

Um desenvolvedor experiente pode explicar o trabalho para uma máquina com código. Ainda assim, às vezes a máquina não representa o mecanismo exato que o desenvolvedor tinha em mente devido a uma falha ou erro lógico no código. O teste é o processo que ajuda a identificar onde nosso código está falhando e o que pode ser feito para que ele corresponda à ação que precisamos que ele execute.

Teste de contrato inteligente é uma fase do ciclo de desenvolvimento em que realizamos uma análise detalhada de nossos contratos e tentamos descobrir onde e por que nosso código está falhando. Quase todos os contratos inteligentes passam por essa fase. Existem duas maneiras de fazer o teste de contrato inteligente. Vamos explorá-los.

2.1 Automatizado

Como o nome sugere, esse método de teste de contratos inteligentes é usado para realizar testes com script. Envolve software automatizado que executa testes repetidos para encontrar vulnerabilidades e defeitos em contratos inteligentes. Essas ferramentas de teste automatizadas podem ser configuradas com dados de teste e resultados esperados. Em seguida, o resultado real é comparado com o esperado para verificar se o contrato está funcionando corretamente. Os testes automatizados podem ser classificados em três categorias.

2.1.1. Teste Funcional

Suponha que você escreva um programa para pegar dois números, a e b, e depois retornar a adição de ambos os números. Portanto, para verificar esse programa, você fornece 2 e 8 e alimenta o resultado esperado como 10. Agora, quando o programa for executado, ele também deve retornar 10. Se retornar, funcionará bem e nosso código está correto, mas se não, então há algum erro com nosso código. 

O teste funcional requer a compreensão de como seu contrato deve se comportar em determinadas condições. Podemos testá-lo executando uma computação com valores selecionados e comparando a saída retornada. O Teste Funcional tem três classes:-

  1. Teste unitário:- Isso lida com o teste de componentes individuais do contrato inteligente para correção. É assertivo ou requer declarações sobre variáveis.
  1. Moderna textosnão: – Trata-se de testar vários componentes individuais juntos. O teste de integração é um nível mais alto na hierarquia do que o teste de unidade. Isso nos ajuda a determinar erros decorrentes da interação de diferentes funções, que podem fazer parte de outros contratos inteligentes.
  1. System Textosnão: – Este é o mais alto na hierarquia. Neste, testamos todo o contrato como um sistema totalmente integrado para ver se ele funciona de acordo com nossas necessidades. Isso é feito do ponto de vista do usuário e a melhor maneira de fazer isso é implantá-lo em testnets.

2.1.2. Análise Estática

A análise estática pode ser feita mesmo sem executar o programa. Envolve a análise do código-fonte ou bytecode do contrato inteligente antes da execução. Dando assim seu nome, a análise estática pode resultar na detecção de algumas vulnerabilidades comuns.

2.1.3. Análise Dinâmica

Ao contrário da análise estática, a análise dinâmica é realizada durante o tempo de execução dos contratos inteligentes para identificar problemas no código. Os analisadores de código dinâmico observam o estado de execução do contrato e geram um relatório detalhado de vulnerabilidades e violações de propriedade. Fuzzing vem sob análise DINÂMICA. Fuzzing está alimentando entrada incorreta ou maliciosa para causar execução de código não intencional.

Manual 2.2

Como o nome sugere, esse método de teste de contrato inteligente envolve interação regular com um desenvolvedor humano. As auditorias de código, nas quais os desenvolvedores passam por linhas de códigos, estão no modo Manual de teste de contrato inteligente.

O modo manual requer tempo, habilidade, dinheiro e esforço consideráveis. Ainda assim, muitas vezes o resultado vale a pena porque, com isso, identificamos vulnerabilidades que podem passar despercebidas nos testes automáticos. Existem dois tipos essenciais de testes manuais: -

2.2.1 Auditorias de Código:- 

A melhor maneira de testar se sua medida de segurança funciona corretamente é tentar quebrá-la. Por exemplo, se você quiser verificar se a trava do seu carro está funcionando corretamente, tente quebrá-la. Agora você pode perguntar que um ladrão de carros habilidoso pode facilmente arrombar meu carro. Talvez não, então a solução é contratar alguém especialista em invasão para que ele possa orientá-lo!

 Sim, estou falando sobre QuillAudits. Somos uma equipe de auditores qualificados que podem orientá-lo. As auditorias de código exigem uma mentalidade de invasor para encontrar todas as vulnerabilidades possíveis no código-fonte. Uma auditoria de código é uma avaliação detalhada do código de um contrato inteligente para descobrir possíveis vulnerabilidades e falhas.

2.2.2 Recompensa de Bug:-

Se você acha que pode haver algumas falhas de segurança em seu código-fonte (que na maioria são) e não consegue encontrá-las, pode terceirizar esse trabalho para freelancers criando um sistema de recompensa. É mais como anunciar uma recompensa para quem conseguir hackear seu contrato inteligente. Ao fazer isso, você aprende sobre a vulnerabilidade presente em seu contrato inteligente para que possa protegê-lo melhor e salvar seus usuários de perdas.

3. Verificação formal de contratos inteligentes

A verificação formal é o processo de avaliação da exatidão de um contrato com base em especificações formais. Isso significa que a verificação formal avalia se o código faz o que se pretende. A verificação formal usa métodos formais para especificar, projetar e verificar programas.

3.1 Qual é a especificação formal?

No contexto dos contratos inteligentes, as especificações formais referem-se às propriedades que devem permanecer as mesmas em todas as circunstâncias possíveis. Estas são propriedades “invariantes” porque não podem mudar e representam asserções lógicas sobre a execução do contrato.

Especificação formal é uma coleção de declarações escritas em linguagem formal. As especificações cobrem diferentes propriedades e descrevem como as propriedades do contrato devem se comportar em outras circunstâncias. As especificações formais são críticas porque se os contratos não tiverem variáveis ​​invariáveis ​​ou alterações de propriedades durante a execução, isso pode levar a uma possível exploração da propriedade, o que pode levar a uma perda enorme.

Isso pode nos ajudar a determinar se um contrato inteligente atende às especificações ou tem comportamentos inesperados. A verificação formal tem três componentes: uma especificação, um modelo e um mecanismo de verificação.

3.1.1 Especificação

Uma especificação é uma descrição clara, inequívoca e completa dos requisitos para um contrato inteligente. Deve descrever o que o contrato deve fazer e o que não deve fazer. Aqui está um exemplo de especificação para um contrato simples e inteligente que adiciona dois números:

// Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
// Implementation details are not relevant to the specification
// …
}

Modelo 3.1.2

Um modelo representa formalmente o contrato inteligente que pode ser usado para raciocinar sobre seu comportamento. Um modelo popular para contratos inteligentes é a linguagem de programação Solidity. Aqui está um modelo de exemplo para a função add descrita acima:

// Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
return a + b;
}

3.1.3 Mecanismo de Verificação

Um mecanismo de verificação é uma ferramenta que pode analisar um modelo e verificar sua correção em relação a uma determinada especificação. Existem vários mecanismos de verificação disponíveis para contratos inteligentes, incluindo:

Mithril: uma ferramenta de execução simbólica de código aberto que pode detectar uma ampla gama de vulnerabilidades de segurança em contratos inteligentes do Solidity.

IDE de remixagem: um ambiente de desenvolvimento integrado que inclui uma ferramenta de verificação formal que pode verificar a exatidão dos contratos inteligentes.

Certora Provedor: uma ferramenta comercial que pode verificar a exatidão de contratos inteligentes usando raciocínio matemático automatizado. Aqui está um exemplo de como a verificação formal pode ser usada para verificar a exatidão de um contrato inteligente usando o Certora Prover:

pragma solidity 0.7.6; // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint)
function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function test_add(uint a, uint b) public pure returns (bool) {
uint expected = a + b;
uint actual = add(a, b);
return expected == actual;
} // Verification: Verify the correctness of the add function contract TestAdd {
function test_add(uint a, uint b) public view returns (bool) {
return CertoraProver.verify(test_add, a, b);
}
}

No exemplo acima, definimos um contrato inteligente Solidity que inclui um modelo da função add, uma especificação para a função e um mecanismo de verificação (Certora Prover) que pode verificar a correção da função. Também definimos uma função de teste (test_add) que pode ser usada para verificar a correção da função.

3.2 Teste VS Verificação Formal

Conforme discutimos, o teste retorna o resultado esperado para algum bot de dados de entrada que ele não possui, porque não podemos dizer sobre os dados nos quais ele não foi testado. É praticamente impossível verificá-lo em todas as entradas possíveis. Assim, não temos certeza sobre sua “correção funcional”. É aí que entra a verificação formal. Os métodos de verificação formal usam técnicas matemáticas rigorosas para especificar e verificar software ou contratos inteligentes.

3.3 Técnicas de verificação formal

A verificação formal tem um amplo escopo de técnicas para aprimorar segurança de contrato inteligente. Nesta parte do blog, vamos explorar alguns individualmente.

3.3.1 Verificação do modelo

Conforme discutimos o que é uma especificação formal, verificamos o contrato inteligente em relação à sua especificação nesta técnica de verificação formal. Esses contratos inteligentes são representados como sistemas de transição de estado e as propriedades são definidas usando a lógica temporal. 

Essa técnica é usada principalmente para avaliar propriedades temporais que retratam o comportamento de contratos inteligentes ao longo do tempo. Propriedade de controle de acesso (chamada de administrador Auto-destruição) pode ser escrita como lógica formal. Em seguida, o algoritmo de verificação de modelo pode verificar se o contrato satisfaz essa verificação formal.

A verificação de modelo usa uma técnica chamada exploração de espaço de estado, que basicamente tenta todos os estados possíveis em que nosso contrato inteligente pode estar e, em seguida, verifica se algum deles resulta em violação de propriedade. No entanto, isso pode levar a infinitos estados; portanto, os verificadores de modelos dependem de técnicas de abstração para possibilitar uma análise eficiente de contratos inteligentes.

3.3.2 Prova do Teorema

A prova de teoremas é sobre o raciocínio matemático sobre a exatidão dos programas. Trata-se de criar uma impressão lógica do sistema e especificação do contrato e verificar a “equivalência lógica” entre as declarações. A equivalência lógica é uma relação matemática que diz que a afirmação A é verdadeira se e somente se a afirmação B é verdadeira.

Conforme aprendemos na técnica de verificação de modelo, modelamos contratos como sistemas de transição com estados finitos. A prova de teoremas pode lidar com a análise de sistemas de estado infinito. No entanto, um provador de teorema automatizado nem sempre pode saber se um problema lógico é decidível; assim, a assistência humana é muitas vezes necessária para guiar o provador de teoremas na derivação de provas de correção.

4. Conclusão

O teste e a verificação formal são partes integrantes do desenvolvimento de contratos inteligentes. Esses são os métodos usados ​​para tornar os contratos inteligentes seguros e ajudar a preparar os contratos para implantação. Mas, como você sabe, segurança nunca é suficiente. Muitos contratos inteligentes foram hackeados apenas porque não havia testes adequados. Agora, mais do que nunca, a comunidade web3 precisa de protocolos mais seguros. 

Nós da QuillAudits temos a missão de ajudar a proteger seus protocolos. Com nossa equipe habilidosa e experiente, garantimos que nem uma única vulnerabilidade passe despercebida. Visite nosso site e garanta seu projeto Web3!

28 Visualizações

Carimbo de hora:

Mais de Quilhash