首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏陈冠男的游戏人生

    智能合约:重入漏洞

    漏洞分析 以太坊智能合约的特点之一是能够调用其他外部合约的代码,然而这些外部合约可能被攻击者劫持,迫使合约通过回退函数进一步执行代码,包括回调本身。 如果不存在这样的函数,则合约不能通过常规交易接收以太币 如果构造一个 fallback 函数,函数里面也调用对方的 withdraw 函数的话,那将会产生一个循环调用转账功能,存在漏洞的合约会不断向攻击者合约转账 reentry 函数,进行攻击,然后看一下余额,发现原本在 victim 中的以太币全都到了 Attacker 合约中,同时 test 的值为 11,说明 fallback 函数被调用了 11 次 漏洞防范 重入漏洞的关键在于:利用回退函数调用函数本身,形成递归调用,在递归调用的过程中进行了转账操作,导致循环转账。 虽然代码中存在判断语句,但是状态更新在函数调用之后,所以状态更新会因为循环调用而迟迟无法执行 广义上看,重入攻击条件有以下两个: 调用合约外部函数。

    2.3K31发布于 2020-05-14
  • 来自专栏nft市场

    智能合约安全——重入漏洞

    重入漏洞相信大家都有所耳闻,那么什么是重入漏洞呢? 漏洞示例下面我们来看一个比较典型的有重入漏洞的代码:图片漏洞分析上面的代码就是个普通的充提币的合约,那么怎么对其发起重入攻击呢? 我们来看这个合约的 withdraw 函数,这个函数中的转账操作有一个外部调用“msg.sender.call{value: bal}”,所以我们就可以认为这个合约是可能有重入漏洞的,让我们来进一步分析看看 攻击函数调用流程图:图片修复建议看了上面的攻击手法相信大家对重入漏洞都会有一个自己的认知了,但是我们的应该怎么避免重入漏洞防御重入攻击呢?以下是我给大家的建议:1. 加入防重入锁。下面是一个防重入锁的代码示例:图片3. 记住所有涉及到外部合约调用的代码位置都是不安全的。

    93520编辑于 2022-07-29
  • 来自专栏亨利笔记

    以太坊智能合约安全漏洞(1):重入攻击

    程序间接递归 智能合约重入攻击 漏洞细节 当合约将以太币发送到未知地址时,可能会发生此攻击。攻击者可以在外部地址小心地构建合约,该地址包含回退函数中的恶意代码。 4. Attack.sol - 第25行- 发送给恶意合约的以太币将执行回退函数。 5. (本文首发于哈希1024社区:https://hash1024.org ) 预防技术 程序员写合约时需要留个心眼,提防合约重入的可能性,采用一些技术避免智能合约中潜在的重入漏洞。 将所有这些技术(不是全部都需要,但是为了演示目的都使用了)应用于EtherStore.sol,得到以下无重入漏洞的合约: 真实例子:The DAO事件 The DAO(Decentralized Autonomous 重入在攻击中发挥了作用,最终导致了以太坊经典(ETC)的硬分叉。 关于The DAO攻击的完整始末,请参看本公众号 2016 年的4篇原创文章(可点击): 道or悼?

    2.4K10发布于 2019-04-12
  • 来自专栏深入浅出区块链技术

    重入漏洞分析-基于hardhat、solidity0.8环境

    重入漏洞简介 1.1 漏洞定义 重入,顾名思义是指重复进入,也就是“递归”的含义,本质是循环调用缺陷。 重入漏洞(或者叫做重入攻击),是产生的根源是由于solidity智能合约的特性,这就导致许多不熟悉 solidity 语言的混迹于安全圈多年的安全人员看到“重入漏洞”这 4 个字时也都会一脸蒙圈,重入漏洞本质是一种循环调用 1.2 危害和利用难度 重入漏洞多数可以绕过代码的正常逻辑的执行,危害的究竟是可以导致拒绝服务还是可以导致代币丢失不能一概而论,更多取决于代码的编写逻辑相关,在区块链历史上,也产生过由于重入漏洞导致代币被盗的例子 在这个事件里,黑客利用的漏洞就是重入攻击漏洞。 2. 4. 安全建议 重入漏洞的原因无外乎第一是由于程序不够健壮。第二是 solidity 的 fallback 的机制。

    63030编辑于 2022-11-07
  • 来自专栏深入浅出区块链技术

    xSurge事件中的重入漏洞+套利的完美组合利用

    漏洞利用的代码是重入漏洞的典型代码,但利用过程却不是重入。应该是”最像重入漏洞的套利漏洞”。 随着 ERC20 合约的规范化,ERC20 的合约漏洞越来越少。 对这前两点进行分析说明 2.1 漏洞代码分析 漏洞代码链接如下: https://bscscan.com/address/0xe1e1aa58983f6b8ee8e4ecd206cea6578f036c21 5.总结 5.1 xSurge 漏洞是一个不完全的重入漏洞 再看下漏洞存在的 sell 方法中的关键代码,sell 方法有nonReentrant修饰符,存在对重入攻击的防范措施,所以在 sell 函数执行完之前 传统的重入攻击常见的场景是,合约 A 的 a 方法(a 方法调用了 call 方法,且 balance 的 sub 操作在 call 方法后)存在重入漏洞,在执行到漏洞点 call 函数时,攻击者的合约 而此次攻击中,xSurge 合约的 sell 方法(sell 方法中调用了 call 方法)中存在重入漏洞,在执行到漏洞点 call 函数时,攻击者的合约 B 得到回调函数 b 得到控制权,攻击者通过在

    1.4K50编辑于 2022-11-07
  • 来自专栏PPV课数据科学社区

    python多线程编程(4): 死锁和可重入

    resB Thread-3 got resB Thread-3 got resA Thread-5 got resA Thread-5 got resB Thread-5 got resB Thread-4重入锁 更简单的死锁情况是一个线程“迭代”请求同一个资源,直接就会造成死锁: import threading import time class MyThread(threading.Thread = MyThread() t.start() if __name__ == '__main__': test() 为了支持在同一线程中多次请求同一资源,python提供了“可重入锁 test() 执行结果: Thread-1 set num to 1 Thread-3 set num to 2 Thread-2 set num to 3 Thread-5 set num to 4 Thread-4 set num to 5

    1.1K130发布于 2018-04-23
  • 来自专栏java一日一条

    Java不可重入锁和可重入锁理解

    最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。 wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。 我们尝试设计一个不可重入锁: ? 使用该锁: ? 当前线程执行print()方法首先获取lock,接下来执行doAdd()方法就无法执行doAdd()中的逻辑,必须先释放锁。 这个例子很好的说明了不可重入锁。 可重入锁 接下来,我们设计一种可重入锁 ? 所谓可重入,意味着线程可以进入它已经拥有的锁的同步代码块儿。 可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样

    2.1K11发布于 2019-04-25
  • 来自专栏wannshan(javaer,RPC)

    ReentrantLock 重入锁,重入体会有多深?

    其实,如果不用锁上的条件 (newCondition()) ,也就不好体会重入

    67161发布于 2018-04-26
  • 来自专栏网络安全攻防

    重入攻击概述

    文章前言 以太坊智能合约中的函数通过private、internal、public、external等修饰词来限定合约内函数的作用域(内部调用或外部调用),而我们将要介绍的重入漏洞就存在于合约之间的交互过程 这样就能保证我们的fallback函数能被顺利执行,对应的,如果我们使用transfer和send函数来发送时,代码可用的gas仅有2300而已,这点gas可能仅仅只够捕获一个event,所以也将无法进行可重入攻击 我们需要在受攻击的合约里给我们的攻击合约地址增加一些balance以完成withdraw第一步的检查: contract.donate.sendTransaction("0xeE59e9DC270A52477d414f0613dAfa678Def4b02 防御措施 1、在可能的情况下,将ether发送给外部地址时使用solidity内置的transfer()函数,transfer()转账时只发送2300gas,不足以调用另一份合约(即重入发送合约),使用 _amount; } balances[msg.sender] -= _amount; reEntrancyMutex = false; } } 4

    39130发布于 2021-07-21
  • 来自专栏三太子敖丙

    重入

    Java中的重入锁 Java中的锁都来自与Lock接口,如下图中红框内的,就是重入锁。 ? 重入锁的实现原理 重入锁内部实现的主要类如下图: ? 重入锁的核心功能委托给内部类Sync实现,并且根据是否是公平锁有FairSync和NonfairSync两种实现。这是一种典型的策略模式。 也就是说,如果有1,2,3,4 这四个线程,按顺序,依次请求锁。那等锁可用的时候,谁会先拿到锁呢?在非公平情况下,答案是随机的。如下图所示,可能线程3先拿到锁。 ? 重入锁的使用示例 为了让大家更好的理解重入锁的使用方法。现在我们使用重入锁,实现一个简单的计数器。 默认情况下,重入锁是非公平的,公平的重入锁性能差于非公平锁 重入锁的内部实现是基于CAS操作的。

    65130发布于 2021-03-24
  • 来自专栏嵌入式智能硬件

    C语言可重入函数和不可重入函数

    这类函数我们称为不可重入函数。    所谓可重入是指一个可以被多个任务调用的过程,任务在 调用时不必担心数据是否会 出错。不可重入函数在实时系统设计中被视为不安全函数。 把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写他。 其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是可重入的。 第一,不要使用全局变量。 4) 与第三点一脉相承,printf()经常有重入和性能上的问题。如果你丢掉了第三和第四点,我不会太为难你的。不用说,如果你能得到后两点,那么你的被 雇用前景越来越光明了。 把一个不可重入函数变成可重入的唯一方法是用可重入规则来重写他。 其实很简单,只要遵守了几条很容易理解的规则,那么写出来的函数就是可重入的。 第一,不要使用全局变量。

    4K30发布于 2020-08-31
  • 来自专栏全栈程序员必看

    重入锁详解(什么是可重入

    重入锁详解 概述 什么是 “可重入”,可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。 例如 package com.test.reen; // 演示可重入锁是什么意思,可重入,就是可以重复获取相同的锁,synchronized和ReentrantLock都是可重入的 // 可重入降低了编程复杂性 package com.test.reen; import java.util.Random; import java.util.concurrent.locks.ReentrantLock; // 演示可重入锁是什么意思 } } finally { lock.unlock(); } } }).start(); } } 可以发现没发生死锁,可以多次获取相同的锁 可重入锁有

    1.3K30编辑于 2022-08-03
  • 来自专栏全栈程序员必看

    java可重入锁与不可重入

    所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是可重入锁。 关于父类和子类的锁的重入:子类覆写了父类的synchonized方法,然后调用父类中的方法,此时如果没有重入的锁,那么这段代码将产生死锁(很好理解吧)。 这个例子很好的说明了不可重入锁。 可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样。 synchronized和ReentrantLock 都是可重入锁。 摘自:JAVA可重入锁与不可重入锁 和 Java不可重入锁和可重入锁理解 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153277.html原文链接:https

    1.6K20编辑于 2022-09-13
  • 来自专栏全栈程序员必看

    重入锁和不可重入锁的区别

    不可重入锁示例(同一个线程不可以重入上锁后的代码段) 如下是一个不可重入锁的逻辑过程,会发现执行main方法控制台会打印执行doJob方法前,然后就会一直线程阻塞,不会打印执行doJob方法过程中,原因在于第一次上锁后 这种现象就造成了不可重入锁 public class Count{ MyLock lock = new MyLock(); public static void main(String (同一个线程可以重入上锁的代码段,不同的线程则需要进行阻塞) java的可重入锁有:ReentrantLock(显式的可重入锁)、synchronized(隐式的可重入锁) 可重入锁诞生的目的就是防止上面不可重入锁的那种情况 ,导致同一个线程不可重入上锁代码段。 设计可重入锁的示例代码 public class MyReentrantLock { boolean isLocked = false; // 默认没有上锁 Thread

    65910编辑于 2022-09-13
  • 来自专栏IT技术精选文摘

    重入

    如下图所示: 总结 可重入锁算是多线程的入门级别知识点,所以我把他当做多线程系列的第一章节,对于重入锁,我们需要特别知道几点: 对于同一个线程,重入锁允许你反复获得通一把锁 默认情况下,重入锁是非公平的,公平的重入锁性能差于非公平锁 重入锁的内部实现是基于CAS操作的。 重入锁的伴生对象Condition提供了await()和singal()的功能,可以用于线程间消息通信。

    89320编辑于 2022-02-17
  • 来自专栏网络安全攻防

    重入攻击概述

    文章前言 以太坊智能合约中的函数通过private、internal、public、external等修饰词来限定合约内函数的作用域(内部调用或外部调用),而我们将要介绍的重入漏洞就存在于合约之间的交互过程 我们需要在受攻击的合约里给我们的攻击合约地址增加一些balance以完成withdraw第一步的检查: contract.donate.sendTransaction("0xeE59e9DC270A52477d414f0613dAfa678Def4b02 sendTransaction跟web3标准下的用法是一样的,这时你再使用getbalance去看合约拥有的eth就会发现变成了2,说明它本来上面存了1个eth,然后我们返回攻击合约运行attack函数就可以完成攻击了: 4. ,最终导致Ethereum Classic(ETC)的分叉,有关The DAO漏洞的详细分析,可参考下面这篇文章: http://hackingdistributed.com/2016/06/18/analysis-of-the-dao-exploit / 4、OpenZeppelin官方库 https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security

    1.3K00发布于 2021-03-21
  • 来自专栏Java程序猿部落

    探索JAVA并发 - 可重入锁和不可重入

    { lock.lock(); this.count++; lock.unlock(); return count; } } 不可重入锁 } public synchronized void unlock(){ isLocked = false; notify(); } } 这其实是个不可重入锁 something lock.unlock(); } } 当调用print()方法时,获得了锁,这时就无法再调用doAdd()方法,这时必须先释放锁才能调用,所以称这种锁为不可重入锁 { isLocked = false; notify(); } } } } 相对来说,可重入就意味着 这就是可重入锁的特点。

    1K21发布于 2019-12-29
  • 来自专栏全栈程序员必看

    Java不可重入锁和可重入锁理解

    最近正在阅读Java ReentrantLock源码,始终对可重入和不可重入概念理解不透彻,进行学习后记录在这里。 wait():阻塞当前线程 notify():唤起被wait()阻塞的线程 不可重入锁 所谓不可重入锁,即若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞。 这个例子很好的说明了不可重入锁。 可重入锁 接下来,我们设计一种可重入锁 public class Lock{ boolean isLocked = false; Thread lockedBy = null; 可重入锁的概念和设计思想大体如此,Java中的可重入锁ReentrantLock设计思路也是这样 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153238.html

    83410编辑于 2022-09-07
  • 来自专栏一杯82年的JAVA

    探索JAVA并发 - 可重入锁和不可重入

    什么是可重入锁,什么是不可重入锁,它们是如何实现的? 定义 可重入锁:当线程获取某个锁后,还可以继续获取它,可以递归调用,而不会发生死锁; 不可重入锁:与可重入相反,获取锁后不能重复获取,否则会死锁(自己锁自己)。 不可重入锁 用代码说话。 基于 wait/notify 实现不可重入锁 import java.util.concurrent.locks.ReentrantLock; /** * 不可重入锁 */ public class 可重入锁 不可重入锁扩展一下,增加一个计数器,同一个线程每次获取锁计数器加1,释放锁减1,为0时释放锁。 getName() + " " + count); lock(count - 1); } } /* 输出: Thread-0 5 我是主线程,我也要来 Thread-0 4

    3.2K41发布于 2019-08-26
  • 来自专栏软件工程

    重入

    重入锁又称之为递归锁,两者一样 ReentrantLock/Synchronjzed就是典型的可重入锁 概念 : 可重入锁指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候 证明synchronized是可重入锁 demo1 证明ReentrantLock是可重入锁 demo2证明ReentrantLock也是可重入锁 可重入锁优点:可避免死锁(不会出现外方法进入后调用一个锁方法

    44120编辑于 2022-05-13
领券