权限扫描器允许扫描 DeFi 协议或任何智能合约系统以获取许可功能。它返回智能合约、已识别的许可功能和各自的权限所有者的列表。
为了扫描协议中的许可功能,目标协议是根据链和所有已部署合约的一组地址来指定的。这些合约都必须在公共区块浏览器上进行验证。您可以在此处找到受支持的链和浏览器的列表。然后,权限扫描器从浏览器下载合约的源代码,扫描这些合约的权限,从相应的存储槽读取权限所有者,并将结果写入输出文件。
solc
编译器创建并激活虚拟Python环境,并使用以下命令安装所需的Python包
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
将.env.example
文件复制到.env
,并根据部署合约的网络,填写 RPC 提供商的 url 和有效的区块浏览器 api 密钥。然后加载变量
source .env
使用协议的所有合约的链名称和地址完成文件./contracts.json
。在此处查找受支持的链的列表。
然后执行扫描仪脚本
python src/main.py
请注意,如果您没有正确的solc
编译器版本,脚本将自动安装它。
该脚本会将扫描仪的结果写入新文件./permissions.json
中。
分析完成后,您可以使用以下命令再次停用 Pyhton 环境
source deactivate
支持从中获取和筛选合约的链
"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")
权限扫描器不保证提供的合约地址集是完整的,也不保证合约实际上是协议的一部分。
权限是通过使用onlyOwner
修饰符或合约函数中的msg.sender
检查来识别的。可能存在此方法未捕获的其他形式的权限。
权限扫描器尝试直接从合约存储中读取权限所有者。这可能会失败,特别是如果合约使用可升级性模式,则应手动验证。
权限扫描器仅识别权限及其所有者,但不会评估此类权限的影响或风险。
权限扫描器构建在 Slither 静态分析器的基础上。我们感谢 Trail of Bits 团队创建了这个开源工具,以及他们为 DeFi 领域的安全所做的所有工作。