智能合约安全漏洞解析:从 Reentrancy 到 Integer Overflow
目录
🌀 Reentrancy(重入攻击)
原理解析
典型案例:The DAO 攻击事件
漏洞示例
防范措施
🔢 Integer Overflow(整数溢出)
原理解析
漏洞示例
防范措施
🛡️ 总结与建议
随着区块链技术的广泛应用,智能合约在去中心化金融(DeFi)、NFT、DAO 等领域扮演着越来越重要的角色。然而,智能合约的安全性问题也日益凸显,尤其是 Reentrancy(重入攻击)和 Integer Overflow(整数溢出)等经典漏洞,曾导致多起严重的安全事件。本文将深入解析这两类漏洞的原理、典型案例,并提供防范建议,帮助开发者构建更安全的智能合约。
🌀 Reentrancy(重入攻击)
原理解析
Reentrancy 是指攻击者在智能合约执行过程中,通过外部调用再次进入原函数,导致合约状态未及时更新,从而实现多次调用、重复操作的攻击方式。
攻击流程通常如下:
-
攻击者向目标合约存入一定的资金。
-
调用目标合约的提现函数,该函数在转账前未更新用户余额。
-
攻击者在接收到转账时,利用 fallback 或 receive 函数再次调用提现函数。
-
由于余额尚未更新,攻击者可以重复提现,直到合约资金耗尽。
典型案例:The DAO 攻击事件
2016 年,The DAO 项目遭受 Reentrancy 攻击,攻击者利用合约中的漏洞,反复调用提现函数,最终盗取了约 360 万个 ETH,导致以太坊社区进行了一次硬分叉,以恢复被盗资金 。
漏洞示例
pragma solidity ^0.8.0;contract Vulnerable {mapping(address => uint) public balances;function deposit() public payable {balances[msg.sender] += msg.value;}function withdraw(uint _amount) public {require(balances[msg.sender] >= _amount, "Insufficient balance");(bool success, ) = msg.sender.call{value: _amount}("");require(success, "Transfer failed");balances[msg.sender] -= _amount;}
}
上述合约在转账后才更新用户余额,攻击者可以在接收到转账时,利用 fallback 函数再次调用 withdraw
,实现重复提现。
防范措施
-
遵循 Checks-Effects-Interactions 模式:先进行状态检查和更新,再进行外部调用。
function withdraw(uint _amount) public {require(balances[msg.sender] >= _amount, "Insufficient balance");balances[msg.sender] -= _amount;(bool success, ) = msg.sender.call{value: _amount}("");require(success, "Transfer failed");
}
-
使用
ReentrancyGuard
:引入互斥锁,防止重入。
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";contract Secure is ReentrancyGuard {function withdraw(uint _amount) public nonReentrant {// 安全的提现逻辑}
}
-
限制外部调用:避免在合约中进行不必要的外部调用,降低攻击面。
🔢 Integer Overflow(整数溢出)
原理解析
整数溢出是指在进行算术运算时,结果超出了数据类型的表示范围,导致数值回绕。例如,uint8
的最大值为 255,若执行 255 + 1
,结果将变为 0。
在 Solidity 0.8 之前,整数溢出不会抛出异常,攻击者可以利用这一特性,绕过合约中的安全检查。
漏洞示例
pragma solidity ^0.7.0;contract Overflow {uint8 public count = 255;function increment() public {count += 1; // count 将变为 0}
}
在上述合约中,count
的初始值为 255,调用 increment
后,count
将变为 0,可能导致逻辑错误或安全漏洞。
防范措施
-
升级 Solidity 版本:Solidity 0.8 及以上版本默认启用了溢出检查,溢出将导致交易失败。
-
使用 SafeMath 库:在旧版本中,可引入 SafeMath 库,进行安全的算术运算。
pragma solidity ^0.7.0;
import "@openzeppelin/contracts/math/SafeMath.sol";contract Safe {using SafeMath for uint8;uint8 public count = 255;function increment() public {count = count.add(1); // 若溢出,将抛出异常}
}
-
避免类型转换错误:在进行类型转换时,确保不会引入溢出风险。例如,将较大的整数转换为较小的数据类型时,要进行范围检查。
🛡️ 总结与建议
智能合约的安全性至关重要,Reentrancy 和 Integer Overflow 是两类常见且危害严重的漏洞。开发者在编写合约时,应:
-
遵循最佳实践,如 Checks-Effects-Interactions 模式。
-
使用最新版本的 Solidity,利用其内置的安全特性。
-
引入成熟的安全库,如 OpenZeppelin 提供的 ReentrancyGuard 和 SafeMath。
-
进行充分的测试和审计,及时发现并修复潜在漏洞。
通过以上措施,可以有效提升智能合约的安全性,保障区块链应用的稳定运行。
相关文章:
智能合约安全漏洞解析:从 Reentrancy 到 Integer Overflow
目录 🌀 Reentrancy(重入攻击) 原理解析 典型案例:The DAO 攻击事件 漏洞示例 防范措施 🔢 Integer Overflow(整数溢出) 原理解析 漏洞示例 防范措施 🛡️ 总结与建议 随着…...

英国2025年战略防御评估报告:网络与电磁域成现代战争核心
英国 2025 年战略防御评估 (SDR) 详细制定了一项计划,通过加强使用网络、人工智能和数字战争来整合其军事防御和进攻能力。 与美国一样,英国也被认为(尽管未被公开证实)会开展进攻性网络行动,甚至针对盟友。斯诺登泄露…...

基于QPSK调制解调+Polar编译码(SCL译码)的matlab性能仿真,并对比BPSK
目录 1.引言 2.算法仿真效果演示 3.数据集格式或算法参数简介 4.MATLAB核心程序 5.算法涉及理论知识概要 6.参考文献 7.完整算法代码文件获得 1.引言 Polar码由土耳其教授Erdal Arikan于2008年提出,是第一种被严格证明可以达到香农极限的构造性编码方法。其核…...
go语言学习 第5章:函数
第5章:函数 函数是编程中不可或缺的一部分,它封装了一段可重复使用的代码,用于执行特定的任务。在Go语言中,函数同样扮演着重要的角色。本章将详细介绍Go语言中函数的定义、调用、参数传递、返回值处理以及一些高级特性ÿ…...
Qt Quick快速入门笔记
Qt Quick快速入门笔记 基本的程序结构int main(int argc, char *argv[]) { #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); #endifQGuiApplication app(argc, argv);QQmlApplicationEngine engine;const QUrl ur…...
《波段操盘实战技法》速读笔记
文章目录 书籍信息概览实战八法波段见顶信号中长线大顶形态投资理念 书籍信息 书名:《波段操盘实战技法》 作者:何瑞东 概览 实战八法 投资理念和投资理论概述:波段操作的核心是通过捕捉股价波动中的趋势性机会,结合技术分析与…...

Glide NoResultEncoderAvailableException异常解决
首先将解决方法提出来:缓存策略DiskCacheStrategy.DATA。 使用Glide加载图片,版本是4.15.0,有天发现无法显示gif图片,原始代码如下: Glide.with(context).load(本地资源路径).diskCacheStrategy(DiskCacheStrategy.A…...
工厂模式与多态结合
工厂模式与多态的结合是平台化项目中实现灵活架构的核心技术之一。这种组合能够创建可扩展、易维护的系统架构。 多态(Polymorphism)指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。 例子1: public abstract class Pay…...

无人机巡检智能边缘计算终端技术方案——基于EFISH-SCB-RK3588工控机/SAIL-RK3588核心板的国产化替代方案
一、方案核心价值 实时AI处理:6TOPS NPU实现无人机影像的实时缺陷检测(延迟<50ms)全国产化:芯片、操作系统、算法工具链100%自主可控极端环境适配:-40℃~85℃稳定运行,IP65防护等…...
相机--相机成像原理和基础概念
教程 成像原理 基础概念 焦距(物理焦距) 镜头的光学中心到感光元件之间的距离,用f表示,单位:mm;。 像素焦距 相机内参矩阵中的 fx 和 fy 是将物理焦距转换到像素坐标系的产物,可能不同。…...

2025-0604学习记录17——文献阅读与分享(2)
最近不是失踪了!也不是弃坑了...这不是马上要毕业了嘛!所以最近在忙毕业论文答辩、毕业去向填报、户档去向填报等等,事情太多了,没顾得上博客。现在这些事基本上都解决完了,也有时间静下心来写写文字了~ 想要写的内容…...

图解浏览器多进程渲染:从DNS到GPU合成的完整旅程
目录 浅谈浏览器进程 浏览器进程架构的演化 进程和线程关系图示 进程(Process) 线程(Thread) 协程(Coroutine) 进程&线程&协程核心对比 单进程和多进程浏览器 单进程浏览器编辑 单进程…...

【计算机网络】第3章:传输层—TCP 拥塞控制
目录 一、PPT 二、总结 TCP 拥塞控制详解 ⭐ 核心机制与算法 1. 慢启动(Slow Start) 2. 拥塞避免(Congestion Avoidance) 3. 快速重传(Fast Retransmit) 4. 快速恢复(Fast Recovery&…...

idea不识别lombok---实体类报没有getter方法
介绍 本篇文章,主要讲idea引入lombok后,在实体类中加注解Data,在项目启动的时候,编译不通过,报错xxx.java没有getXxxx()方法。 原因有以下几种 1. idea没有开启lombok插件 2. 使用idea-2023…...
【Hive入门】
之前实习写的笔记,上传留个备份。 1. 使用docker-compose快速搭建Hive集群 使用docker快速配置Hive环境 拉取镜像 2. Hive数据类型 隐式转换:窄的可以向宽的转换显式转换:cast 3. Hive读写文件 SerDe:序列化(对象转为字节码…...
亚马逊站内信规则2025年重大更新:避坑指南与合规策略
亚马逊近期对Buyer-Seller Messaging(买家-卖家站内信)规则进行了显著收紧,明确将一些曾经的“灰色操作”列为违规。违规操作轻则收到警告,重则导致账户暂停或绩效受限。本文为您全面解析本次规则更新的核心要点、背后逻辑&#x…...
01 - AI 时代的操作系统课 [2025 南京大学操作系统原理]
01 - AI 时代的操作系统课 [2025 南京大学操作系统原理] [00:00:00]-[D:\movie\南京大学操作系统\01-AI时代的操作系统课[2025南京大学操作系统原理].mp4] 大家好!我是姜艳艳,来自南京大学计算机软件研究所。今天我们开启《操作系统原理》的第一课&…...
数组1 day7
六:数组 一:数据类型 1.int a[10] //想要知道一个标识符对应的数据类型,去掉标识符,剩下就是它对应的数据类型 //eg:a所谓代表的类型,就是int[10]这种类型(是一个数组,包含10个…...

SAP学习笔记 - 开发15 - 前端Fiori开发 Boostrap,Controls,MVC(Model,View,Controller),Modules
上一章讲了Fiori开发的准备,以及宇宙至简之HelloWorld。 SAP学习笔记 - 开发14 - 前端Fiori开发 HelloWorld-CSDN博客 本章继续学习 Fiori 开发的知识: Bootstrap,Controls,MVC(Model,View,Controller&a…...
Redis中的过期策略与内存淘汰策略
因为Redis是纯内存操作,所以在Redis中创建的键一般都会带有过期时间,以此来保证内存中存储数据的时效性。这篇文章我们就来讲解一下Redis中的过期策略与内存淘汰策略。 如何设置Redis中键的过期时间? Redis提供了4个命令来设置键的过期时间&…...

基于SDN环境下的DDoS异常攻击的检测与缓解
参考以下两篇博客,最后成功: 基于SDN的DDoS攻击检测和防御方法_基于sdn的ddos攻击检测与防御-CSDN博客 利用mininet模拟SDN架构并进行DDoS攻击与防御模拟(Ryumininetsflowpostman)_mininet模拟dos攻击-CSDN博客 需求 H2 模拟f…...
HarmonyOS 实战:给笔记应用加防截图水印
最近在做笔记类应用时,遇到一个头疼的需求:防止用户内容被非法截图传播。思来想去,加水印是个直接有效的方案。研究了 HarmonyOS 的开发文档后,发现用 Canvas 配合布局组件能轻松实现动态水印效果。今天就来聊聊如何给笔记页面加上…...

如何轻松地将文件从 PC 传输到 iPhone?
传统上,您可以使用 iTunes 将文件从 PC 传输到 iPhone,但现在,使用 iTunes 已不再是唯一的选择。现在有多种不同且有效的方法可以帮助您传输文件。在今天的指南中,您可以找到 8 种使用或不使用 iTunes 传输文件的方法,…...
前端面试二之运算符与表达式
目录 1.JavaScript 中的 和 运算符 2.|| (逻辑或) 运算符 与 ES6 默认参数的区别 与 ?? (空值合并运算符) 的区别 3.?.(可选链)运算符 (1). 安全访问深层嵌套属性 (2). 安全调用可能不存在的函数 (3). 安全访问数组元素 4.展开运算符 (..…...
【运维实战】使用Nvm配置多Node.js环境!
背景 新项目 使用Node.js-v16.17.1旧项目 使用Node.js- v14.18.0 【且依赖于node-saas模块,根据 node-sass 的官方文档,目前最新版本的 node-sass(即 v5.0.0)支持的 Node.js 版本范围是 Node.js 10.x、Node.js 12.x、Node.js 14.…...

Bresenham算法
一 Bresenham 绘直线 使用 Bresenham 算法,可以在显示器上绘制一直线段。该算法主要思想如下: 1 给出直线段上两个端点 ,根据端点求出直线在X,Y方向上变化速率 ; 2 当 时,X 方向上变化速率快于 Y 方向上变化速率&am…...

【从GEO数据库批量下载数据】
从GEO数据库批量下载数据 1:进入GEO DataSets拿到所需要下载的数据的srr.list,上传到linux, 就可以使用prefetch这个函数来下载 2:操作步骤如下: conda 安装sra-tools conda create -n sra-env -c bioconda -c co…...

day 44
使用DenseNet预训练模型对cifar10数据集进行训练 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms, models from torch.utils.data import DataLoader import matplotlib.pyplot as plt import os# 设置中文字体…...
鸿蒙OSUniApp开发跨平台AR扫描识别应用:HarmonyOS实践指南#三方框架 #Uniapp
UniApp开发跨平台AR扫描识别应用:HarmonyOS实践指南 前言 随着增强现实(AR)技术在移动应用中的广泛应用,越来越多的开发者需要在跨平台应用中实现AR功能。本文将深入探讨如何使用UniApp框架开发一个高性能的AR扫描识别应用&…...

NER实践总结,记录一下自己实践遇到的各种问题。
更。 没卡,跑个模型休息好几天,又闲又急。 一开始直接套用了别人的代码进行实体识别,结果很差,原因是他的词表没有我需要的东西,我是用的医学文本。代码直接在github找了改的,用的是BERT的Chinese版本。 然…...