逻辑陷阱型蜜罐合约

news2024/9/24 7:17:38

a3103c105052e5b71b9ffb608345d797.jpeg

蜜罐是传统安全领域中的一个概念,通常指安全人员设置一些陷阱(比较明显的漏洞),让攻击者自己掉入我们设置好的陷阱中,以便安全人员分析攻击者的作恶手法。

蜜罐合约(HoneyPots Contract)也是类似的概念,但对象变了,一般指合约开发者设置了看似容易获利的合约逻辑,但其实是陷阱,普通用户观察合约,发现有利可图,便与蜜罐合约交互,结果发现交互的资产无法被自己提出。

蜜罐合约在中文圈子有时也称为貔貅合约,本文将简单讨论一下,我看见的几种逻辑陷阱型蜜罐合约。

逻辑陷阱蜜罐合约

比较多项目会在transfer函数(转账相关)中实现一些业务逻辑,蜜罐合约可能在transfer函数中加入一些强行限制用户交易的逻辑,从而实现截取用户资产的效果。

这类合约,我称为逻辑陷阱型蜜罐合约,是比较好识别的一类,主要关注其交易相关的逻辑在合约实现上是否透明以及是否有限制则可,这里介绍三个逻辑陷阱型蜜罐合约:

  • 黑名单蜜罐合约

  • 可变合约构成的蜜罐合约

  • 限时限卖的蜜罐合约

黑名单蜜罐合约

我们看到BSC上一个叫Moco合约:https://bscscan.com/address/0x9d4bDdd642529a588f910Aad405C07e066A908Cf#code

Moco合约继承了ERC20,即是一个代币合约,看到合约中的_transfer函数,部分代码如下:

