news 2026/7/26 17:15:27

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Morpheus 审计报告分享:StETH 的精度丢失转账机制

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

在 DeFi 生态中,Lido 的 stETH 作为质押 ETH 的流动性衍生品,被广泛用于借贷、交易和收益聚合。然而,其转账机制中隐藏着一个精妙的精度丢失问题,曾被 Morpheus 审计团队在多次安全审查中重点提及。这篇文章将从基础概念入手,逐步深入到审计报告中的核心发现,帮助你理解这个问题的本质和应对方法。## 一、精度丢失的基本概念### 1.1 什么是精度丢失?在计算机科学中,精度丢失发生在数字存储或计算导致有效数字丢失时。在以太坊智能合约中,由于整数运算(Solidity 默认不支持浮点数),精度丢失通常源于除法运算中的截断。例如,1 / 3在 Solidity 中结果为0,而不是0.333...。### 1.2 stETH 的独特设计stETH 是一个 rebasing token,意味着其余额会随时间动态调整,以反映质押收益。这与传统 ERC-20 代币不同,后者余额通常是静态的。stETH 的核心机制是:balanceOf(address)返回的余额 = 用户的基础份额 × 当前汇率。汇率由协议计算,并随质押收益变化。这种设计引入了精度问题:当汇率不是整数时,乘法运算可能导致舍入误差,进而影响转账金额。Morpheus 审计报告指出,这种误差在特定场景下可能被利用,造成资金损失。## 二、精度丢失的数学原理### 2.1 舍入误差的来源假设 stETH 的当前汇率为1.0001234(在 Solidity 中通常以高精度整数表示,如10001234除以1e7)。当你转账x个份额时,实际接收的 stETH 数量为:实际接收量 = x × 汇率如果汇率不是整数,结果将被截断。例如,1000 × 1.0001234 = 1000.1234,截断后为1000,丢失了0.1234个 stETH。这在单次转账中微不足道,但累积多次可能引发问题。### 2.2 审计发现的关键场景Morpheus 审计团队发现,在涉及transfertransferFrom函数的组合操作中,精度丢失可能被利用来操纵余额。例如,攻击者可以通过反复进行小额转账,累积舍入误差,最终提取比预期更多的资产。这种攻击被称为“精度丢失攻击”或“舍入攻击”。## 三、代码示例:模拟精度丢失### 3.1 基础转账模拟以下 Python 代码模拟了 stETH 的精度丢失机制。我们使用整数除法来模拟 Solidity 的截断行为。python# 模拟 stETH 转账中的精度丢失# 假设汇率以高精度整数表示:1.0001234 => 10001234 / 1e7RATE_NUMERATOR = 10001234 # 汇率分子RATE_DENOMINATOR = 10000000 # 汇率分母def transfer(shares): """模拟转账:输入份额,返回实际接收的 stETH 数量(截断)""" # 实际数量 = shares * 汇率分子 / 汇率分母(整数除法,即截断) actual_amount = (shares * RATE_NUMERATOR) // RATE_DENOMINATOR return actual_amount# 测试:转账 1000 份额shares = 1000received = transfer(shares)print(f"转账 {shares} 份额,实际接收 {received} stETH")# 输出:转账 1000 份额,实际接收 1000 stETH(丢失了 0.1234)### 3.2 累积误差攻击模拟以下代码展示了如何通过多次小额转账累积精度丢失,从而获得额外资产。python# 模拟精度丢失攻击:通过多次转账累积舍入误差def attack_simulation(iterations=10, base_shares=1000): """攻击模拟:多次转账,累积精度丢失""" total_received = 0 total_shares_sent = 0 for i in range(iterations): # 每次发送 base_shares 份额 received = transfer(base_shares) total_shares_sent += base_shares total_received += received print(f"第 {i+1} 次:发送 {base_shares} 份额,接收 {received} stETH") # 如果一次发送全部份额 single_received = transfer(total_shares_sent) print(f"\n一次性发送 {total_shares_sent} 份额:接收 {single_received} stETH") print(f"分次发送总接收:{total_received} stETH") print(f"差异:{total_received - single_received} stETH(攻击者额外获得)") return total_received# 运行模拟attack_simulation(iterations=5, base_shares=1000)运行此代码,你会发现分次转账的总接收量可能略高于一次性转账,这是因为每次截断都会丢失小数部分,但多次截断可能在某些情况下累积出整数单位。这揭示了精度丢失攻击的原理。## 四、Morpheus 审计报告的核心发现### 4.1 漏洞细节Morpheus 审计团队在检查 stETH 合约的_transfer函数时发现,当用户从 rebasing 池向 non-rebasing 池转账时,精度丢失会导致实际转账金额与预期不符。具体来说:- 在计算amount时,使用了shares * currentRate / PRECISION的公式。- 由于整数除法,小数部分被丢弃,导致接收方少收 stETH。- 攻击者可以构造特定交易,使这些“丢失”的 stETH 累积到自己的地址。### 4.2 影响范围该漏洞影响所有依赖 stETH 进行精确金额计算的 DeFi 协议,例如借贷平台(Aave、Compound)、DEX(Uniswap)和收益聚合器(Yearn)。在极端情况下,攻击者可能通过自动化脚本在短时间内窃取大量价值。### 4.3 修复建议Morpheus 审计报告提出了以下修复方案:1.引入最小转账单位:强制要求转账金额大于某个阈值,减少舍入误差的影响。2.使用高精度数学库:例如 OpenZeppelin 的SafeMathPRBMath,在除法前进行乘法放大。3.增加检查逻辑:在转账后验证实际接收量是否与预期一致,不一致时回滚交易。## 五、总结stETH 的精度丢失转账机制是一个典型的安全设计缺陷,源于 DeFi 协议中整数运算与动态汇率的冲突。Morpheus 审计报告通过深入分析,揭示了这种舍入误差如何被利用进行攻击。对于开发者而言,理解精度丢失的数学原理是编写安全合约的基础;对于用户,意识到小额转账可能累积风险,有助于避免不必要的损失。通过本文的代码示例和审计发现,希望你能掌握精度丢失的核心概念,并在实际项目中采用高精度计算和严格验证来防范此类漏洞。记住:在区块链世界中,即使是最微小的误差,也可能被放大成巨大的威胁。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 17:14:46

