深度拆解DeFi经典漏洞案例,Sonne Finance Exploit

应用程序向导 应用程序向导  何志丹            使用应用程序向导可以快速生成程序框架。选择菜单“File→New”命令,此时会弹出“New”对话框,下面对该对话框中的常用选项进行逐一说明。1.文件(Files)属性页 单击“Files”标签,打开“Files”属性页,如图1-3所示。图1-3  文件属性页文件类型虽然多,但常用的只有两种:C/C++ Header Fi 阅读详情

在 DeFi 安全事件中,发生在 Sonne Finance上的漏洞非常具有研究价值。攻击者并没有利用传统的重入漏洞或闪电贷操纵,而是利用 借贷协议中“利率与份额计算的精度错误”,最终在几笔交易中抽走约 2000 万美元资产。

这类漏洞本质属于 share accounting error,在 Compound 系借贷协议分叉项目中非常常见。一旦某个市场的 totalSupply 或 totalBorrow 出现精度偏差,攻击者就可以用极小成本放大资产价值,从而套取协议资金。

Sonne Finance 的核心机制来自 Compound Protocol 的 cToken 模型。在该模型中,用户存入资产后会获得一个代表份额的 token,例如:

deposit token → receive sToken

关键变量包括:

uint totalSupply; // sToken 总量

uint totalBorrows; // 总借款

uint totalReserves; // 协议储备

uint exchangeRate; // token ↔ sToken 汇率

汇率计算公式通常为:

exchangeRate = (cash + totalBorrows - totalReserves) / totalSupply

这里隐藏着一个极其关键的假设:

👉 totalSupply 必须足够大

如果 totalSupply 极小,就会出现 精度放大攻击。

在 Sonne Finance 事件中,攻击者专门寻找 刚刚上线、几乎没人使用的市场。这些市场的 totalSupply 非常小,这给攻击提供了空间。

攻击流程可以拆解为五个步骤。

第一步:攻击者存入极小资产

例如只存入 1 wei 的 token。

function mint(uint mintAmount) external {

uint exchangeRate = exchangeRateStored();

uint mintTokens = mintAmount / exchangeRate;

totalSupply += mintTokens;

}

由于 exchangeRate 计算精度问题,mintTokens 可能接近 0 或 1。

第二步:操纵汇率

攻击者随后向市场 直接转入大量 token,而不是通过 mint。

transfer(token → contract)

注意:

很多 Compound fork 的市场 允许直接转账进入池子。

此时:

cash ↑

totalSupply 不变

于是 exchangeRate 暴涨。

第三步:借贷逻辑被误导

借贷逻辑通常会使用 exchangeRate 来计算抵押价值:

collateralValue = sTokenAmount * exchangeRate

由于 exchangeRate 被人为抬高,攻击者的 1 个 sToken suddenly worth millions。

第四步:借出大量资产

攻击者随后调用借贷函数:

function borrow(uint borrowAmount) external {

require(accountLiquidity(msg.sender) >= borrowAmount);

totalBorrows += borrowAmount;

}

系统认为攻击者抵押资产价值极高,于是允许借出巨额资金。

第五步:抽走流动性

攻击者借出:

USDC

WETH

OP

然后把资金跨链转移并洗出协议。

攻击路径可以简化为:

1. mint tiny amount

2. manipulate pool cash

3. inflate exchangeRate

4. borrow huge assets

5. drain liquidity

代码层面最大的设计问题是 exchangeRate 依赖 totalSupply,但系统没有限制最小流动性。

典型危险代码结构如下:

function exchangeRateStored() public view returns (uint) {

if (totalSupply == 0) {

return initialExchangeRate;

}

return (cash + totalBorrows - totalReserves) / totalSupply;

}

当 totalSupply 接近 0 时:

exchangeRate → extremely large

于是产生严重的价值错估。

从安全审计角度,这个漏洞暴露了 DeFi lending 协议常见的三个设计问题。

