深入分析EVM合约分类背后的风险

互联网 阅读 1009 2023-06-04 21:17:00

在智能合约领域,"以太坊虚拟机 EVM" 以及其算法和数据结构就是第一性原理。

本文从合约为什么要分类出发,结合每个场景可能面对怎样的恶意攻击,最终给出一套达成相对安全的合约分类分析算法。虽然技术含量较高,但亦可作为杂谈读物,一览去中心化系统间博弈的黑暗森林。

1、合约为什么要分类?

因为太重要了,可谓是交易所、钱包、区块链浏览器、数据分析平台等等Dapp的基石!一笔交易之所以是ERC20转账,是因为他的行为符合ERC20标准,至少得有:

  1. 交易的状态是成功
  2. To地址为某个符合ERC20标准的合约
  3. 调用了Transfer函数,其特点是该交易CallData的前4位为0xa9059cbb
  4. 执行后,在该To地址上发出了transfer的事件

分类有误则交易行为会误判

以交易行为为基石,则To地址能否被准确分类则对其CallData的判断会有截然不然的结论。对Dapp而言,链上链下的信息沟通高度依赖于交易事件的监听,而同样的事件编码也只有在符合标准的合约中发出,才具有可信度。

分类有误则交易会误入黑洞

如果用户进行一笔Token转移,转入到某个合约中,如果该合约没有预设Token转出的函数方法,则资金会雷同于Burn一样被锁定,无法控制且如今大量项目开始增加内置的钱包支持,要为用户管理钱包也就不可避免的,需要时刻从链上实时分类出最新部署的合约,是否能够吻合资产标准。

拓展阅读第1段:【合约解读】CryptoPunk 世界上最早的去中心化NFT交易市场

2、分类会有怎样的风险?

链上是一个没有身份没有法治的地方,你无法制止一笔正常的交易,哪怕他是恶意的。他可以是冒充外婆的狼,做出多数符合你预期的外婆行为,但目的是进屋抢劫。声明标准,但可能实质不符合常见的分类方式是直接采用EIP-165标准,读取该地址是否支持ERC20等,当然,这是一个高效率的方法,但是毕竟合约是对方控制,所以终究是可以伪造出一份申明。165标准的查询,只是在链上有限的操作码中,用最低成本去防止资金转入黑洞的方法。这也是为什么我们之前分析NFT的时候,特地提及标准中会有一类SafeTransferFrom的方法,其中Safe就是指代了采用165标准判断出对方声明自己具备了NFT的转移能力。拓展阅读 第2.2段:【源码解读】你买的NFT到底是什么?唯有从合约字节码出发,做源码层面的静态分析,从合约预期的行为出发才有更精准的可能性。

3、合约分类方案设计

接下来咱们将系统的分析整体方案,注意我们的目的是“精度”和“效率”两项核心指标。要知道即使方向是对的,但要抵达大洋的彼岸路途也并不明朗,要做字节码分析的第一站是获取代码

3.1、如何获取到代码?

从上链后的角度讲有getCode,一个RPC方法,可以从链上指定的地址里获取到字节码,单论读取的话这是非常快捷的,因为从EVM的账号结构中就把codeHash放在最顶端的位置。

合约但是这个方法等于是单独对某个地址做获取,想要进一步提升精度和效率呢?如果是部署合约的交易,如何在其刚执行完甚至他还在内存池中便获取部署的代码?如果该笔交易是合约工厂的模式,则交易的Calldata里是否存在源码呢?最后的我的方式是,是分类进行一种类似筛子的模式

  1. 对于非合约部署的交易,则直接用getCode获取其中涉及的地址进行分类,
  2. 对于最新内存池的交易,筛选出to地址为空的交易,其CallData则是带有构造函数的源代码
  3. 对于合约工厂模式的交易,由于其中可能是合约部署出的合约再循环调用其他合约来执行部署,则递归的去分析该笔交易的子交易,记录每个type 为CREATE或者为CREATE2的Call。

我做了个demo实现的时候,发现还好现在rpc的版本比较高,因为整个过程最难的便是执行3的时候,如何递归找到指定type的call,最底层的方式是通过opcode还原上下文,我吃了一惊!还好现在的geth版本里有debug_traceTransaction方法,他可以帮助解决在通过opcode操作码中梳理每一个call的上下文信息,整理出核心的字段。最终可以对多种部署模式的(直接部署,工厂模式单部署,工厂模式批量部署)的原始字节码都获取到。

