创宇区块链|Creat future 惨遭随意转移币,幕后黑手究竟是谁?

2023-12-14 21:32

本文主要是介绍创宇区块链|Creat future 惨遭随意转移币,幕后黑手究竟是谁?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

CF 代币合约被发现存在漏洞,它允许任何人转移他人的 CF 余额。到目前为止,损失约为 190 万美元,而 pancakeswap上CF/USDT 交易对已经受到影响。

知道创宇区块链安全实验室 第一时间对本次事件深入跟踪并进行分析。

事件详情

受影响的合约地址 https://bscscan.com/address/0x8B7218CF6Ac641382D7C723dE8aA173e98a80196#code ,问题函数出在第563行:

function _transfer(address from, address to,uint256 amount) public {require(from != address(0), "ERC20: transfer from the zero address");require(amount > 0, "Transfer amount must be greater than zero");if(useWhiteListSwith){require(msgSenderWhiteList[msg.sender] && fromWhiteList[from]  && toWhiteList[to], "Transfer not allowed");}uint256 fee = 0;...uint acceptAmount = amount - fee;_tOwned[from] = _tOwned[from].sub(amount);_tOwned[to] = _tOwned[to].add(acceptAmount);emit Transfer(from, to, acceptAmount);
}

_transfer() 函数是直接转移代币 transfer() 和 授权转移代币 transferFrom() 的具体实现,但该函数的修饰器是 public,因此任何人都可以不通过 transfer() 或 transferFrom() 函数直接调用它。

而当变量 useWhiteListSwith 设置为 False 时,该函数不会检查调用地址和传输地址是否合规,直接将代币转移到指定地址。

在区块高度为 16841993 时,管理员就把 useWhiteListSwith 设置为 False :
_transfer() 函数是直接转移代币 transfer() 和 授权转移代币 transferFrom() 的具体实现,但该函数的修饰器是 public,因此任何人都可以不通过 transfer() 或 transferFrom() 函数直接调用它。

而当变量 useWhiteListSwith 设置为 False 时,该函数不会检查调用地址和传输地址是否合规,直接将代币转移到指定地址。

在区块高度为 16841993 时,管理员就把 useWhiteListSwith 设置为 False :
在这里插入图片描述
此时开始有攻击者利用 _transfer() 函数直接转移代币:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

经过完整分析,知道创宇区块链安全实验室明确了该次事件的源头由函数本身权限出现问题,而管理员同时操作不慎关闭了白名单检测,两方结合导致攻击者可以实现转移任意钱包代币的操作。

在核心函数上我们一直建议使用最小权限原则,像这次的 _transfer() 函数本不该用public修饰器,使得 transferFrom() 函数检查授权额度的功能形同虚设;而合约管理者也不该随意修改关键变量值,导致攻击者可以绕过白名单检查的最后一道防线。

合约不仅仅是代码层面的安全,不光需要白盒代码审计,更需要合约管理员共同合理维护。

这篇关于创宇区块链|Creat future 惨遭随意转移币,幕后黑手究竟是谁?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/493944

相关文章

Callable 和Future

在Java5之前,线程是没有返回值的,常常为了“有”返回值,破费周折,而且代码很不好写。或者干脆绕过这道坎,走别的路了。 现在Java终于有可返回值的任务(也可以叫做线程)了。  可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口。 执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callabl

Callable及Future

1.Runnable Runnable是个接口,使用很简单: 1. 实现该接口并重写run方法 2. 利用该类的对象创建线程 3. 线程启动时就会自动调用该对象的run方法 通常在开发中结合ExecutorService使用,将任务的提交与任务的执行解耦开,同时也能更好地利用Executor提供的各种特性 ExecutorService executor

Rust:Future、async 异步代码机制示例与分析

0. 异步、并发、并行、进程、协程概念梳理 Rust 的异步机制不是多线程或多进程,而是基于协程(或称为轻量级线程、微线程)的模型,这些协程可以在单个线程内并发执行。这种模型允许在单个线程中通过非阻塞的方式处理多个任务,从而实现高效的并发。 关于“并发”和“并行”的区别,这是两个经常被提及但含义不同的概念: 并发(Concurrency):指的是同时处理多个任务的能力,这些任务可能在同一时

【区块链】区块链架构设计:从原理到实践

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 区块链架构设计:从原理到实践引言一、区块链基础概念1.1 区块链定义1.2 核心特性 二、区块链架构层次2.1 数据层2.2 网络层2.3 共识层2.4 合约层2.5 应用层 三、关键技术组件3.1

区块链会议投稿资讯CCF A--WINE 2024 截止7.15 附录用率 附录用的区块链文章

Conference:The Conference on Web and Internet Economics (WINE) CCF level:CCF A Categories:Cross-cutting/comprehensive/emerging Year:2024 Conference time: December 2-5, 2024 录用率: selected 66 p

【Rust日报】 2019-05-28:使用WASI对区块链进行通用计算

「嵌入式」Hawk-Rust系列:树莓派相机的驱动 #RaspberryPi Raspberry Pi提供了一组GPIO(通用输入/输出)引脚,允许您控制用于物理计算的电子组件并探索物联网(IoT)。 相机模块是Raspberry Pi的绝佳配件,它允许用户拍摄静态照片并以全高清录制视频。 HAWK是一个基于Rust的图像识别项目,它通过使用RFID卡进行用户识别和Image进行用户验证来实

【Rust 日报】2020-11-04 bacon: 幕后代码检查工具

async-std v1.7.0 发布 增加了 tokio-03 的 flag , 可以很好地适配 Tokio 0.3 的 runtime。更新了一些依赖 https://github.com/async-rs/async-std/releases/tag/v1.7.0 bevy_tilemap:基于块的地形构造工具(tilemap) 用于游戏引擎 Bevy 中,支持多线程块,泛型 traits

转移到java下工作

有人转移到Python下工作 有人转移到java下工作

区块链媒体发布推广秘籍大揭秘-华媒舍

区块链技术迅猛发展,成为全球瞩目的热门领域。随之而来的是区块链媒体的兴起,成为传播和推广区块链知识、项目和应用的重要平台。本文将揭示区块链媒体发布推广的秘籍,为读者深入了解该领域提供详尽科普介绍。 一、什么是区块链媒体? 区块链媒体是指专门报道和宣传区块链技术的媒体平台。它们通过新闻报道、文章、专题访谈、社群互动等形式,向读者传递与区块链相关的信息。与传统媒体相比,区块链媒体更加专注于区块

区块链技术:金融市场监管的新篇章

一、引言         随着金融科技的迅猛发展,区块链技术作为其中的佼佼者,正逐渐改变着金融市场的格局。在金融市场监管领域,区块链技术以其独特的优势,为监管机构提供了新的监管思路和手段。本文将深入探讨区块链技术在金融市场监管中的作用,并分析其面临的挑战与前景。 二、区块链技术的特点及其在金融市场的应用         区块链技术以其去中心化、不可篡改、透明公开等特性,在金融市场中得到了