发布时间:2026/7/26 17:15:42
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/7/26 17:15:42

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

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

2026/7/26 23:26:09

【项目编号:project90470】图书馆管理不只是“借书还书”:这套 Spring Boot 系统把馆藏、读者与数据统计全串起来了

图书馆管理不只是“借书还书”:这套 Spring Boot 系统把馆藏、读者与数据统计全串起来了Spring Boot 图书馆管理系统 前后台完整展示图书馆管理系统看似经典,但真正做出完整度以后,依然能够清楚体现前端交互、后台管理、数据库设计和数据统计…

2026/7/26 23:26:09

# 鸿蒙ArkTS实战:折扣计算器 — 快速百分比选择与省钱明细展示

一、应用概述 折扣计算器(Discount Calculator)是购物场景中使用频率极高的工具。当用户面对「全场 7 折」「满 200 减 50」「第二件半价」等促销信息时,最迫切的需求是快速知道折后价、节省金额和折扣力度。本应用基于 ArkTS 构建&#xff…

2026/7/26 23:26:09

RC4算法C语言实现与安全缺陷深度剖析

1. 项目概述:为什么今天还要聊RC4?如果你是一位C/C开发者,或者对密码学、网络安全感兴趣,那么“RC4”这个名字你一定不陌生。它曾经是SSL/TLS、WEP/WPA等众多协议中流密码的绝对主力,以其实现简单、速度极快而闻名。然…

2026/7/26 0:03:36

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/26 0:03:36

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/7/26 2:45:59

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…