3.2、如何从代码分类?

最最简单但不安全的方式,是把code直接做字符串匹配,以ERC20为例符合标准的函数则有

合约

在函数名之后的,则是该函数的函数签名,之前在分析的时候提及,交易都是依赖匹配callData的前4位找到目标函数的,拓展阅读:所以合约字节码里必然存储有这6个函数的签名。当然,这种方法非常快捷6个都查到就完事的,但不安全的因素则是,如果我采用solidity合约中,单独设计一个变量,存储值为0x18160ddd那么他也会将认为我有了这个函数。

3.3、准确率提升1-反编译

那进一步的准确方法则是做Opcode的反编译!反编译则是将获取到的字节码转到操作码的过程,更高级的反编译则是再转成伪代码,更利于人的阅读,这次我们用不上,反编译的方法列于文末的附录中。

solidity(高级语言)->bytecode(字节码)->opcode(操作码)我们就可以清晰的发现一个特征,函数签名都会被PUSH4这个操作码所执行,所以进一步的方法则是从全文中提取PUSH4后的内容,与函数标准做匹配。

合约我也简单做了下性能实验,不得不说Go语言的效率很强大,1W次反编译只需要220ms。接下来的内容会有一定难度

3.4、准确率提升2-找代码块

上文中准确率有所提升但还不够,因为是全文搜索PUSH4的,因为我们仍然可以构建一个变量,是byte4的类型,这样一来也会触发PUSH4的指令。在我苦恼的时候,想到一些开源项目的实现,ETL是一个读取链上数据做分析的工具,其中会解析出ERC20、721的转移单独成表,所以必然具备分类合约的能力。

合约分析下来,可以发现他是基于代码块的分类,只处理第一个basic_blocks[0]里的push4指令

那问题来到了,如何准确判断代码块了

代码块的概念源于REVERT + JUMPDEST这2个连续的操作码,这里必然需要连续的2个,因为在整个函数选取器的opcode区间里,如果函数数量过多,则会出现翻页的逻辑,那也会出现JUMPDEST这个指令。

合约3.5、准确率提升3-找函数选择器

函数选择器的作用是,读取该笔交易的Calldata的前4位字节,并与代码中预设有的合约函数签名进行匹配,协助指令跳转到存储了该函数方法指定的内存位置让我们尝试一个最小的模拟执行这部分是两个函数的选择器store(uint 256)retrieve(),可算出签名是2e64cec1,6057361d

60003560e01c80632e64cec11461003b5780636057361d1461005957进行反编译后,则会得到如下的操作码串,可以说分两个部分第一部分:在编译器中在合约中仅函数选择器部分会去获取到callData的内容,寓意是获取其CallData的函数调用签名,注释如下图。

合约

我们可以通过模拟EVM的内存池变化来看看效果

合约第二部分:判断是否与选择器的值匹配的过程1、‍将retrieve()的4字节函数签名(0x2e64cec1)传入stack上,2、EQ操作码从stack区弹出2个变量,即0x2e64cec1和0x6057361d,并检查它们是否相等3、PUSH2将2个字节的数据(这里为0x003b,十进制为59)传入stack,stack区有一个叫做程序计数器的东西,它规定了下一个执行命令在字节码中的位置。这里我们设置59,因为那是retrieve()字节码的起始位置4、JUMPI代表"如果...,则跳转至...",它从stack中弹出2个值作为输入,如果条件为真,程序计数器将被更新至59。这就是EVM是如何根据合约中的函数调用,来确定它需要执行的函数字节码的位置的原理。实际上,这只是一组简单的“if语句”,用于合约中的每个函数以及它们的跳转位置。

合约

4、方案总结

整体简述如下

  1. 每个合约地址可以通过rpcgetcode或者debug_traceTransaction,获取到部署后的bytecode,采用GO中VM和ASM库,反编译后即获取到opcode
  2. 合约在EVM运行原理中,会有以下特征
  3. 采用REVERT+JUMPDEST这2个连续的opcode作为代码块的区分
  4. 合约必然具备函数选择器的功能,该功能也必然在第一个代码块上
  5. 函数选择器中,其函数方法均采用PUSH4作为opcode,
  6. 该选择器所包含的opcode中,会出现连续的PUSH1 00; CALLDATALOAD; PUSH1 e0; SHR; DUP1,核心功能是加载callDate数据并进行位移操作,从合约功能上其他语法不会产生
  7. 对应的函数签名在eip中定义,并且有必选和可选的明确说明

