阅界资讯

智能合约 Fuzz 实践案例:Balancer 精度舍入漏洞

阅阅界编辑部2阅读7分钟

推荐《智能合约 Fuzz 实践案例:Balancer 精度舍入漏洞》:作者把经验掰开揉碎讲得很细。下面按要点重新组织一遍,方便你快速抓住重点、用起来。

背景 20260831-Balancer 攻击事件 20260831,Balancer v1 合约遭受了黑客攻击,损失约 234k 美元。该次攻击事件的 rootcause 是协议在舍入方向上采用了“四舍五入”的方式,而不是采用“对协议有利”的舍入方式,使得攻击者可以利用舍入的精度丢失进行获利。 本篇文章通过【事后分析】的角度,分析如何通过 fuzzing 的方式来检测出该项目存在的漏洞。 Fuzz 目标函数选择 确定要测试的函数 首先根据 rootcause 分析,攻击者利用的是 joinswapPoolAmountOut 和 exitswapPoolAmountIn 两个函数进行攻击,而舍入问题出现在 calcSingleOutGivenPoolIn 和 calcSingleInGivenPoolOut 两个函数中,且这两个函数作为互为“双生函数”(成对出现、具有高度对称性、互补性或协同工作关系的两个函数)。

背景 20260831-Balancer 攻击事件 20260831,Balancer v1 合约遭受了黑客攻击,损失约 234k 美元。该次攻击事件的 rootcause 是协议在舍入方向上采用了“四舍五入”的方式,而不是采用“对协议有利”的舍入方式,使得攻击者可以利用舍入的精度丢失进行获利。 本篇文章通过【事后分析】的角度,分析如何通过 fuzzing 的方式来检测出该项目存在的漏洞。 Fuzz 目标函数选择 确定要测试的函数 首先根据 rootcause 分析,攻击者利用的是 joinswapPoolAmountOut 和 exitswapPoolAmountIn 两个函数进行攻击,而舍入问题出现在 calcSingleOutGivenPoolIn 和 calcSingleInGivenPoolOut 两个函数中,且这两个函数作为互为“双生函数”(成对出现、具有高度对称性、互补性或协同工作关系的两个函数)。 此时需要选择对哪组函数进行 fuzz: joinswapPoolAmountOut 和 exitswapPoolAmountIn :针对外部函数,贴合实际操作,保留参数检查与约束,一旦 fuzz 出来问题,那就意味着这个问题是可利用的。

背景 20260831-Balancer 攻击事件 20260831,Balancer v1 合约遭受了黑客攻击,损失约 234k 美元。该次攻击事件的 rootcause 是协议在舍入方向上采用了“四舍五入”的方式,而不是采用“对协议有利”的舍入方式,使得攻击者可以利用舍入的精度丢失进行获利。 本篇文章通过【事后分析】的角度,分析如何通过 fuzzing 的方式来检测出该项目存在的漏洞。 Fuzz 目标函数选择 确定要测试的函数 首先根据 rootcause 分析,攻击者利用的是 joinswapPoolAmountOut 和 exitswapPoolAmountIn 两个函数进行攻击,而舍入问题出现在 calcSingleOutGivenPoolIn 和 calcSingleInGivenPoolOut 两个函数中,且这两个函数作为互为“双生函数”(成对出现、具有高度对称性、互补性或协同工作关系的两个函数)。 此时需要选择对哪组函数进行 fuzz: joinswapPoolAmountOut 和 exitswapPoolAmountIn :针对外部函数,贴合实际操作,保留参数检查与约束,一旦 fuzz 出来问题,那就意味着这个问题是可利用的。 calcSingleOutGivenPoolIn 和 calcSingleInGivenPoolOut :只针对内部函数,简单直接。

背景 20260831-Balancer 攻击事件 20260831,Balancer v1 合约遭受了黑客攻击,损失约 234k 美元。该次攻击事件的 rootcause 是协议在舍入方向上采用了“四舍五入”的方式,而不是采用“对协议有利”的舍入方式,使得攻击者可以利用舍入的精度丢失进行获利。 本篇文章通过【事后分析】的角度,分析如何通过 fuzzing 的方式来检测出该项目存在的漏洞。 Fuzz 目标函数选择 确定要测试的函数 首先根据 rootcause 分析,攻击者利用的是 joinswapPoolAmountOut 和 exitswapPoolAmountIn 两个函数进行攻击,而舍入问题出现在 calcSingleOutGivenPoolIn 和 calcSingleInGivenPoolOut 两个函数中,且这两个函数作为互为“双生函数”(成对出现、具有高度对称性、互补性或协同工作关系的两个函数)。 此时需要选择对哪组函数进行 fuzz: joinswapPoolAmountOut 和 exitswapPoolAmountIn :针对外部函数,贴合实际操作,保留参数检查与约束,一旦 fuzz 出来问题,那就意味着这个问题是可利用的。 calcSingleOutGivenPoolIn 和 calcSingleInGivenPoolOut :只针对内部函数,简单直接。但是无法保证 fuzz 的参数是符合实际情况的(需要额外添加约束或验证)。

背景 20260831-Balancer 攻击事件 20260831,Balancer v1 合约遭受了黑客攻击,损失约 234k 美元。该次攻击事件的 rootcause 是协议在舍入方向上采用了“四舍五入”的方式,而不是采用“对协议有利”的舍入方式,使得攻击者可以利用舍入的精度丢失进行获利。 本篇文章通过【事后分析】的角度,分析如何通过 fuzzing 的方式来检测出该项目存在的漏洞。 Fuzz 目标函数选择 确定要测试的函数 首先根据 rootcause 分析,攻击者利用的是 joinswapPoolAmountOut 和 exitswapPoolAmountIn 两个函数进行攻击,而舍入问题出现在 calcSingleOutGivenPoolIn 和 calcSingleInGivenPoolOut 两个函数中,且这两个函数作为互为“双生函数”(成对出现、具有高度对称性、互补性或协同工作关系的两个函数)。 此时需要选择对哪组函数进行 fuzz: joinswapPoolAmountOut 和 exitswapPoolAmountIn :针对外部函数,贴合实际操作,保留参数检查与约束,一旦 fuzz 出来问题,那就意味着这个问题是可利用的。 calcSingleOutGivenPoolIn 和 calcSingleInGivenPoolOut :只针对内部函数,简单直接。但是无法保证 fuzz 的参数是符合实际情况的(需要额外添加约束或验证)。即使 fuzz 出问题,也还是需要进一步分析传入参数的场景是否能够被构造出来。

最后提醒:每个人的环境不一样,照抄之前先小步验证。有了自己的验证结果,这篇的价值才真正归你。你怎么看? 来源|博客园《智能合约 Fuzz 实践案例:Balancer 精度舍入漏洞》,https://www.cnblogs.com/ACaiGarden/p/22939203.html

程序员技术场技术后端

评论(0)

暂无评论,来抢第一条。