function _transfer(address sender, address recipient, uint256 amount) private returns (bool) {

    require(sender != address(0), "ERC20: transfer from the zero address");
    require(recipient != address(0), "ERC20: transfer to the zero address");
    require(!_isbclisted[recipient] && !_isbclisted[sender], "bclisted address");

    // ...

在用户进行交易时,会调用_transfer函数,它有3个require做条件判断,主要看到第三个,判断sender与recipient都不在黑名单内,才能进行交易。

根据_isbclisted进行搜索,可以发现addBot函数实现了将用户地址加入黑名单的操作。

function addBot(address recipient) internal {
      if (!_isbclisted[recipient]) _isbclisted[recipient] = true;
  }

那什么地方调用了addBot函数呢?搜索一下,发现还是在_transfer函数中,相关代码如下:

if(sender == uniswapPair) {
    if (block.number <= launchedBlock + killblock) {                  
        addBot(recipient);
    }
}

如果当前区块数小于launchedBlock + killblock,那么当前recipient会被加入黑名单,而launchedBlock与killblock这两个变量是被合约创建者控制的。

简而言之,合约创建者可以通过对launchedBlock与killblock的控制,将部分区块中发生交易的recipient地址加入黑名单,这样recipient后续就无法从Moco中转出代币了。

这便是典型的黑名单蜜罐,通常出现在土狗项目中,用于杀抢土狗机器人的。

很多土狗项目上线时,会进行拉盘操作,对普通用户而言,会发现土狗项目涨的很快,从而被利润吸引,参与到土狗的交互中,部分开发者也会发现这个土狗项目早期拉盘的特点,就开发了机器人,在开盘后立刻买入,然后等土狗项目方拉盘时,快速卖出,从而获得稳定的利润。

随后,项目方很快也发现土狗机器人的存在,这便进入了一个对抗过程,比如当前这种黑名单逻辑,因为土狗机器人交易速度很快,会抢到比较前的区块完成买入交易,一个土狗项目开盘后,可能会涌入大量机器人交易,通过黑名单的逻辑,就可以将机器人地址加入黑名单,直接让机器人损失本金。

可变合约制造蜜罐

我们看到BSC上,一个名叫SpaceXOver的合约:https://bscscan.com/address/0x60899ea0c86048eb5d8a7a2cf395c7cc58a9023a#code

先看transfer函数,代码如下:

function transfer(address to, uint256 amount) public returns (bool) {
    Acc(Acc_address).acc_Transfer(msg.sender, to, amount);
    emit Transfer(msg.sender, to, amount);
    return true;
}

transfer函数中,真正进行转账交易的逻辑没有在当前合约实现,而是通过Acc合约中的acc_transfer去做的,有猫腻。

翻看一下当前合约,发现Acc合约是在部署时设置了该合约的地址,即当前合约没有Acc合约的逻辑,相关代码如下:

constructor(address _acc) public {
      totalSupply_ = 8000000*10**18;
      deployer = msg.sender;
      // 设置 Acc 合约地址
      Acc_address = _acc;
      Acc(Acc_address).acc_setup(address(this), totalSupply_);
  }

我们可以通过解析input data的形式,来获得部署SpaceXOver合约时,Acc合约的具体地址。

先尝试用bscscan提供的Decode Input Data

515fb0a13072e318a6b5fb4c91b2d6b0.png

发现解析不出来,这里吐槽一下,感觉很多合约的input data都无法通过这种方式解析,不知道为何不去优化一下,对于开源合约,获得abi后,input data还是很好解析的。

这里,我们使用web3-input-decoder这个库来解析一下,先安装一下。

pip install web3-input-decoder

然后保存一下SpaceXOver合约的ABI用于解析input data,相关代码如下:

import json
from web3_input_decoder import decode_constructor, decode_function

# SpaceXOver的ABI JSON
p = '1.json'
with open(p, 'r', encoding='UTF-8') as f:
    abi = f.read() 

abiJson = json.loads(abi)

result = decode_constructor(abiJson, "0x6080604...(input data复制过来则可)")

print(result)

结果如下:

0e62d9a485dfe729d3306613bd208244.png

访问acc合约地址,发现这个地址下的合约是闭源的,无法看到合约代码,猫腻很大,因为我们不知道其交易时的具体逻辑是怎么样的,很有可能就是一个蜜罐合约,只可进,不可出。

限时限卖的蜜罐合约

我们看到BSC上名叫SW的合约:https://bscscan.com/address/0xa7d0741813d2ff189b172f68c1ce3f0aa101bd22#code

SW合约的中定义了多个mapping(address => uint256)类型的变量,通过这些变量来记录转账的值。

看到_transfer函数,有限制交易时间与限制交易金额比例的逻辑,相关代码如下:

// 限制交易时间
if(block.timestamp<_limitTime){
    dayBuy[to]=dayBuy[to].add(amount);
    require(dayBuy[to]<=300*10**18 ,"limit time max 300");
}
require(_isTrade ,"limit trade2 ");
// 限制交易金额比例,最多只能交易 90% 的金额
require(balanceOf(from).mul(90).div(100)>amount,"selle max 90%");
takeFee = true;

结尾

除了逻辑陷阱型蜜罐,还有其他类型的蜜罐合约,阅读【The Art of The Scam: Demystifying Honeypots in Ethereum Smart Contracts】论文可知还有如下几种类型的蜜罐合约:

级别技巧
Ethereum Virtual Machine(以太坊虚拟机级别)Balance Disorder(平衡紊乱)
Solidity编译器级别Inheritance Disorder(继承障碍)
Skip Empty String Literal(跳过空字符串字面值)
Type Deduction Overflow(类别除法溢出)
Uninitialised Struct(未初始化结构)
以太扫描区块链探索器(Etherscan)Hidden State Update(隐藏状态更新)
Hidden Transfer(隐藏交易)
Straw Man Contract(稻草人合同)

因为论文中讨论的比较细致且我自身没有进行复现验证,所以本文就不多讨论。

值得一提的是Skip Empty String Literal与Type Deduction Overflow已在高版本的Solidity中fix了,如果你用0.8.0以上版本的Solidity不会有这两个问题,其他的,需要自行验证一下。

相关参考:

  • 【米斯特姚】的Youtube频道(https://www.youtube.com/watch?v=SAzZ61cvvn8)

  • 【The Art of The Scam: Demystifying Honeypots in Ethereum Smart Contracts】论文(https://www.arxiv-vanity.com/papers/1902.06976/)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pandarallel 是一个简单而有效的工具,可以在所有可用的 CPUs 上并行执行 pandas 操作

文章目录 一、简介二、特点三、用户指南CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、简介 官方文档地址:https://nalepae.github.io/pandarallel/ Github 链接:https://github.com/nalepae/pandarallel pandarallel 是一个简单而有效的工具,可以在所有可用的 CPU…

06 |「栈和队列」简析

前言 前言&#xff1a;研究一个数据结构的时候&#xff0c;首先讲的是增删改查。 文章目录前言一、简介1. 结构2. 特点3. 存储二、栈1. 类比举例2. 操作3. 实现1&#xff09;顺序栈&#xff08;常用&#xff09;a. 核心b. 要素c. 入栈d. 出栈2&#xff09;链式栈三、队列1. 类比…

【手写 Vue2.x 源码】第四十篇 - 组件部分 - 组件的生命周期

一&#xff0c;前言 上篇&#xff0c;介绍了组件部分-组件的编译&#xff0c;主要涉及以下几部分&#xff1a; 组件编译流程介绍&#xff1a;html->render->vnode创建组件虚拟节点&#xff1a;createComponent 本篇&#xff0c;组件部分-组件的生命周期&#xff1b; 二…

logstash + logback实现分布式日志采集

&#x1f60a; 作者&#xff1a; 一恍过去&#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390&#x1f38a; 社区&#xff1a; Java技术栈交流&#x1f389; 主题&#xff1a; logstash logback实现分布式日志采集⏱️ 创作时间&#xff1a; 2023年1…

Logback基本使用

文章目录Logback的使用1. logback入门2. logback 配置3. logback-access的使用Logback的使用 Logback是由log4j创始人设计的另一个开源日志组件&#xff0c;性能比log4j要好官方网站&#xff1a;https://logback.qos.ch/index.htmlLogback主要分为三个模块&#xff1a; logbac…

基于高通平台的dToF Sensor开机点亮教程

作为一个优秀的驱动工程师,迅速点亮目前市面上的Soc平台是非常必须的。如果你花费了很多时间无法Set up起平台,那你这驱动开发可能还有待提升,特别如今这市场,想要更高更强,驱动开发变得吃香了。一般圈子里的朋友,驱动开发都是大杀四方,比如高通平台,全志平台,MTK平台…

【Python】司徒卢威函数

文章目录简介图像其他相关函数简介 最开始看到这个名字&#xff0c;我也很激动&#xff0c;终于有个中文姓氏的数学公式了&#xff0c;然鹅司徒卢威是个俄国人&#xff0c;而且司徒卢威完全是音译&#xff0c;就离谱。 司徒卢威函数是下面的非齐次贝赛尔方程的一组解&#xf…

2022年,经历了两段实习后,我学会了……

前言&#xff1a; 大家好&#xff0c;我是小威。借着csdn的这个活动&#xff0c;我也来对自己的2022做一个回顾&#xff0c;同时对2023做一个合理的规划&#xff0c;希望我的经历也能对诸佬们带来绵薄之力。 感谢诸位大佬对小威这年的支持&#xff0c;祝诸佬们新年快乐哟~&…

Unix\Linux多线程复健

线程是程序中完成一个独立任务的完整执行序列(是一个可调度的实体) 一个进程可以包含多个线程 查看指定进程的线程号&#xff1a; ps -Lf pid 进程是CPU分配资源的最小单位&#xff0c;线程是操作系统调度执行的最小单位 分类&#xff1a; 内核线程&#xff1a;切换由内核控制&…

代码随想录--字符串习题总结

代码随想录–字符串习题总结 1.LeetCode344 反转字符串 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&…

Spring AOP 详解

Spring AOP 详解一、什么是 Spring AOP二、为何要用 AOP三、Spring AOP3.1 AOP 组成3.1.1 切面 (Aspect)3.1.2 连接点 (Join Point)3.1.3 切点 (Pointcut)3.1.4 通知 / 增强方法 (Advice)3.1.5 小结3.2 Spring AOP 使用3.2.1 添加 AOP 框架支持3.2.2 定义切面和切点3.2.3 定义相…

Python---字典相关知识

专栏&#xff1a;python 个人主页&#xff1a;HaiFan. 专栏简介&#xff1a;本专栏主要更新一些python的基础知识&#xff0c;也会实现一些小游戏和通讯录&#xff0c;学时管理系统之类的&#xff0c;有兴趣的朋友可以关注一下。 字典思维导图字典是什么创建字典查找键key字典的…

十分钟入门Zigbee

大部分教程通常都是已Zigbee原理开始讲解和学习&#xff0c;各种概念让初学者难以理解。本教程从一个小白的角度出发&#xff0c;入门无需任何Zigbee底层原理知识&#xff0c;只需要基本的MCU研发经验就可以掌握&#xff0c;让您快速实现zigbee组网和节点之间通信。 本教程采用…

JDBC快速入门,如何使用JDBC操作数据库?

文章目录1. 前言2. JDBC 概述2.1 概念2.2 优点3. JDBC 快速入门Java编程基础教程系列1. 前言 在 Java 开发中&#xff0c;使用 Java 语言操作数据库是非常重要的一部分&#xff0c;那么 Java 语言是如何操作数据库的呢&#xff1f;我们需要使用不同厂商的数据库时&#xff0c;…

23种设计模式(二十二)——访问者模式【行为变化】

文章目录 意图什么时候使用访问者真实世界类比访问者模式的实现访问者模式的优缺点亦称:Visitor 意图 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于其内部各个元素的新操作。 什么时候使用访问者 1、如果你需要对一个复杂对象…

Redis脑裂为何会导致数据丢失?

1 案例 主从集群有1个主库、5个从库和3个哨兵实例&#xff0c;突然发现客户端发送的一些数据丢了&#xff0c;直接影响业务层数据可靠性。 最终排查发现是主从集群中的脑裂问题导致&#xff1a;主从集群中&#xff0c;同时有两个主节点都能接收写请求。 影响 客户端不知道应…

Python数模笔记-模拟退火算法(5)求解旅行商问题的联合算子模拟退火算法

Python数模笔记—求解旅行商问题的联合算子模拟退火算法&#xff08;完整例程&#xff09; 文章目录Python数模笔记—求解旅行商问题的联合算子模拟退火算法&#xff08;完整例程&#xff09;0 摘要1 引言2 模拟退火算法求解旅行商问题2.1 模拟退火算法2.2 多个新解的竞争机制2…

详解P431 塔防

题目说明gsy 最近在玩一个塔防游戏&#xff0c;但是这次她控制的是迷宫中的怪兽而非防御塔建造者游戏的地图是一个 n * m 的矩阵&#xff0c;起点在 (1,1) &#xff0c;终点在 (n,m) &#xff0c;gsy 每次可以选择上下左右四个方向移动 1 步这个地图上有很多的防御塔&#xff0…

“华为杯”研究生数学建模竞赛2005年-【华为杯】B题:空中加油问题的讨论(附获奖论文及C++代码)

赛题描述 对飞行中的飞机进行空中加油,可以大大提高飞机的直航能力。为了简化问题,便于讨论,我们作如下假设。 少辅机架数两种情况给出你的作战方案。 论文 一. 问题重述 空中加油技术可以大大提高飞机的直航能力。作战飞机称为主机,加油机称 为辅机。已知:( 1 )主…

[创业之路-50] :动态股权机制 -5- 创业公司股权分配常见的坑

1、 分工不清晰&#xff0c;决策不清晰&#xff0c;理念不一致分工必须要简单明晰初创公司的合伙人一般是三到五个&#xff0c;最合理的架构一开始最好是三个人&#xff0c;相互之间需要一段时间的磨合&#xff0c;了解清楚各自的特长&#xff0c;工作经历等等&#xff0c;不要…