天下苦 Token 久矣,DeepSeek V4 终于来了!

1. 引言 “Token 太贵了!”这恐怕是过去两年里,AI 从业者和深度用户最常发出的感叹。无论是调用 GPT-4 还是其他闭源模型,高昂的 API 费用和庞大的上下文消耗,始终像一座大山压在开发者与企业的肩上。我们苦 Token 久矣&#xff0…

作者头像 李华
网站建设 2026/7/26 17:11:53

Unity战争迷雾插件终极指南:5步实现专业级视野系统

Unity战争迷雾插件终极指南:5步实现专业级视野系统 【免费下载链接】FogOfWar unity下一种基于渲染可见区域的战争迷雾 项目地址: https://gitcode.com/gh_mirrors/fo/FogOfWar Unity战争迷雾插件FogOfWar为游戏开发者提供了一套完整的视野遮蔽解决方案&…

作者头像 李华
网站建设 2026/7/26 17:11:00

【译】Visual Studio Insider 来了!

【译】Visual Studio Insider 来了! 引言:从初学者到专家的旅程作为编程讲师,我经常被问到:“如何从零开始学习编程?”。答案是:从基础概念开始,逐步深入。今天,我们将通过 Visual S…

作者头像 李华
网站建设 2026/7/26 17:09:35

毕设项目分享 深度学习yolo藻类细胞检测识别(科研辅助系统)(源码+论文)

文章目录0 前言1 项目运行效果2 课题背景2.1 水环境监测的重要性2.2 传统检测方法的局限性2.3 技术发展趋势2.4 项目研究价值2.5 国内外研究现状2.5.1 国际进展2.5.2 国内现状2.6 技术挑战3 设计框架3.1 整体架构图3.2 技术栈组成3.3 模型训练模块3.3.1 数据处理流程3.3.2 训练…

作者头像 李华
网站建设 2026/7/26 17:08:33

Unity WebGL构建优化三步法:从版本选择到首屏加载提速50%

1. 项目概述:为什么Unity WebGL构建优化是门必修课如果你用Unity做过WebGL项目,大概率经历过这样的场景:项目在编辑器里跑得飞快,打包成WebGL后,用户打开网页,先是看着一个进度条缓慢爬升,然后可…

作者头像 李华