今天,我们一直在跟 @blockaid_ 密切合作,详细调查昨晚发生的针对 @humafinance v1 协议的漏洞攻击事件。Blockaid 的事件分析报告非常详尽(链接见第一条回复),在此不做赘述。
以下是事件 TL;DR 及我们从中学到的关于系统架构和运营的经验教训。 👇
TL;DR
攻击事件: 攻击者发现了智能合约中的一个漏洞,并从 Polygon 上的三个 v1 老池子中盗取了约 10.1 万美元的 protocol fee & pool owner fee。
用户资金: 用户资金没有受到任何影响。
风险隔离: 问题出在 Huma EVM v1 合约。与 PST 及 Huma 在 Solana 上所有的智能合约完全无关。
Solana 合约: Solana 上的程序采用了全面重新设计的架构,不包含此次被攻破的逻辑。
当前状态: 所有 v1 资金池均已暂停。
关键的经验教训:表面上看,这是 2023 年初上线的 v1 版本中的一个智能合约漏洞,但它凸显了在协议设计和运营方面的几个问题:
- 不要把重要的状态转换(state transitions)混在有复杂逻辑的函数里 _updateDueInfo() 和 _getDueInfo() 计算到期款项和各类费用,是 v1 合约中最复杂的部分。将借款人状态转换嵌入到这些复杂函数中不是一个明智的选择。我们后来对这个设计也不太满意,在 Huma v2 智能合约的设计上放弃了这个方案,采用了更简单的架构。
- 坚决剔除不必要的功能。 引入 requestCredit() 是为了支持未来的扩展,但在实际运营中从未用到过。非关键函数天生会受到较少的测试和安全审查,从而产生了不必要的攻击面。在发布前我们曾讨论过要不要把它拿掉,但当时认为没有大碍就保留了。如果某个函数不是必须,就不应该放进合约里。
- 积极关闭不再使用的池子。 保留不再需要的旧池子会产生不必要的风险。今天,开发者和攻击者攻防双方都积极使用 AI,一些旧合约没用经过 AI 审计,可能会有更多的薄弱环节。关停 v1 资金池的工作此前已经在进行中,但没有放在最高的优先级,我们在这一点上应该更坚决。
这是一个惨痛的教训。我们应该好好从中学习,以不辜负这高昂的学费。在此分享我们第一时间的反思和经验教训,希望能帮助生态别的建设者,尤其是有老合约的项目方,能更有效地提高对黑客的防范。DeFi United, DeFi Strong! 🛡️