revive^cc
revive^CC é uma ferramenta de análise estática para contratos inteligentes de tecido Hyperledger (ChainCode) destinado a detectar vulnerabilidades de segurança relacionadas à blockchain para ajudar os desenvolvedores a escrever contratos inteligentes limpos e seguros. revive^CC é uma das duas ferramentas de análise estática existentes para o Hyperledger Fabric ChainCode, com a outra ferramenta sendo o scanner do ChainCode da Chainssegurança, que pode analisar arquivos do ChainCode que atendem a certos requisitos. O que torna revive^CC especial é que a ferramenta trouxe a acessibilidade da análise de segurança para qualquer arquivo do ChainCode . Isso é algo que não está disponível até agora.
A ferramenta é uma extensão da ferramenta de análise estática de código aberto GO e foi construído usando a estrutura do Revive. Portanto, ele contém todos os benefícios e verificações de reviver para ajudar os desenvolvedores a escrever código Go Clean Go. revive^CC foi construído como parte do meu projeto de dissertação sobre 'analisar contratos inteligentes' na Universidade de Sheffield.
Instalação
1. Place folder in the your $GOPATH/src/github.com/youraccount
2. Go into directory sivachokkapu/revive-cc
3. $ make install
4. $ make build
5. Move the revive file into $GOPATH/bin
6. You should now be able to use revive commands
Uso
$ revive {chaincodefilename.go} - will analyse the file
$ revive -formatter stylish {chaincodefilename.go} - better output format
$ revive - on a directory will analyse all files if from the same package

Usando $ Revive em um diretório
Desempenho

Para avaliar o desempenho do Revive^CC, foram encontrados uma variedade de arquivos de código de lanchonetes reais, cada um que continha vulnerabilidades. Um total de 20 arquivos públicos do ChainCode foram obtidos para a avaliação dos repositórios do GitHub. Todos esses arquivos foram verificados e as seguintes vulnerabilidades foram relatadas. O desempenho foi então comparado com o scanner do ChainCode da Chainssegurança, que só conseguiu verificar 13 dos 20 arquivos. No geral, o Revive^CC foi capaz de detectar mais vulnerabilidades (observe que o Revive^cc é capaz de detectar mais verdadeiros positivos que também detecta um pouco mais falsos positivos).
Vulnerabilidades detectáveis
Importações de código de cadeia na lista negra

Exemplo de vulnerabilidade de importação de código de cadeia na lista negra no ChainCode
A importação de certas bibliotecas pode resultar em falta de consenso entre pares. Isso ocorre porque certas bibliotecas permitirão comunicação com o mundo exterior, conceder acesso ao arquivo e até introduzir comportamentos não determinísticos no ChainCode. Todos podem levar a computação inconsistente entre os pares que levam à falta de consenso. Uma biblioteca na lista negra é a biblioteca 'Time'. Essa biblioteca permite que os colegas obtenham o registro de data e hora atual em um determinado momento, no entanto, é improvável que cada pare com o mesmo registro de data e hora durante uma transação que leva a discrepâncias entre pares. Isso pode resultar em comportamento não determinístico entre colegas, levando a computação inconsistente.
Variáveis de estado globais

Exemplo de vulnerabilidade da variável de estado global no ChainCode
As variáveis globais são apenas globais para um único par, pois as variáveis globais não são rastreadas no livro. Nem os pares executam necessariamente todas as transações e, como o escopo da variável global é limitado a um único par, seus estados podem divergir. Nenhum dado que está sendo lido ou gravado deve depender dessas variáveis globais de estado, pois isso pode levar ao cálculo com diferentes conjuntos de leitura e gravação. Esse cálculo não consistente resultará em falta de consenso entre pares e, portanto, todas as transações serão marcadas como inválidas.
Goroutines

Exemplo de vulnerabilidade Goroutines no ChainCode
Goroutines introduzem simultaneidade no ChainCode. Que pode então trazer comportamento não determinístico. Isso pode levar a computação inconsistente entre pares devido a pares que não compram os mesmos conjuntos de leitura e gravação. Isso resultará na falta de consenso entre os pares da rede, levando a todas as transações marcadas como inválidas. Portanto, é altamente desencorajado usar goroutinas.
Leitura fantasma de Ledger

Exemplo de Phantom Read of Ledger Vulnerabilidade no ChainCode
Obtendo dados do livro usando GethistoryofKey ou getQueryResult não passam o controle de versão do sistema. Isso significa que os dados recuperados usando esses métodos não devem ser usados para gravar novos dados ou atualizar dados no livro. Isso pode levar a um comportamento inesperado que pode afetar a execução de transações e causar resultados não intencionais.
Alcance sobre o mapa

Exemplo de alcance sobre a vulnerabilidade do mapa no ChainCode
A palavra -chave do intervalo permite a capacidade de iterar em todos os elementos em várias estruturas de dados em Go. No entanto, quando o intervalo é aplicado a um mapa, a ordem de iteração será randomizada em Go. Isso significa que o uso do intervalo para iterar através de elementos de um mapa não é determinístico, pois a ordem de iteração pode mudar entre todas as execuções. Portanto, a computação entre pares não será consistente e será impossível para os colegas da rede chegarem ao consenso.
Leia após escrever

Exemplo de leitura após gravação vulnerabilidade no ChainCode
Para uma declaração de gravação no livro para entrar em vigor, a transação primeiro deve ser cometida e gravada no Ledger. Até então, o valor que foi escrito para manter seu valor antigo. O que significa que a leitura desse valor a partir do razão retornará apenas o valor antigo, que provavelmente não é o que se destina pelo ChainCode. Isso levará a um comportamento inesperado que pode afetar a execução de transações e causar resultados não intencionais.
Licença
Mit