Polter Finance 漏洞:Fork-and-Pray 失败

本文详细分析了Polter Finance的安全漏洞及其导致的1200万美元损失,探讨了该平台的操作机制、缺陷及攻击过程。文章深入剖析了价格预言机系统的不足,以及如何通过闪电贷操纵价格,从而导致平台流动性被抽空。作者总结了漏洞的根源,并给出了改进建议,强调了独立安全审计的重要性。

"Polter Finance Exploit: Fork-and-Pray Failure - Three Sigma" banner

Polter Finance 简介

Polter Finance 是一个去中心化、非托管的协议,旨在借贷数字资产。它使用流动性池,用户可以存入资产以赚取利息或以其抵押品进行借贷。该协议基于与 GEIST 平台相同的智能合约,该平台以前在 Fantom 区块链上运行,但进行了修改,例如禁用闪电贷以解决已知的安全漏洞。

该平台采用以 $POLTER 代币为中心的代币激励模型,向参与者分配代币,以提供流动性、借贷或质押。其机制包括动态利率调整、赚取奖励的归属以及保持偿付能力的清算系统,以确保借款者负责。是什么导致了 Polter Finance 系统的漏洞,这个问题是理解从该平台抽走1200万美元的攻击的核心。

Polter Finance 的运作方式

借贷池

存入 Polter Finance 的资产被汇集到每种代币类型的单一储备中。借款人从这些储备中获取流动性,借款人支付的利息在存款人和质押者之间分配。

抵押和借贷

借款人必须抵押资产以访问流动性。借贷限额由针对每种资产的贷款价值比率(Loan-to-Value, LTV)决定。例如,某项LTV为30%的资产允许借贷高达抵押品价值的30%。借款人的持仓通过“健康因子”进行监控,该因子指示他们贷款的偿付能力。

利率机制

Polter 使用与每个资产池的使用率相关联的动态利率模型:

  • 使用率 (U)

  • 利率曲线:每个池有两段线性曲线。在最优使用点以下,利率缓慢增长,以鼓励借贷。超过此点,利率急剧上升以激励存款并减少借贷。

清算过程

健康因子低于1的借款人变得有资格被清算:

  • 健康因子计算

  • 清算机制:清算人偿还借款人的一部分债务,并索取相应价值的抵押品,以及处罚费用。

代币经济

$POLTER 代币是协议激励结构的核心。代币根据参与指标分配,例如存款规模、借贷使用率和质押贡献。奖励经过3个月的归属期,以鼓励长期参与。

Polter Finance 的安全疏忽

在深入了解攻击的细节之前,重要的是要强调 Polter Finance 团队的一个重大安全疏忽。该项目没有对其平台进行独立的安全审计,而是依赖于另一个项目 Geist Finance 的审计报告,这是他们所分叉的代码库。

依赖分叉代码审计

在审计页面上,Polter Finance 表示:

Polter Finance 网站的截图

尽管从一个信誉良好的项目分叉代码可以作为起点,但仅依赖原始项目的审计是远远不够的,原因有几个:

  • 代码修改:甚至是小的更改,例如删除闪电贷功能,都可能引入无法预见的漏洞。
  • 不同的部署背景:操作环境、集成和依赖项可能不同,从而影响安全性。
  • 更新和补丁:分叉代码可能不包括原始项目中实施的最新安全补丁或更新。
  • 安全责任:依赖其他项目的审计并不将确保安全的责任转移到你自己的项目上。

Polter Finance 攻击分析

2024年11月16日,运行于 Fantom 网络上的去中心化借贷协议 Polter Finance 遭遇了一次重大攻击,导致约1200万美元的损失。攻击者利用去中心化金融中的常见漏洞:价格预言机操控。该攻击特别针对了 Polter Finance 对 SpookySwap V2 和 V3 流动性池中 BOO 代币价格数据的依赖。

通过执行闪电贷以操纵这些流动性池,攻击者人为地抬高了 BOO 代币的价格。这使得他们能够以最小的 BOO 数量作为抵押存入,并借出价值远高于实际抵押品价值的资产,最终有效地抽空多个借贷池。

要保护你的项目免受漏洞影响,你可以探索我们的 区块链安全服务

攻击概述

