Revive^CC
revive^CC es una herramienta de análisis estático para Hyperledger Fabric Smart Contracts (ChainCode) destinado a detectar vulnerabilidades de seguridad relacionadas con blockchain para ayudar a los desarrolladores a escribir contratos inteligentes limpios y seguros. revive^CC es una de las dos herramientas de análisis estáticas existentes para el código de cadena de tela Hyperledger, y la otra herramienta es el escáner de código de cadena de chainsecurity que puede analizar archivos de código de cadena que cumplen ciertos requisitos. Lo que hace que revive^CC especial es que la herramienta ha llevado la accesibilidad del análisis de seguridad a cualquier archivo de código de cadena . Esto es algo que no ha estado disponible hasta ahora.
La herramienta es una extensión de la herramienta de análisis estático de código abierto GO Revive y se construyó utilizando el marco de Revive. Por lo tanto, contiene todos los beneficios y cheques de Revive para ayudar a los desarrolladores a escribir el código Clean GO. revive^CC fue construido como parte de mi proyecto de disertación sobre 'Analizar contratos inteligentes' en la Universidad de Sheffield.
Instalación
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

Usar $ Revive en un directorio
Actuación

Para evaluar el rendimiento de Revive^CC, se encontraron una variedad de archivos de código de cadena de casos reales que cada uno contenía vulnerabilidades. Se obtuvieron un total de 20 archivos de cadena pública para la evaluación de los repositorios de GitHub. Todos estos archivos fueron verificados y se informaron las siguientes vulnerabilidades. El rendimiento se comparó luego con el escáner de código de cadena de Chainsecurity, que solo pudo verificar 13 de los 20 archivos. En general, Revive^CC pudo detectar más vulnerabilidades (tenga en cuenta que Revive^cc es capaz de detectar positivos más verdaderos, también detecta un poco más falsos positivos).
Vulnerabilidades detectables
Importaciones de código de cadena con lista negra

Ejemplo de vulnerabilidad de importación de código de cadena en la lista negra en el código de cadena
La importación de ciertas bibliotecas puede dar lugar a una falta de consenso entre pares. Esto se debe a que ciertas bibliotecas permitirán la comunicación con el mundo exterior, otorgar el acceso al archivo e incluso puede introducir un comportamiento no determinista en el código de cadena. Todo esto puede conducir a un cálculo inconsistente entre pares que conducen a una falta de consenso. Una biblioteca con lista negra es la biblioteca 'Time'. Esta biblioteca permite a los compañeros obtener la marca de tiempo actual en un momento dado, sin embargo, es poco probable que cada compañero cree la misma marca de tiempo durante una transacción que conduce a discrepancias entre pares. Esto puede dar lugar a un comportamiento no determinista entre pares, lo que lleva a un cálculo inconsistente.
Variables de estado global

Ejemplo de vulnerabilidad variable de estado global en el código de cadena
Las variables globales son solo globales para un solo par ya que las variables globales no se rastrean en el libro mayor. Ni nunca pares ejecutará necesariamente todas las transacciones y, como el alcance de la variable global se limita a un solo par, sus estados pueden divergir. Ningún datos que se lean o se escriban deben depender de estas variables de estado global, ya que esto puede conducir al cálculo con diferentes conjuntos de lectura y escritura. Este cálculo no consistente dará como resultado una falta de consenso entre los pares y, por lo tanto, todas las transacciones se marcarán como inválidas.
Goroutinas

Ejemplo de vulnerabilidad de las Goroutinas en el código de cadena
Las goroutinas introducen la concurrencia en el código de cadena. Que luego puede provocar un comportamiento no determinista. Esto puede conducir a un cálculo inconsistente entre pares debido a que los pares no calculan los mismos conjuntos de lectura y escritura. Esto dará como resultado una falta de consenso entre los pares en la red que conducen a que todas las transacciones se marquen como inválidas. Por lo tanto, está muy desanimado a usar goroutinas.
Phantom Leer de Ledger

Ejemplo de leído fantasma de la vulnerabilidad del libro mayor en el código de cadena
Obtener datos del libro mayor utilizando GethistoryOfKey o GetQueryResult no pasa el control de versiones del sistema. Esto significa que los datos recuperados utilizando estos métodos no deben usarse para escribir datos nuevos o actualizar datos en el libro mayor. Esto podría conducir a un comportamiento inesperado que puede afectar la ejecución de transacciones y causar resultados no deseados.
Rango sobre mapa

Ejemplo de rango sobre la vulnerabilidad del mapa en el código de cadena
La palabra clave de rango permite la capacidad de iterar a través de cada elemento en varias estructuras de datos en GO. Sin embargo, cuando el rango se aplica a un mapa, la orden de iteración se aleatorizará en GO. Esto significa que usar el rango para iterar a través de elementos de un mapa no es determinista, ya que el orden de iteración puede cambiar entre cada ejecución. Por lo tanto, el cálculo entre pares no será consistente y será imposible que los pares de la red alcancen el consenso.
Leer después de escribir

Ejemplo de lectura después de la vulnerabilidad de escritura en el código de cadena
Para una declaración de escritura a Ledger para entrar en vigencia, la transacción primero debe comprometerse y escribir en el libro mayor. Hasta entonces, el valor que se ha escrito conservará su valor antiguo. Lo que significa que leer este valor del libro mayor solo devolverá el valor antiguo que probablemente no sea lo que pretende el código de cadena. Esto conducirá a un comportamiento inesperado que puede afectar la ejecución de transacciones y causar resultados no deseados.
Licencia
MIT