閱界資訊

智能合約 Fuzz 實踐案例:Balancer 精度舍入漏洞

閱閱界編輯部1閱讀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)

暫無評論,來搶第一條。