事件背景
根据NUMEN链上监控显示,Feb-01-2023 06:29:18 PM +UTC,Polygon链上BonqDAO遭到价格操控攻击,损失113,813,998枚WALBT和100,000,000枚BEUR,价值约8800万美元。
攻击者地址0xcAcf2D28B2A5309e099f0C6e8C60Ec3dDf656642
攻击者合约0xED596991ac5F1Aa1858Da66c67f7CFA76e54B5f1
攻击交易 0x31957ecc43774d19f54d9968e95c69c882468b46860f921668f2c55fadd51b19;
0xa02d0c3d16d6ee0e0b6a42c3cc91997c2b40c87d777136dedebe8ee0f47f32b1
攻击分析
攻击者首先通过少量代币测试withdrawAllTokens功能正常使用,随后给攻击合约转入少量TRB和WALBT,为后续攻击做准备。
攻击者通过给TellorFlex合约添加质押存款,获得了更新价格的条件,这里价格更新为price=5000000000000000000000000000.
之后攻击者通过调用borrow方法借款,由于借款获取价格是通过TellorFlex.getCurrentValue获取,由于攻击者已将该价格修改,所以这里获取的价格极高,导致攻击者的大额借款可以成功借出。
漏洞核心
关键问题是在
https://polygonscan.com/address/0x8f55d884cad66b79e1a131f6bcb0e66f4fd84d5b#code
合约的submitvalue
攻击者在上一步depositStake已经完成了资产抵押(抵押了10个TRB),所以在这一步可以给预言机发送报价。质押的越多更新报价的间隔会缩短。
然后再看价格的查询:
https://polygonscan.com/address/0xa1620af6138d2754f7250299dc9024563bd1a5d6#code
https://polygonscan.com/address/0x8f55d884cad66b79e1a131f6bcb0e66f4fd84d5b#code
跟进到getDataBefore
然后再看getIndexForDataBefore,getTimestampbyQueryIdanIndex,retrieveData
querrId是个常量,先从时间戳找到index,因为根据时间戳记录了很多报价,然后通过querryId获得价格,返回值正是前面submitvalue的第二个参数:
hex:0x00000000000000000000000000000000000000001027e72f1f12813088000000
10进制:5000000000000000000000000000。
故此由于TellorFlex合约可以进行报价,报价的条件是只要用户质押就能报价,所以用户通过抵押10000000000000000000.获取了12h报价一次的机会。随后通过TellorFlex.submitValue函数进行了报价。
攻击复现
EXP
EXP源码链接:
https://github.com/numencyber/SmartContractHack_PoC/blob/main/BonqDAO_exp.sol
测试结果
总结
NUMEN实验室提醒项目方,代币价格需要进行严格把控,多种喂价汇总在一块时,需要考虑价格计算的合理程度及喂价是否存在被控制的风险,合约上线前需要进行多家安全审计,保障合约风险尽可能被消除在链下,NUMEN专注于为web3生态安全保驾护航。
原文始发于微信公众号(Numen Cyber Labs):BonqDAO价格操纵攻击详细分析附PoC