核心问题源于 Polter Finance 定价预言机系统中的缺陷,这是 Polter Finance 黑客攻击的核心漏洞,特别是在 ChainlinkUniV2Adapter 合约中,该合约被 AaveOracle 使用。预言机未能验证重大价格波动,并且缺乏对闪电贷操控的保护措施。攻击者利用这一点:

  1. 闪电贷操控:发起闪电贷,暂时从 SpookySwap V2 和 V3 流动性池中抽走 BOO 代币,导致代币储备严重失衡。
  2. 抵押存入:将少量 BOO 存入 Polter Finance 借贷池作为抵押。
  3. 利用被抬高的价格:利用被人为抬高的 BOO 价格借出价值远高于抵押品的资产。
  4. 获利并退出:偿还闪电贷并保留借来的资产,最终抽空 Polter Finance 的流动性。

攻击的详细分解

步骤1:闪电贷启动

攻击者通过从 SpookySwap 的 V2 和 V3 流动性池中提取大量闪电贷来启动攻击:

  • SpookySwap V2 闪电贷:269,042 BOO 代币
  • SpookySwap V3 闪电贷:1,154,788 BOO 代币

闪电贷是无需抵押的贷款,必须在同一交易中还款。它们通常用于套利机会,但如果没有适当的保护措施,也可能被用来操纵链上数据。

来自 SpookyV2 和 SpookyV3 LPs 的闪电贷

通过借入这些大量的 BOO 代币,攻击者暂时从池中移除了显著的流动性。这一举动严重减少了池中的 BOO 储备,导致代币配对的不平衡。

自动做市商 (AMM) 模型

基于 AMM 的去中心化交易所(如 SpookySwap)中代币的价格由恒定乘积公式决定:

  • x:代币 A(例如 BOO)的储备
  • y:代币 B(例如 wFTM)的储备
  • k:储备的恒定乘积

当储备 xxx(BOO 代币)因闪电贷显著减少时,BOO 相对于代币 B 的价格急剧上升,以维持恒定的 kkk。这导致了流动性池中 BOO 的价格被人为抬高。

步骤2:以被抬高的价值存入抵押

利用被操控的现货价格,攻击者在 Polter Finance 的借贷池中仅存入 1 BOO 代币 作为抵押。

由于预言机中的逻辑缺陷,AaveOracle 使用的错误价格源将 1 BOO 代币评估为约 1.37 万亿 美元的被抬高价值,而不是其实际市场价值。

这使得攻击者拥有了过于高估的抵押品,从而能够借出大量资产。

存入 1 BOO 代币

被抬高的 BOO 代币价值

步骤3:利用预言机漏洞

ChainlinkUniV2Adapter 合约被用于获取当前的 BOO 代币价格。然而,它缺乏检查因闪电贷而导致的剧烈价格波动的保护措施。

该适配器中的 _fetchPrice 函数直接从流动性池中检索 BOO 的当前价格,而没有任何机制来检测或防止突然的价格操控。

_fetchPrice() 函数

getRoundData() 函数用于检索历史价格数据,但也未能验证重大价格变化。

getRoundData() 函数

它依赖于 _getPriceAndTimestamp(),该函数仅返回当前的操控价格,而未对其合法性或与以前值的比较进行评估。此外,getRoundData() 使用硬编码的 answeredInRound 值,绕过动态价格验证机制。

_getPriceAndTimestamp() 函数

因此,在返回前,没有验证操控的价格。此外,函数中的硬编码 answeredInRound = 2 值没有考虑价格数据是否对当前轮次准确,从而进一步允许错误价格未经检查地通过。

latestRoundData() 函数

latestRoundData() 函数原本旨在返回最新的价格信息,但由于攻击者的闪电贷造成流动性转移,却提供了被抬高的虚假价格它缺乏机制来验证检索到的价格(answer)的准确性,未受操控。

getRoundData()latestRoundData() 函数旨在保持 BOO 代币的定价一致和准确,但未能考虑闪电贷引发的重大价格偏差。攻击者通过提供最小的抵押,同时利用被抬高的价格源,来利用这一漏洞。

previousChainlink0Response 机制

prevChainlink0Response 机制的目的是通过在 _chainlinkPriceChangeAboveMax 函数中比较当前价格与先前价格,以标记超过特定阈值的价格变化,但该函数无法有效运行,因为其硬编码 roundId 和历史价格数据无关,因此无法获取有效的前一价格:

代码块