第一个问题:缺少最小流动性锁定

很多成熟协议会在池子创建时锁定一部分 liquidity,例如:

MIN_LIQUIDITY = 1000

避免 totalSupply 太小。

第二个问题:直接转账影响核心变量

协议没有限制:

token.transfer(pool)

这种行为会改变 cash,却不会更新会计状态。

第三个问题:依赖链上状态的价格计算

exchangeRate 并非真实市场价格,而是内部 accounting value。

攻击者只需要操纵 accounting 就可以影响借贷额度。

这类漏洞的修复方式通常包括:

🔧 强制最小流动性

require(totalSupply > MIN_SUPPLY);

🔧 禁止直接 token transfer

使用 ERC4626 或 hook 机制。

🔧 分离 accounting 与资产余额

不要直接使用 token.balanceOf()。

从 DeFi 安全研究角度来看,这次 Sonne Finance 事件提供了一个重要启示:

📊 数学模型错误往往比代码漏洞更危险

因为代码逻辑完全正确,但模型假设是错误的。

未来借贷协议的审计重点越来越偏向:

数学模型验证

极端状态测试

流动性边界条件

而不仅仅是 Solidity 代码本身。

因此,这类 “精度攻击 + 份额操纵” 已经成为 DeFi Lending 领域最值得警惕的攻击类型之一。 🚨

ChainSafeAI(链熵科技)专注于区块链生态安全,以“数据驱动 + 技术赋能”构建360°全方位安全防护体系,服务于交易所、金融机构、OTC服务商及加密资产投资者。

公司提供覆盖KYT风险监测、智能合约审计、加密资产追踪、区块链漏洞测试等在内的全维度安全与合规技术解决方案,助力客户防范洗钱、诈骗等风险,保障业务合规运行。

通过实时风险预警、合规审查与资金溯源分析,协助客户识别链上异常行为、防范洗钱及诈骗风险、降低被盗损失并提升资产追回可能性。

V4L2教程(1):Ubuntu V4L2开发环境搭建与设备探索 欢迎来到V4L2学习指南的第一篇!本文将带你从零开始,在Ubuntu系统上搭建完整的V4L2视频采集开发环境。无论你是想开发视频监控、视频会议还是机器视觉应用,掌握V4L2都是Linux视频开发的必经之路。 **本节学习目标**: - 理解V4L2的基本概念和架构 - 搭建Ubuntu下的V4L2开发环境 - 掌握v4l2-ctl等调试工具的使用 - 学会检测和配置USB摄像头设备 阅读详情

相关推荐

避开封号风险!wxauto+Claude API实现微信智能客服的合规方案

本文详细介绍了如何利用wxauto和Claude API构建合规的微信智能客服系统,避免封号风险。通过技术选型对比、防封策略设计及大模型接入实践,为企业提供了一套安全高效的解决方案,特别适合中小企业在微信生态中部署AI客服。

sql99的博客 446

【计算机网络篇|第二篇】深度解析TCP三次握手

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它在通信双方之间建立一条逻辑连接,保证数据按序到达、不丢失、不重复,并提供流量控制和拥塞控制能力。HTTP、FTP、SSH 等大量应用层协议都构建在 TCP 之上。由于 TCP 是面向连接的协议,通信双方在传输数据之前必须先建立连接,而建立连接的过程就是著名的「三次握手」。

wuzhihua66的博客 508

YOLOv8冻结层的迁移学习 全网首发

在调用时会创建trainer此时的模型配置更新了,冻结了个p。

qq_42693842的博客 6586

计算机网络篇19:传输层——套接字在内核的对象链,从 fd 到 tcp_sock 的四层嵌套

fd 是下标,是房间;钩住 socket,网络挂进文件体系,read/write 走统一入口。

2502_94387000的博客 537

扣子(coze)案例^第22期:零代码打造小红书竞品监控系统+AI自动生成运营策略建议