4.1、唯一性证明

走到这里我们就可以说,基本实现高效率,高准确率的合约分析方法了,当然既然已经严谨了这么久,不妨再严谨一些,我们上文方案里中基于REVER+JUMPDEST来做代码块的区分,结合其中必然的CallDate加载和位移来做唯一性判断,那是否存在,我可以用solidity合约也实现出类似的操作码序列呢?我做了下对照实验,从solidity语法层面虽然亦有msg.sig等获取CallData的方法,但编译后其opcode的实现方法不同

合约5、总结

洋洋洒洒这么分析下来,3天时间就过去了。虽然非常的细致,虽然日常中会遇到合约采用byte4来恶意混淆自己是否符合标准的合约可能是九牛一毛。所以,实际上这3天投入分析的ROI是非常低的。但是在无尽的时间长河里,概率再小的事情,也终将发生。怀揣不信任原则才能在web3的世界里,走的更远。

今天有好友问我一个很有思考深度的话题,作为产业KOL的终局是什么?你的商业模式是什么?虽然我知道技术的文章,总是流量惨淡,但流量本就不是目的,我希望始终都在最初的愿景上:

免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
上一篇:币安和CZ:加密货币首富,正在等待混乱结束 下一篇:长推:为什么 Meme 币是穷人税?

