异步任务中的重新进入(Reentrancy) 2017-12-05 14:10 一个按钮,点击执行一个任务。 ---- 重新进入(Reentrancy) private void Button_Click(object sender, RoutedEventArgs e) { DoSomething() 在异步任务结束之前重新进入此异步任务的过程,叫做重新进入(Reentrancy)。 重新进入的五种方式 微软在 Handling Reentrancy in Async Apps (C#) 一文中给出了重新进入的三种方式: 禁用“开始”按钮 取消和重启操作 运行多个操作并将输出排入队列 ---- 参考资料 Handling Reentrancy in Async Apps (C#) - Microsoft Docs 处理异步应用中的重新进入 (C#) - Microsoft Docs
controlled-library-call 高 1 & 2 2 unchecked-l1-handler-from 高 1 & 2 3 felt252-unsafe-arithmetic 中 1 & 2 4 reentrancy 中 1 & 2 5 read-only-reentrancy 中 1 & 2 6 unused-events 中 1 & 2 7 unused-return 中 1 & 2 8 unenforced-view 中 1 9 unused-arguments 低 1 & 2 10 reentrancy-benign 低 1 & 2 11 reentrancy-events 低 1 & 2 12 dead-code
一、重入攻击原理与威胁概述 1.1 重入攻击的基本原理 重入攻击(Reentrancy Attack)是智能合约中最危险的漏洞之一,其核心原理是利用合约在完成状态更新前进行外部调用的时间窗口发起攻击。 1.3 重入攻击的类型与变种 随着合约开发技术的进步,重入攻击也演变出多种类型和变种: 单函数重入(Single-function Reentrancy): 最简单的形式,攻击者重复调用同一个函数 通常发生在提款和转账函数中 跨函数重入(Cross-function Reentrancy): 攻击者利用一个函数的外部调用去重入另一个函数 更难检测,因为漏洞涉及多个函数间的交互 跨合约重入 (Cross-contract Reentrancy): 攻击者利用多个相互调用的合约链进行攻击 常见于复杂的DeFi协议组合使用场景 闪电贷重入(Flash Loan Reentrancy): 结合闪电贷放大攻击效果 可以在单个交易中提取大量资金 预言机重入(Oracle Reentrancy): 针对依赖预言机的合约,通过操纵预言机更新过程进行攻击 影响价格相关的金融合约 二、重入攻击防御基础机制
doSomething()"));二、外部调用的典型风险风险类型 描述 重入攻击 Reentrancy reentryCount++; if (reentryCount < 3) { vault.withdraw(); } }}重入攻击测试:test/Reentrancy.t.sol attacker).balance, 1 ether, "Attacker profit expected"); }}执行结果: $ forge test --match-path test/Reentrancy.t.sol -vvv[⠊] Compiling...No files changed, compilation skippedRan 1 test for test/Reentrancy.t.sol:ReentrancyTest 0 tests passed, 1 failed, 0 skipped (1 total tests)Failing tests:Encountered 1 failing test in test/Reentrancy.t.sol
_data ); // Send calldata into L2 // slither-disable-next-line reentrancy-events sendCrossDomainMessage(l2TokenBridge, _l2Gas, message); // slither-disable-next-line reentrancy-events IL2StandardERC20(_l2Token).mint(_to, _amount); // slither-disable-next-line reentrancy-events , _timestamp, _blockNumber ); // slither-disable-next-line reentrancy-no-eth , reentrancy-events batchesRef.push(batchHeaderHash, latestBatchContext); } } batchesRef是一个用于数据存储的辅助合约
filter-check-suicidal] [--filter-check-upgradeable] [--filter-check-erc20] [--filter-check-erc721] [--filter-check-reentrancy ] [--check-all] [--check-suicidal] [--check-upgradeable] [--check-erc20] [--check-erc721] [--check-reentrancy report-check-suicidal] [--report-check-upgradeable] [--report-check-erc20] [--report-check-erc721] [--report-check-reentrancy report-all] [--report-suicidal] [--report-upgradeable] [--report-erc20] [--report-erc721] [--report-reentrancy
* * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After
Reentrancy? 重入 当一个线程去请求一个被其他线程hold住的锁,那么这个请求将会block,将会阻塞。 Reentrancy意味着这个锁的获取是面向线程的,而不是基于每次调用的。Reentrancy(重入)有一种实现方式就是,为每个锁关联一个计数器和一个所有者线程。 Reentrancy(重入)机制进一步封装了锁的内部行为,这样让我们开发面向对象的并发代码的时候就更容易了。
* * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After
method2"); } public static void main(String[] args) throws InterruptedException { Reentrancy reentrancy = new Reentrancy(); // 方法体执行对象 Runnable run = ()-> { reentrancy.method1
以下是一些常见的智能合约安全问题和防范措施:重入攻击 (Reentrancy Attack): 这是最常见的智能合约漏洞之一。攻击者利用合约中的回调函数,在合约完成操作之前重复调用自身,从而窃取资金。 使用互斥锁 (Mutex) 或重入保护库 (Reentrancy Guard) 来防止重复调用。 使用 Pull over Push 模式,即让用户主动提取资金,而不是合约主动发送资金。
Dario接下来介绍了Actor reentrancy。 即当Actor进入await状态,有其他Actor进行操作时,Actor reentrancy可以防止死锁,并保证后续的运行内容,但是需要用户自己考虑在await状态时,可能发生的情况并进行排除和避免。
重入攻击(Reentrancy)历史案例2016 年 The DAO 攻击:利用重入漏洞,攻击者反复提取资金,造成 6000 万美元 损失,直接导致以太坊社区分叉出 ETH 与 ETC。 总结Reentrancy:调用外部合约前要更新状态,必要时使用 ReentrancyGuard。Front-running:交易顺序是透明的,敏感逻辑要用 Commit-Reveal 或批量结算。
以下是一些常见的智能合约安全问题和防范措施:重入攻击 (Reentrancy Attack): 这是最常见的智能合约漏洞之一。攻击者利用合约中的外部调用,在合约完成操作之前重复调用自身,从而窃取资金。 使用互斥锁(Mutex)或重入保护库(Reentrancy Guard):防止函数在执行过程中被重复调用。
重入(reentrancy)这个词就来自外部恶意合约在有漏洞的合约调用函数,并且重新执行代码路径。 balances[msg.sender] -= _weiToWithdraw; lastWithdrawTime[msg.sender] = now; // set the reEntrancy
9.源代码(2011) 概念:多线程重进入(Reentrancy)机制 我很好奇这些源代码是在什么上运行的。如果关闭电源,那另外一个世界就会消失? ? 10.恐怖游轮(2009) 概念:死循环 ?
第二章:智能合约常见漏洞分析 2.1 重入攻击(Reentrancy) 重入攻击是DeFi协议中最常见且危害最大的漏洞之一。 // 验证总供应量保持不变 assert totalSupply() == totalSupplyBefore, "转账应保持总供应量不变"; } // 验证没有重入攻击 rule no_reentrancy_in_withdraw analyze contract.sol --solc-json mythril.config.json # 检查特定漏洞(如重入) myth analyze contract.sol --detect reentrancy solc_version": "0.8.17", "solc_args": "--optimize", "execution_timeout": 300, "modules": { "reentrancy # 启用特定检测器 slither contract.sol --detect reentrancy-eth,reentrancy-no-eth # 生成JSON报告 slither contract.sol
tabletInfo.DeviceType = (TabletDeviceType)(deviceType -1); // // REENTRANCY NOTE: Let a PenThread do this work to avoid reentrancy! from the UI thread, // COM will set up message pumping which will cause reentrancy
重入漏洞(Reentrancy) • 问题描述 合约通常用来处理 Ether,因此通常会将 Ether 发送给各种外部用户地址。调用外部合约或将以太网发送到地址的操作需要合约提交外部调用。 详细分析 1、假设普通用户向原合约(Reentrancy.sol)存入15 ether; 2、攻击者部署攻击合约(POC.sol),并调用setInstance()指向原合约部署地址; 3、攻击者调用攻击合约的
安全性:重入攻击(Reentrancy Attack): 这是最常见的智能合约漏洞之一。攻击者利用合约中的回调用,在合约更新状态之前重复调用自身函数,从而窃取资金。