使用Slither智能合约存储分析工具揭秘区块链安全
您认为自己在Solidity智能合约中发现了一个关键漏洞,如果被利用,可能会耗尽广泛使用的加密货币交易所的资金。为了确认这确实是一个漏洞,您需要找出一个没有getter方法的模糊存储槽中的值。肾上腺素在您体内奔流,但当您看到Solidity存储文档时, devastation的痛苦随之而来:
您的动力在尝试解释这些象形文字时崩溃,知道每一秒的浪费都可能是灾难性的。幸运的是,slither-read-storage,一个从源代码检索存储槽的工具,可以将您从这个噩梦中拯救出来。
什么是slither-read-storage?
slither-read-storage通过使用Slither底层类型分析的信息(例如,数组是固定还是动态)来通知槽计算,从源代码检索存储槽。
该工具可以检索单个变量或整个合约的存储槽,并且可以通过提供以太坊RPC来检索存储值。
slither-read-storage包含在Slither的最新版本0.8.3中,可以使用Python的包管理器pip安装:
|
|
slither-read-storage的用例
让我们探索一些该工具的用例。
月光审计
要确定所有可以铸造FRAX的地址,我们必须手动在Etherscan上逐个输入frax_pools_array的索引。由于frax_pools_array是动态的,了解数组的当前长度会很有帮助,但这并不容易获得。以这种方式查找这些地址将非常耗时,我们可能会浪费时间输入越界的索引。
在Etherscan上查询frax_pools_array
相反,我们可以在FRAXStablecoin合约的地址上运行slither-read-storage来找到frax_pools_array的长度:
|
|
太好了!动态数组的长度存储在合约的一个槽中——在这种情况下,是槽18。检查FRAXStablecoin的槽18的值,我们可以看到数组的长度是25。
|
|
现在,我们可以检索整个FRAXStablecoin存储,并指定–max-depth 25标志来传递我们希望slither-read-storage返回的数据结构的最大深度:
|
|
该工具将生成一个包含存储布局和值的JSON文件,但我们只对frax_pools_array感兴趣。截至撰写本文时,该工具检索了25个元素,指示可以铸造FRAX的地址。
|
|
套利机器人
除了在Etherscan上进行月光审计外,slither-read-storage还可以用于提高程序的速度。例如,我们可以使用slither-read-storage让程序直接访问以太坊节点的数据库,而不是处理RPC调用。这对于不提供视图函数来检索所需变量的合约尤其有用。
例如,假设一个套利机器人频繁读取WETH/USDC Uniswap V3池上变量slot0的成员sqrtPriceX96(参见下面的数据结构)。
|
|
我们可以使用slither-read-storage来计算槽,而不是调用提供的视图函数,如下所示:
|
|
该工具生成的文件包含sqrtPriceX96的槽、大小和偏移量,可以轻松地从以太坊节点的键值存储中检索,并根据大小和偏移量进行切片。事实证明,Uniswap开发者恰当地命名了这个变量slot0,但这在实践中很少可用。
|
|
此外,可以使用以太坊节点RPC eth_call通过传入存储槽和所需值来修改存储值,并模拟应用于修改状态的交易如何受到影响。关于如何实现这一点的更多细节可以在本教程中找到。
投资组合跟踪
可以使用以下slither-read-storage命令找到此账户的余额槽,其中令牌地址作为目标,账户地址作为键:
|
|
在这个特定实例中,槽是我们打算检索的账户地址0xab5801a7d398351b8be11c439e05c5b3259aec9b,以及槽9,填充到32字节:
|
|
该值使用keccak256进行哈希,余额使用SSTORE(slot, value)写入结果槽。
可升级的ERC20代币
一个正常的智能合约在同一地址具有合约逻辑和存储。然而,当使用delegatecall代理模式(允许合约可升级)时,代理调用实现,存储值写入代理合约。也就是说,DELEGATECALL操作码使用逻辑合约的存储信息写入调用者地址的存储。为了适应这种模式,需要–storage-address标志来检索相同地址的余额槽:
|
|
结束语
通过构建这个工具,我学到了很多关于Solidity的存储处理和Slither的API的知识,它的发布完成了我作为学徒加入Trail of Bits之前开始的工作。事实上,我可以将我在这里的宝贵经验归功于在Twitter上讨论Slither,并在开发这个工具的第一次迭代时发现Slither中的问题。
如果您也想做同样的事情,请查看我们的GitHub并抓取一个开放的问题。我们很乐意帮助新的贡献者。
如果您喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News
页面内容 什么是slither-read-storage? slither-read-storage的用例 月光审计 套利机器人 投资组合跟踪 可升级的ERC20代币 结束语 最近的帖子 非传统创新者奖学金 在您的PajaMAS中劫持多代理系统 我们构建了MCP一直需要的安全层 利用废弃硬件中的零日漏洞 Inside EthCC[8]:成为智能合约审计员 © 2025 Trail of Bits. 使用Hugo和Mainroad主题生成。