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

发布时间:2026/9/12 8:46: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 审计团队发现在涉及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/9/4 16:03:05

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

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

2026/9/12 8:45:13

C++字符串操作:从基础反转到高级算法

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

2026/9/12 8:45:12

医疗实体识别与知识图谱驱动的智能医生推荐系统实践

简介:一套融合领域知识图谱与医疗实体识别的医生推荐系统完整工程文件,面向自然语言处理、知识图谱方向的学习者与医疗信息化开发者,解决医疗实体识别、知识抽取及智能问答落地问题。资源采用BERTCRFBiLSTM实现医疗实体识别,并构建…

2026/9/12 8:40:12

AI Agent全栈开发指南:从基础原理到生产级项目实战

1. 先弄清楚 AI Agent 到底在解决什么问题去年这个时候,还有人在群里问 AI Agent 是不是又一个概念泡沫。到了 2026 年,这个问题基本没人问了——招聘平台上挂着「agent 开发」字样的岗位翻了不止一倍,面试里开始出现「你怎么设计一个多智能体…

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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