Morpheus 審計報告分享1:AAVE 項目 Pool 合約地址更新導致的組合性風險
前言
這次為大家?guī)淼氖?Code4Rena 審計平臺上 Morpheus 項目的審計結(jié)果分享,也是第一次寫這種形式的博客,主要的目的是在閱讀審計報告的時候?qū)W習并歸納一些比較有價值的漏洞形式。好的,話不多說,直接開始。
漏洞信息
漏洞報告
- https://code4rena.com/audits/2025-08-morpheus/submissions/S-484
- https://code4rena.com/audits/2025-08-morpheus/submissions/S-666
漏洞代碼
漏洞背景
在 AAVE 項目中,Pool 合約的地址是可能改變的:
- 代碼中存在修改 Pool 地址的邏輯:


在 C4 的審計報告中提到“AAVE 在 V2 到 V3 等主要版本升級或池遷移期間修改過 Pool 地址”,那么歷史上出現(xiàn)過修改 Pool 地址的操作嗎?:[尚未找到證據(jù)]
為了求證這個說法,經(jīng)過多次的搜索與鏈上狀態(tài)分析,并沒找到修改的相關(guān)信息。
AAVE 地址查詢:https://aave.com/docs/resources/addresses
- 通過查詢相關(guān) Event 沒有結(jié)果:
- V2 Event:
AddressSet(bytes32,address,bool):0xf2689d5d5cd0c639e137642cae5d40afced201a1a0327e7ac9358461dc9fff31 - V3 Event:
AddressSet(bytes32,address,address):0x9ef0e8c8e52743bb38b83b17d9429141d494b8041ca6d616a6c77cebae9cd8b7
- V2 Event:
- 通過對比 PoolAddressesProvider 和 Pool 合約的部署日期,均為一致的,說明 Pool 在部署后就沒有進行過更改。
漏洞案例
在 Distributor 合約的設計中,token - aToken - Pool 三者的關(guān)系是對應的。
且 Pool 的地址是通過 setAavePool() 函數(shù)手工設置的

在 addDepositPool() 函數(shù)中, 管理員可以為目標 token 新增一個獎勵池子,如果該池子是 AAVE 策略的,會先檢查該 token 對應的獎勵池是否已經(jīng)存在,然后再對 Pool 進行進行 token 和 aToken 的授權(quán)。

如果 AAVE 更新了 Pool 的地址,則 token 和 aToken 對應 Pool 應該進行改變。但即使管理員通過 setAavePool() 函數(shù)重新設置了 aavePool 的地址,也無法取消舊池子的授權(quán),以及為新池子添加授權(quán)。
如果采取再次添加新池子的形式,也會由于 !isDepositTokenAdded[token_] 的檢查而失敗。
這個設計缺陷會導致獎勵池中的資產(chǎn)被鎖定,用戶無法正常領(lǐng)取獎勵。
修復方案
在 setAavePool() 函數(shù)中添加如下邏輯
- 取消對舊池子的授權(quán)
- 執(zhí)行對新池子的授權(quán)
補充材料
建議在需要 Pool 合約時從 PoolAddressesProvider 智能合約中通過 getPool() 函數(shù)獲取正確的地址,而不是自行設定一個 Pool 地址。如果采取手動設置的形式,在 AAVE 更新后和手動更新前這段事件內(nèi),無法保證協(xié)議能夠正常運行。
https://aave.com/docs/developers/smart-contracts/pool-addresses-provider

后記
第一次寫這種形式的文章,感覺無論是自己分析還是讀者閱讀,最大的難點就是如何在不熟悉項目代碼的前提下,能夠?qū)β┒磮蟾嬷械膬?nèi)容有清晰的認知和深入的理解。但是目前沒有很好的辦法能夠滿足這種需求,只能夠退而求其次。嘗試盡可能地把漏洞相關(guān)的代碼從項目中拆解出來并且向讀者交代一個大概的項目背景這樣類似 docker 般的形式來輸出內(nèi)容。當然如果你什么更好的方法也隨時歡迎討論,感謝閱讀。

浙公網(wǎng)安備 33010602011771號