O scanner de permissão permite a varredura de um protocolo DeFi, ou qualquer sistema de contrato inteligente, em busca de funções permitidas. Ele retorna uma lista dos contratos inteligentes, as funções autorizadas identificadas e os respectivos proprietários das permissões.
Para verificar se há funções permitidas em um protocolo, o protocolo de destino é especificado em termos da cadeia e de um conjunto de endereços de todos os contratos implantados. Todos esses contratos devem ser verificados em um explorador de bloco público. Você pode encontrar uma lista de redes e exploradores suportados aqui. O scanner de permissão então baixa o código-fonte dos contratos do explorador, verifica se há permissões, lê o proprietário da permissão no respectivo slot de armazenamento e grava os resultados em um arquivo de saída.
solc
Crie e ative um ambiente Python virtual e instale os pacotes Python necessários com
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
Copie o arquivo .env.example
para .env
e, dependendo da rede onde os contratos estão implantados, preencha o URL do seu provedor RPC e uma chave de API válida do explorador de blocos. Em seguida, carregue as variáveis com
source .env
Preencha o arquivo ./contracts.json
com o nome da cadeia e endereços de todos os contratos do protocolo. Encontre uma lista de cadeias suportadas aqui.
Em seguida, execute o script do scanner com
python src/main.py
Observe que se você não tiver a versão correta do compilador solc
, ele será instalado automaticamente pelo script.
O script gravará os resultados do scanner em um novo arquivo ./permissions.json
.
Depois de concluir sua análise, você pode desativar o ambiente Pyhton novamente com o seguinte comando
source deactivate
Cadeias suportadas para buscar e selecionar contratos de
"mainnet:" : (".etherscan.io", "etherscan.io")
"optim:" : ("-optimistic.etherscan.io", "optimistic.etherscan.io")
"goerli:" : ("-goerli.etherscan.io", "goerli.etherscan.io")
"sepolia:" : ("-sepolia.etherscan.io", "sepolia.etherscan.io")
"tobalaba:" : ("-tobalaba.etherscan.io", "tobalaba.etherscan.io")
"bsc:" : (".bscscan.com", "bscscan.com")
"testnet.bsc:" : ("-testnet.bscscan.com", "testnet.bscscan.com")
"arbi:" : (".arbiscan.io", "arbiscan.io")
"testnet.arbi:" : ("-testnet.arbiscan.io", "testnet.arbiscan.io")
"poly:" : (".polygonscan.com", "polygonscan.com")
"mumbai:" : ("-testnet.polygonscan.com", "testnet.polygonscan.com")
"avax:" : (".snowtrace.io", "snowtrace.io")
"testnet.avax:" : ("-testnet.snowtrace.io", "testnet.snowtrace.io")
"ftm:" : (".ftmscan.com", "ftmscan.com")
"goerli.base:" : ("-goerli.basescan.org", "goerli.basescan.org")
"base:" : (".basescan.org", "basescan.org")
"gno:" : (".gnosisscan.io", "gnosisscan.io")
"polyzk:" : ("-zkevm.polygonscan.com", "zkevm.polygonscan.com")
"blast:" : (".blastscan.io", "blastscan.io")
O scanner de permissão NÃO garante que o conjunto fornecido de endereços de contrato esteja completo ou que os contratos de fato façam parte do protocolo.
As permissões são identificadas pelo uso de modificadores onlyOwner
ou verificações msg.sender
em uma função de contrato. Podem existir outras formas de permissões que não são capturadas com esta abordagem.
O scanner de permissão tenta ler diretamente os proprietários de permissão do armazenamento do contrato. Isso pode falhar, principalmente se um contrato usar um padrão de capacidade de atualização e precisar ser verificado manualmente.
O verificador de permissões identifica apenas as permissões e seus proprietários, mas não avalia o impacto ou os riscos de tais permissões.
O scanner de permissão é construído no analisador estático Slither. Agradecemos à equipe do Trail of Bits por criar esta ferramenta de código aberto e por todo o trabalho que realizaram pela segurança no setor DeFi.