泰山众筹源码系统开发(全合约)泰山众筹系统开发语言讲解丨泰山众筹商城系统开发技术方案

简介: 泰山众筹源码系统开发(全合约)泰山众筹系统开发语言讲解丨泰山众筹商城系统开发技术方案

重入漏洞相信大家都有所耳闻,那么什么是重入漏洞呢?

众所周知,以太坊的转账不仅可以在钱包地址之间进行,合约与钱包地址之间、合约与合约之间也可以,而合约在接收到转账的时候会触发 fallback 函数执行相应的逻辑,这是一种隐藏的外部调用。攻击者就会利用这一点,在合约的fallback 函数中写入恶意逻辑重新进入到被攻击的合约内部,让被攻击的合约执行非预期的外部调用,从而到达获取不正当利益的目的。

漏洞示例

下面我们来看一个比较典型的有重入漏洞的代码:

漏洞分析

上面的代码就是个普通的充提币的合约,那么怎么对其发起重入攻击呢?我们来看这个合约的 withdraw 函数,这个函数中的转账操作有一个外部调用“msg.sender.call{value: bal}”,所以我们就可以认为这个合约是可能有重入漏洞的,让我们来进一步分析看看:

在 withdraw 函数中是先执行外部调用进行转账后才将账户余额清零的,那么就可以在转账外部调用的时候构造一个恶意的逻辑合约在合约执行 balance[msg.sender]=0之前一直循环调用 withdraw 函数一直提币从而将合约账户清空。

攻击合约

下面我们看看攻击者编写的攻击合约中的攻击手法是否与我们的漏洞分析相同:

我们看到 EtherStore 合约是一个充提合约,我们可以在其中充值和提现。

攻击者先调用合约中的攻击函数先向EtherStore中充值1ether,在EtherStore中他的账户余额就为1ether,那么他就可以提现这些余额。紧接着,withdraw 函数发起提现,当EtherStore向攻击合约转账完成时,攻击合约就会调用fallback函数,再次请求提现余额,如此循环就能将EtherStore中的余额提现到不足1ether,才结束这个循环。

攻击函数调用流程图:

修复建议

看了上面的攻击手法相信大家对重入漏洞都会有一个自己的认知了,但是我们的应该怎么避免重入漏洞防御重入攻击呢?以下是我给大家的建议:

  1. 写代码时需要遵循先判断,后写入变量在进行外部调用的编码规范(Checks-Effects-Interactions)。
  2. 加入防重入锁。

下面是一个防重入锁的代码示例:

相关文章
|
存储 分布式计算 数据可视化
阿里云大数据ACA及ACP复习题(331~340)
本人备考阿里云大数据考试时自行收集准备的题库,纯手工整理的,能够覆盖到今年7月份,应该是目前最新的,发成文章希望大家能一起学习,不要花冤枉钱去买题库背了,也希望大家能够顺利通关ACA和ACP考试(自己整理解析也需要时间,可能有更新不及时的情况哈)
|
缓存 NoSQL 应用服务中间件
Redis-多级缓存
什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务性能: 浏览器访问静态资源时,优先读取浏览器本地缓存 访问非静态资源(ajax查询数据)时,访问服务端 请求到达Nginx后,优先读取Nginx本地缓存 如果Nginx本地缓存未命中,则去直接查询Redis(不经过Tomcat) 如果Redis查询未命中,则查询To
349 0
|
3月前
|
安全 固态存储 Windows
电脑重置一次对电脑伤害大吗
电脑重置是指将系统恢复至初始状态,常用于解决卡顿、病毒等问题。本文解析重置对硬件无直接伤害,并介绍其适用场景、注意事项及与重装系统的区别,助你科学维护电脑。
|
关系型数据库 MySQL 数据库连接
Go语言中使用sqlx来操作事务
在应用中,数据库事务保证操作的ACID特性至关重要。`github.com/jmoiron/sqlx`简化了数据库操作。首先安装SQLX和MySQL驱动:`go get github.com/jmoiron/sqlx`和`go get github.com/go-sql-driver/mysql`。导入所需的包后,创建数据库连接并使用`Beginx()`方法开始事务。通过`tx.Commit()`提交或`tx.Rollback()`回滚事务以确保数据一致性和完整性。
146 0
|
Kubernetes 网络协议 API
玩转Kubernetes—基础概念篇
玩转Kubernetes—基础概念篇
363 1
麒麟系统卸载openjdk
麒麟系统卸载openjdk
332 0
|
存储 Prometheus Kubernetes
Etcd几个关键的监控指标
Etcd是一个高可靠、分布式的键值存储系统,Kubernetes的设计基本都是围绕Etcd设计的,可谓成也Etcd,败也Etcd。Etcd负责Kubernetes集群的数据存储,提供了集群数据一致性保证及监测(watch)等机制,是整个集群的核心,但由于Etcd本身的性能限制,制约了Kubernetes集群的规模,当前官宣的最大节点数是5000,但目前原生Kubernetes在生产环境中基本都不超过3000个节点,所以针对Etcd的监控尤为重要。
1290 0
|
存储 人工智能 大数据
Hbase中表结构的设计
Hbase中表结构的设计
|
机器学习/深度学习 算法 C++
动手强化学习(九):策略梯度算法
 首先定义策略网络PolicyNet,其输入是某个状态,输出则是该状态下的动作概率分布,这里采用在离散动作空间上的softmax()函数来实现一个可学习的多项分布(multinomial distribution)。
588 0
|
IDE Ubuntu 开发工具
ROS入门笔记(三):二进制包与源代码包
ROS入门笔记(三):二进制包与源代码包
669 0
ROS入门笔记(三):二进制包与源代码包