您可能感兴趣

  • 解读CKB版 “闪电网络” Fiber Network:比特币可编程性扩展的另一种思路
    解读CKB版 “闪电网络” Fiber Network:比特币可编程性扩展的另一种思路

    作者:NingNing行业周期与宏观金融周期共振,加密行业正处在与 2019 年相似的整体性迷茫之中,现阶段不仅流动性枯竭,叙事貌似也在枯竭。市场不但对 VC 叙事兴趣阙如,对反 VC 的 Meme 叙事也已经疲倦。就像每次哲学危机,人们都会回归柏拉图寻找出路,当加密行业危机时,我们也需要回归比特币、回归中本聪。正如 CKB 生态 RGB++ 协议创始人 Cipher 在最新 Blog 里所阐述的,加密行业需要对以太坊 “链上计算” 的路径依赖进行反思,回归P2P经济学,让计算归于链下,让验证归于链上。因

    每日资讯 2024-09-02 12:06 1570
  • 面对NFL球员工会起诉,“退圈”的DraftKings竟主动承认NFT是证券?
    面对NFL球员工会起诉,“退圈”的DraftKings竟主动承认NFT是证券?

    作者:Zen,PANews近日,美国国家橄榄球联盟球员协会 (NFLPA) 指控数字体育娱乐和游戏公司DraftKings 逃避了其 NFT 球员许可协议的付款义务。在放弃NFT业务后,涉嫌出售未注册证券而遭到集体诉讼的DraftKings又背上了一起官司。而有趣的是,在与NFLPA的纠纷中,DraftKings的立场似乎已从反驳转变为积极承认“NFT就是证券”。放弃NFT业务:驳回集体诉讼的动议遭到否决今年7月底,Draftkings在给用户的电子邮件中表示:“经过慎重考虑,DraftKings 决定终

    每日资讯 2024-09-02 12:06 1662
  • 简析两种最新比特币智能合约实现方案:OP_NET与Arch有何区别?
    简析两种最新比特币智能合约实现方案:OP_NET与Arch有何区别?

    作者:Cookie过去半个月,OP_NET 与 Arch 这两个比特币主网上的智能合约实现方案引发了较多的讨论。有意思的事情是,OP_NET 这个名字与大家熟悉的 OP_CAT 很像,都以「OP_」开头,具有很强的、让大家认为这哥俩差不多的迷惑性。所以,在开篇要和大家先提一嘴 OP_CAT。首先,OP_CAT 是比特币操作码,从去年开始有以「量子猫」Quantum Cats,也就是「大巫师」Taproot Wizards 的创始人 Udi Wertheimer 为首的社区力量一直在呼喊要「复活」OP_CA

    每日资讯 2024-09-02 12:06 1571
  • 争议不断,以太坊正在失去“万链之王”的权威
    争议不断,以太坊正在失去“万链之王”的权威

    作者:Climber,金色财经近期围绕以太坊的话题和争议越来越多,不仅 Vitalik 本人需要下场解释观点,就连以太坊基金会也要发布公告来平息社区的质疑声。在本轮牛市周期中,以太坊的表现可谓平平。而美国以太坊现货 ETF 的通过也并未让 ETH 走势如投资者期待般爆发,相反却在币价方面越走越低。这就不免让有着「万链之王」美誉的以太坊逐渐失去投资者和社区的尊重,进而质疑起有关以太坊的方方面面。争议不断,以太坊亟需重塑权威最近一段时间以来社区成员对 Vitalik 言论观点、以太坊基金会乃至以太坊生态系统的

    每日资讯 2024-09-02 12:06 1302
  • 从《黑神话:悟空》谈起,GameFi何时能取得真经?
    从《黑神话:悟空》谈起,GameFi何时能取得真经?

    作者:YBB Capital Researcher Zeke前言本文是市场垃圾时间中的一些闲聊,需要对传统游戏市场有一定程度了解。大家可以把这篇文章当作日记或者随想观看,这些只是我在游玩《黑神话:悟空》之后对GameFi的一些粗浅思考,以及对这个赛道未来的看法。一、游戏科学的九九八十一难三天全网销量破千万、Steam玩家同时在线峰值破235万、多家品牌联名周边销售爆火、国家级媒体多次采访、多个游戏取景地可凭游戏通关记录终身免费进入、86版《西游记》YouTube观看量超400万。以上,是《黑神话:悟空》上

    每日资讯 2024-09-02 12:06 947
  • Gavin Wood:如何防止女巫攻击进行有效空投?
    Gavin Wood:如何防止女巫攻击进行有效空投?

    演讲:Gavin WoodGavin 近期一直在关注的女巫攻击(civil resistance)的问题,PolkaWorld 回顾了 Gavin Wood 博士在 Polkadot Decoded 2024 上的主题演讲,想要探究 Gavin 在如何防止女巫攻击上的一些见解。什么是女巫攻击?你们可能知道,我一直在研究一些项目,我在编写灰皮书,专注于 JAM 项目,也在这个方向上做了一些代码的工作。实际上,在过去的两年时间里,我一直在思考一个非常关键的问题,这个问题在这个领域中非常重要,那就是如何防止女巫

    每日资讯 2024-09-02 12:06 1516
  • 市场热议,链抽象将成加密新叙事?
    市场热议,链抽象将成加密新叙事?

    2024年,加密货币领域的技术创新持续加速,链抽象(Chain Abstraction)逐渐成为行业内的焦点。链抽象技术的核心在于通过隐藏底层技术的复杂性,让用户能够更加便捷地在多个区块链之间进行操作。传统的区块链技术通常要求用户掌握不同链的操作流程,并需要应对跨链操作中的技术难题,这极大地吸引了新用户的进入。而链抽象的出现,则为这些问题提供了有效的解决方案,成为Web3建设不可忽视的重要一环。01、什么是链抽象及其作用链抽象能够将不同的区块链之间的差异整合在一个统一的操作界面中,使得用户只需一个账户即可

    每日资讯 2024-09-02 12:05 815
  • 今日日报|马斯克和特斯拉赢得“被指控操纵狗狗币”的诉讼;稳定币支付平台Bridge完成5800万美元融资
    今日日报|马斯克和特斯拉赢得“被指控操纵狗狗币”的诉讼;稳定币支付平台Bridge完成5800万美元融资

    今日要闻提示:马斯克和特斯拉赢得驳回指控他们操纵狗狗币的诉讼OpenAI和Anthropic已同意将其主要新AI模型在发布前共享给美国政府OKX将上线Hamster Kombat(HMSTR)现货交易X平台纽约总部将于9月13日关闭,预计将迁往得州萨尔瓦多总统布克尔成为《时代》杂志最新一期封面人物稳定币支付公司Bridge完成5800万美元融资数据:MATIC、SHIB、UNI代币头部地址持仓均超50%网龙今年上半年通过出售2.9亿元的加密货币,获利5100万元人民币监管消息美国众议院计划在9月举行多场加

    每日资讯 2024-09-02 12:05 1396