然而,由于 getRoundData() 中硬编码的 roundId,该机制无法获取有效的先前价格,使得比较无效,从而允许抬高的价格绕过预言机的检查。

  • 硬编码 roundIdgetRoundData() 函数始终返回 roundId2,导致无法通过递减 roundId 获取以往价格数据。

getRoundData() 函数

  • 无效的前一轮数据:由于 roundId 始终为 2,使用 _currentRoundId - 1(结果为 1)尝试获取前一轮数据时失败,因为适配器不支持获取 roundId2 以外的数据。
  • 未检测到价格飙升:因此,PriceFeedV2 合约中的 _chainlinkPriceChangeAboveMax 函数无法检测到因闪电贷操控所致的异常价格飙升。

代码块

这一失误使得1 BOO 代币的人为抬高价格能够绕过预言机的检查,从而导致抵押品价值计算出错。

攻击者继续利用被抬高的抵押品借出wFTM 代币。通过维持操控价格,他们能够继续循环借贷,毫无阻碍地抽走流动性池中的资金。由于预言机合约无法检测这些重复的借贷,任由其价格验证逻辑失效。

借出 9,134,844 wFTM

攻击者最终利用 BOO 代币的被抬高价格借出 9,134,844 wFTM,截至目前约抽走了 1200万美元 从 Polter Finance 借贷池。

步骤4:偿还闪电贷并获利

成功从 Polter Finance 借出资产后,攻击者随即偿还闪电贷。通过将借来的 BOO 代币归还至 SpookySwap V2 和 V3,他们恢复了流动性池的储备,并使 BOO 代币的价格恢复到其实际市场价值。闪电贷结清后,攻击者保留了借到的 wFTM 代币及在攻击中获得的其他资产。

如何可以防止攻击

针对 Polter Finance 的此次攻击源于重大的安全疏忽,主要是缺乏独立的安全审计。Polter Finance 没有对其平台进行全面审计,而是依赖 Geist Finance 的审计报告,后者是他们分叉的代码库。这一做法显然不够充足,因为即便是小的修改,例如禁用闪电贷功能,都可能引入新的漏洞。独立审计可能会识别出其预言机系统中的被利用的弱点。

要防止攻击,Polter Finance 应该在其价格预言机中实施强有力的验证机制。ChainlinkUniV2Adapter 合约缺乏对闪电贷导致的剧烈价格波动的保护措施。引入时间加权平均价格(TWAP)或使用可靠的价格源,如 Chainlink 提供的去中心化预言机网络,能够降低临时价格操控的影响。此外,负责提取价格数据的函数应包含检查机制,以比较新价格与历史数据,并拒绝异常值。

通过进行独立的安全审计,并提高其预言机的验证过程,Polter Finance 本可以发现并解决这些漏洞。这些措施将显著降低价格操控攻击的风险,从而保护协议和用户资产的安全。

后果

Polter Finance 利用事件的直接后果是损失了约 1200万美元 的借贷池资金。这一重大财务损失影响了平台及其用户,导致用户资产大量缩水。由于这一严重的漏洞揭示了 Polter Finance 安全基础设施中的关键脆弱性,这可能会对用户信任产生负面影响,并损害该协议的声誉。这一事件可能使用户重新评估 Polter Finance 的安全性和可靠性。

Polter Finance 协议的反应

在事件发生后,Polter Finance 迅速采取措施以减轻损失并与社区沟通。他们的反应包括几项关键步骤:

  1. 平台暂停:该平台迅速暂停,以防止进一步的利用并保护任何剩余的用户资金。

Polter Finance 推特的截图

2. 联系攻击者:团队就此事件向个人发出了链上呼吁,旨在协商资金的归还或达成友好解决。

Polter Finance 推特的截图

3. 与安全专家合作:Polter Finance 积极与网络安全机构合作,调查事件并寻求解决方案。

Polter Finance 推特的截图

4. 法律行动:Polter Finance 就此次事件正式报案,并将此进展分享给了社区。

Polter Finance 推特的截图


阅读我们的 Deltaprime DeFi 利用事件Ronin Network 利用事件 文章,以便随时了解 DeFi 安全动态。


地址

地址

  • 原文链接: threesigma.xyz/blog/polt...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Three Sigma
Three Sigma
Three Sigma is a blockchain engineering and auditing firm focused on improving Web3 by working closely with projects in the space.