本文详细介绍了如何利用扣子(coze)平台零代码搭建小红书竞品监控系统。该系统通过自动化工作流抓取竞品笔记数据,并存入飞书多维表格,结合AI能力自动生成包含可视化分析报告在内的运营策略建议,帮助运营者高效进行数据驱动的市场分析。

weixin_29313239的博客 1005

企业级大模型落地:私有化部署的安全合规全流程实战指南

摘要:本文针对企业在大模型私有化部署中面临的数据泄露、合规风险及系统稳定性难题,提出一套覆盖数据安全、模型合规、审计追踪与灾备方案的全流程解决方案。通过双加密管道(国密SM4传输加密+AES-GCM存储加密)、SGX可信执行环境等技术,实现数据全生命周期保护;结合等保2.0三级要求与《生成式AI服务管理暂行办法》,提供合规性实施细则;并给出本地GPU集群、混合云、边缘推理盒子三种企业级部署方案及成本模型。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 913

【计算机网络篇|第七篇】TCP为什么需要四次挥手

TCP 需要四次挥手,本质上是全双工协议下两个方向必须独立关闭的必然结果:一方发 FIN 表示自己不再发送,另一方先 ACK 确认,等自己的数据发完后再发 FIN,最后再被 ACK 确认。理解这一点,也就能理解半关闭状态、CLOSE_WAIT 堆积和 TIME_WAIT 存在的意义。

wuzhihua66的博客 489

音视频开发基础(1):模拟视频技术简介

模拟视频技术是指用模拟技术对动态影像进行捕捉、记来、处理、存储、传输、复现的技术.模拟视频技术的发明、发展与模拟电视系统的发展密不可分.下面将通过模拟电视系统来介绍模拟视频技术中的基本概念. 首先,人的视觉系统的特征为电视等視稿系铳的发明、发展提供了理论依据.光线通过角膜、腫孔、晶状体的折射光线.透过玻璃体到达视网展.视网膜上分布着光感受器,光感受器在光线的剌激下...

琅嬛福地 1493

【计算机网络】断点续传是怎么做到的:从 Range 请求到分片上传的完整机制

断点续传在下载侧靠的是 HTTP 现成的 Range 协议,Content-Range 保证偏移对得上,If-Range 防止文件变更导致的错误拼接;上传侧没有标准,需要自己设计 init/part/complete 三段式交互,核心是让服务端记住“哪些块已经收下”,从而把失败粒度从整个文件降到单个分片。 这套机制可以迁移到任何长耗时操作的设计上。判断方法很简单:先问失败粒度是多少。如果一次操作失败就得从头再来,那它迟早会在生产环境里出问题——传输、批量导入、数据迁移、长事务,都是同一个道理。把大操作切成

2503_94545876的博客 539

YOLOv8改进 | 主干网络 | 将主干网络替换为轻量化的ShuffleNetv2【原理 + 完整代码】

yolov8,yolov8创新,yolov8改进

kay_545 2565

Monorepo与pnpm:前端项目管理的完美搭档

pnpm又称 performant npm,翻译过来就是高性能的npm。Monorepo是一种项目开发与管理的策略模式,它代表"单一代码仓库"(Monolithic Repository)。在Monorepo模式中,所有相关的项目和组件都被存储在一个统一的代码仓库中,而不是分散在多个独立的代码仓库中,这些项目之间还可能会有依赖关系。

m0_68271787的博客 2562

第15篇:UDP 深度解析--为什么 HTTP3 要抛弃 TCP?(附 Wireshark 实战抓包)

本文系统解析UDP与QUIC的核心原理与应用场景。UDP以极简无连接、不可靠传输为特点,适用于DNS、直播等对延迟敏感的场景;而QUIC在UDP基础上自建可靠传输,实现0-RTT握手、多路复用、连接迁移与强制加密,彻底解决TCP队头阻塞与协议僵化问题,成为HTTP/3基石。通过实验与抓包验证,深入揭示其底层机制,展现从传统网络向智能算网演进的关键路径。

