当前位置: 首页 > news >正文

Morpheus 审计报告分享3:StETH 的精度丢失转账机制

漏洞信息

漏洞报告

  1. https://code4rena.com/audits/2025-08-morpheus/submissions/S-198

漏洞背景

  1. https://docs.lido.fi/guides/lido-tokens-integration-guide#steth-internals-share-mechanics

StETH 是一种通过将 ETH 质押获取的 rebasing token,在用户持有的过程中余额会随着奖励的累加而自动增加。用户只需要持有 StETH 就可以获得 ETH 奖励,持有的 StETH 数量与可赎回的 ETH 数量是几乎相等的。

而实现这个 rebasing 功能依赖的是内部的 share 机制,share 的计算公式是

shares = ETHAmount * TotalPooledETH / TotalShares

ETH → StETH 的代码实现是这样的

image

而 StETH 的余额也是通过 shares 来计算得到的。

image

精度丢失问题

在进行转账时,会经过 StETH amount → shares → transfer shares → update StETH balance 的过程

image

而由于 StETH amount → shares 的环节是向下取整的,所以可能会存在在进行 transfer 时,实际收到的 StETH 数量比传入的参数要小的情况。

image

举例说明:

假设此时 StETH 中 shares : ETH = 1000 : 1500,UserA 向 UserB 进行转账

  1. UserA 持有 1500 StETH,对应 1000 shares
  2. Transfer 1300 StETH → shares = 1300 * 1000 / 1500 = 866.66… = 866
  3. UserB 收到 866 shares,对应 StETH = 866 * 1500 / 1000 = 1299

这就导致了 UserA 在调用 transfer 函数时传入的 amount 为 1300,而 UserB 实际上收到的代币数量为 1299。

漏洞案例

当合约对 AAVE 进行 supply 操作时,如果 token 为 StETH,可能会出现实际 supply 的 StETH 数量小于 amount_ 的值。而在后续的 depositedlastUnderlyingBalance 变量计算中则是直接累加上了 amount_ 的值,使得它们的值比实际值要偏大。

image

而在后续的 distributeRewards() 函数中,首先会计算获得的 aToken 数量(等于所提供的 StETH 数量),随后用来减去 lastUnderlyingBalance。如果此时 StETH 的转账发生了精度丢失,且 aToken 的奖励还没开始累计,这个减法操作将会发生下溢出,导致操作回滚。

image

修复建议

其实 Morpheus 在 User 往 Morpheus 协议转账这个层面有考虑到这个问题,所以采用的是转账前后账户余额差值(实际到账金额)作为 amount_ 的值。而在 Morpheus 协议向 AAVE 转账这个环节没有采用这种实践。

image

补充材料

  1. https://docs.lido.fi/guides/lido-tokens-integration-guide#wsteth

由于 StETH 的 rebasing 特性,在 DeFi 协议中使用起来可能会难以处理。所以为了解决这个问题,官方提供了 warp StETH 实现,也就是 WstETH。WstETH 的余额不会发生 rebasing,只能在转账、铸造和销毁时更改。
image

从代码实现来看,其实 WstETH 对应的就是 StETH 里面的 shares

http://www.hskmm.com/?act=detail&tid=5982

相关文章:

  • 小区物业的智慧:轻松图解JVM垃圾回收的奥秘
  • SPI 总线概述及嵌入式 Linux 从属 SPI 设备驱动程序开发(第二部分,实践) - 教程
  • 详细介绍:idea2025创建第一个项目
  • CUDA多版本安装切换(转链接自用)
  • 社交交友源码:功能剖析、盈利探索与绿色运营策略
  • 权变与权力异化,是斗争的根源,超越自我,良性循环
  • 元推理AGI,是人类文明的结晶,超越爱因斯坦相对论,是文明进步的必然
  • PLC结构化文本设计模式——原型模式(Prototype Pattern)
  • 【一步步开发AI运动APP】十二、自定义扩展新运动项目1
  • 【Linux】人事档案——用户及组管理 - 详解
  • 试试这个AI邪修方法,让你刷推特时间节省80%
  • [数据结构——lesson10.2堆排序以及TopK障碍]
  • 终端里跑图形应用「GitHub 热点速览」
  • trl ppo
  • PHP-FPM 深度调优指南 告别 502 错误,让你的 PHP 应用飞起来
  • RAG系统大脑调教指南:模型选择、提示设计与质量控保一本通
  • 智驾终局:VLA与WA的“强脑”之争
  • 微软2018年第四季度顶级漏洞赏金猎人榜单揭晓
  • 能源汽车智能线控底盘
  • Linux中的LED子专业的系统
  • DP 凸性优化:wqs 二分
  • 浦东再添一所一流高校,上海交通大学医学院浦东校区正式启用
  • nccl study
  • AI服务器公开招标大面积失败,中国联通“招”了个寂寞?
  • 【GitHub每日速递 250916】2053 个 n8n 工作流曝光!365 种集成 + 可视化管理,效率直接拉满
  • 每日一家公司职场内幕——龙旗科技(上海)
  • 0129_迭代器模式(Iterator)
  • HJ7 取近似值
  • 读人形机器人13艺术领域
  • 活动报名:Voice First!Demo Day@Voice Agent Camp,9.22,上海丨超音速计划 2025