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

发布时间:2026/11/1 22:44:56

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 审计团队发现在涉及transfer和transferFrom函数的组合操作中精度丢失可能被利用来操纵余额。例如攻击者可以通过反复进行小额转账累积舍入误差最终提取比预期更多的资产。这种攻击被称为“精度丢失攻击”或“舍入攻击”。## 三、代码示例模拟精度丢失### 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(iterations10, base_shares1000): 攻击模拟多次转账累积精度丢失 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第 {i1} 次发送 {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(iterations5, base_shares1000)运行此代码你会发现分次转账的总接收量可能略高于一次性转账这是因为每次截断都会丢失小数部分但多次截断可能在某些情况下累积出整数单位。这揭示了精度丢失攻击的原理。## 四、Morpheus 审计报告的核心发现### 4.1 漏洞细节Morpheus 审计团队在检查 stETH 合约的_transfer函数时发现当用户从 rebasing 池向 non-rebasing 池转账时精度丢失会导致实际转账金额与预期不符。具体来说- 在计算amount时使用了shares * currentRate / PRECISION的公式。- 由于整数除法小数部分被丢弃导致接收方少收 stETH。- 攻击者可以构造特定交易使这些“丢失”的 stETH 累积到自己的地址。### 4.2 影响范围该漏洞影响所有依赖 stETH 进行精确金额计算的 DeFi 协议例如借贷平台Aave、Compound、DEXUniswap和收益聚合器Yearn。在极端情况下攻击者可能通过自动化脚本在短时间内窃取大量价值。### 4.3 修复建议Morpheus 审计报告提出了以下修复方案1.引入最小转账单位强制要求转账金额大于某个阈值减少舍入误差的影响。2.使用高精度数学库例如 OpenZeppelin 的SafeMath或PRBMath在除法前进行乘法放大。3.增加检查逻辑在转账后验证实际接收量是否与预期一致不一致时回滚交易。## 五、总结stETH 的精度丢失转账机制是一个典型的安全设计缺陷源于 DeFi 协议中整数运算与动态汇率的冲突。Morpheus 审计报告通过深入分析揭示了这种舍入误差如何被利用进行攻击。对于开发者而言理解精度丢失的数学原理是编写安全合约的基础对于用户意识到小额转账可能累积风险有助于避免不必要的损失。通过本文的代码示例和审计发现希望你能掌握精度丢失的核心概念并在实际项目中采用高精度计算和严格验证来防范此类漏洞。记住在区块链世界中即使是最微小的误差也可能被放大成巨大的威胁。
延伸阅读

更多相关文章

2026/11/1 21:17:33

PHP 开发者必看得 个容易犯的常见错误 % 的开发者都踩过

PHP 开发者必看的 5 个容易犯的常见错误,80% 的开发者都踩过 PHP 作为一门广泛使用的服务器端编程语言,以其简洁的语法和强大的功能深受开发者喜爱。然而,即使是经验丰富的 PHP 开发者,也可能因为一些常见错误而陷入调试的泥潭。本…

2026/11/1 2:01:37

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

2026/11/1 2:01:37

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

2026/11/1 2:01:37

关于“贾子猜想”的数学地位、结构特征与讨论边界

关于“贾子猜想”的数学地位、结构特征与讨论边界摘要 本文对“贾子猜想”进行基于公开表述与现有数学事实的分析。该猜想主张:当正整数 n3m>5(即 n6,9,12,15,…)时,方程x₁ⁿ x₂ⁿ ⋯ xₙⁿ yⁿ不存在正整数解。文章首先…

2026/11/1 2:01:37

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

2026/11/1 2:01:37

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

2026/11/1 1:56:37

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