cyf31的专栏 368

深入解析机器人软件开发中的核心:状态机管理(FSM)—— 理论、实践与优化

状态机(FSM)是机器人软件开发中管理复杂行为逻辑的核心工具,广泛应用于导航、任务执行、故障处理等场景。本文系统探讨状态机的基础理论(定义、要素)、主流设计模式(经典FSM、分层状态机HSM、行为树BT),以及工业级实现方法(代码架构、线程安全、调试技巧)。通过移动机器人导航和机械臂任务执行的案例,分析分层状态机的实际应用,并总结常见陷阱(如状态爆炸、阻塞操作)与优化策略(异步化、事件过滤)。

郑伟强dev的专栏 292

从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制

本文围绕TCP连接建立、关闭与状态管理展开,解释三次握手如何确认双方收发能力,以及SYN与ACK如何建立连接。接着分析四次挥手、半关闭状态及ACK与FIN合并发送的条件,结合CLOSE_WAIT说明未及时关闭连接带来的资源占用,并介绍shutdown接口的作用。针对服务器重启后的端口绑定问题,讲解TIME_WAIT、2MSL等待与SO_REUSEADDR的适用边界,分析历史报文干扰与随机初始序列号的作用。最后梳理客户端和服务端的TCP状态转换,理解连接管理底层机制与常见故障。

沫漓的博客 222

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

使用官方的 Echo例程lwip--tcp--udp--跑通测试--deepseek

跑通官方的 Echo Server 例子,已跑通,可是我一点不知道内部发生了啥;恭喜你!从你的截图来看,。Ping 通了,串口打印出了 IP 地址,网络调试助手也成功收到了回显(),这说明你的 Zynq 硬件、网络物理链路、lwIP 协议栈底层机制。你觉得“不知道内部发生了啥”,这太正常了。官方的 Echo 例子把很多底层的初始化封装成了几个函数,小白一开始确实容易“知其然而不知其所以然”。下面我先用大白话帮你把“内部发生了啥”理清楚,然后手把手带你写一个。

AlibabaApple的博客 238

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Linux网络编程:UDP网络协议

UDP(User Datagram Protocol,用户数据报协议)是传输层的一种无连接协议,定义在 RFC 768 中,全文只有三页,是 TCP/IP 协议族中最简单的协议之一。它的核心设计哲学是:只做最少的事,UDP 只负责把应用层交下来的数据封装成数据报,加上端口号后交给网络层发送,不保证送达、不保证顺序、不保证不重复,也不做流量控制和拥塞控制。所以需要注意udp是用户数据报协议数据报1.数据与数据之间有边界2.发送和接收的次数要对应3.没有写阻塞。发送太快,会导致数据丢失。

qianrushixinshou的博客 386

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

基于springboot+vue+uniapp的羽毛球预约小程序(Websocket智能沟通、Echarts数据分析、会员闭环管理、灵活运营规则、全流程预约)

本系统基于B/S架构,采用前后端分离设计,集成微信小程序与管理后台,实现多角色权限管控。核心亮点包括:全流程可视化预约、灵活运营规则配置、会员闭环管理(含余额、充值、退款)、ECharts多维度数据分析及WebSocket智能客服。支持语音、图片沟通,提升服务效率。系统覆盖用户、工作人员、管理员全链路功能,实现场馆资源高效管理与用户体验优化。

paopaokaka_luck的博客 229

11.4【计算机网络】

m0_73553411的博客 201

快捷键与热键有何异同?

本文对比了热键与快捷键在“粘贴”操作中的异同:用户层面,热键需按Alt+字母组合,快捷键则直接Ctrl+V;开发者层面,修改热键仅需调整菜单标题,而修改快捷键需编辑资源文件中的加速器设置。文章强调专业分工的重要性,并推荐相关排样优化与工具箱技术博文。

闻缺陷则喜何志丹 1746

HTTP、SSE、WebSocket、Socket.IO:实时通信方案深度对比与选型指南

HTTP 是基础,是整个 Web 的底座;SSE 是单向推送的轻量最优解;WebSocket 是高性能双向实时通信的底层标准;Socket.IO 是一套降低开发门槛、抹平环境差异的上层框架。技术选型永远不是“哪个技术更酷”,而是匹配业务的实时性、交互方向、网络环境、团队维护成本。简单需求优先轻方案,复杂双向实时再上 WebSocket;如果追求快速落地、兼容各种奇葩网络,Socket.IO 是很好的选择。

changshuaihua001的博客 347

计算机网络篇20:网络层——IP 协议的定位与 IPv4 报头字段,从 20 字节首部到 TTL 防环

TCP 报文要向下交给网络层才出得了主机,封装与解包是分层的物理形态。

2502_94387000的博客 848

WEISS MSI 接口技术拆解:WPG 高精密夹爪 1ms 控制周期实时插补,UDP 流式运动控制取代单指令抓取架构

MSI 采用流式控制模型:外部控制器经 UDP 实时流持续下发基础点(目标位置与力限值),WPG 夹爪内部将其插补至 1ms 控制周期。官网技术资料显示,外部连续运动控制与夹爪插补缓冲区(最高约 500ms)配合,运动逻辑完全保留在外部系统。

欣佰特cnbestec的博客 680

从零入门计算机网络系列(十七):TCP可靠传输机制进阶——从序列号与丢包处理到超时重传

本文承接上一讲TCP窗口与控制标志位,继续深入序列号、确认应答和超时重传。借助发送缓冲区下标类比,理解TCP如何为字节流编号,通过确认序号区分已确认与待确认数据。随后从发送方视角分析数据报文丢失和确认应答丢失两种情况,解释确认丢失为什么可能触发重复发送,以及接收方如何利用序列号识别重复数据,保证应用层获得有序、无重复的字节流。最后围绕“多久没收到确认才需要重传”,讨论超时时间过长与过短的影响,介绍TCP如何根据网络往返时间动态调整重传超时值,深入理解TCP可靠传输的实现逻辑。

沫漓的博客 451

计算机网络篇15:传输层——TCP 报头:4 位首部长度切出可变报头,确认应答与序号撑起可靠性

TCP 报头是 20 字节固定加选项,以 4 字节为单位,字段取值 [5, 15],报头范围 [20, 60]按首部长度读满为止,其后全是有效载荷。

2502_94387000的博客 766

TCP Socket 与 UDP Socket

Socket 是网络编程的基础,面试中 TCP 和 UDP Socket 的调用流程、内核行为、函数区别、缓冲区机制属于高频考点。很多同学容易混淆accept返回的 fd 作用、三次握手发生时机、UDP时序、内核缓冲区行为等细节。本文结合调用流程图,逐步骤拆解 TCP、UDP Socket 流程,梳理易错点和对比总结。TCP:服务端 socket-bind-listen-阻塞accept;客户端 socket-connect;握手成功后双向读写,最后 close 挥手断开。

weixin_68315058的博客 379

为什么要把父类的析构函数定义成虚函数?

问:为什么要把父类的析构函数定义成虚函数?答:否则子类的析构函数可以未被调用,具体代码如下:class A {public: A(){TRACE("A()/n");}; ~A(){TRACE("~A()/n");}; };class B : public A {public: B(){TRACE("B()/n");}; ~B(){TRACE("~B()/n");};};void CEgDl

闻缺陷则喜何志丹 1522
上一篇: 香港的区块链公司中,有哪些是最受投资者青睐的?
下一篇: Web3历史上最“离谱”的安全漏洞之一
ChainSafeAI005
博客等级 码龄1年 0粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值