【Solana】SOL区块链破解生成代币
1.79K subscribers
202 photos
1 video
2 files
3 links
【Solana】SOL区块链破解生成代币
Download Telegram
智能合约漏洞分析

本章把以太坊智能合约漏洞发生的原因分为是哪个层面:Solidity层面、EVM层面和区块链层面。如下表所示,所列出的漏洞都有对应真实案例,这些漏洞造成了巨额的资金损失。


SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
【一、Solidity层面】

这一层发生的漏洞主要是因为代码编写的逻辑问题或是使用了不当的Solidity内置方法,简而言之,它们基本都和Solidity的语言特性有关。例如

😍 重入攻击:是由于外部函数对合约的send()或者call.value()方法进行了递归调用造成的漏洞,解决办法是改为使用transfer(),该方法只能被调用一次。需要注意的是合约中应避免使用send()或者call.value()方法,以免受到重入攻击;

😍 访问控制攻击:是由于合约未设置函数的访问权限而造成的漏洞,解决办法是为函数加一个onlyOwner修饰符,限制函数访问;

😍 整数溢出:是由于在这个语言中,要计算的数如果超过了EVM能处理的数字范围(0~2256-1)就会重新从0或2256-1开始计数,解决办法是智能合约中只要是数学计算都使用safe-Math库;

😍 未检查返回值:是由于合约使用了send()或call.value()函数,却没有检查函数是否执行成功就进行下一步操作导致的漏洞,解决办法是校验成功后再下一步;

😍 拒绝服务:是由于攻击者恶意回退函数执行失败,使得原合约无法进行下一步操作而造成的漏洞,解决办法是把主动退款改为让用户申请退款,这样一个用户退款失败不影响合约继续执行。 这里需注意的是智能合约中能写成pull形式(用户主动发起调用)的代码不要写成push形式(合约主动执行操作)的代码;


SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
Please open Telegram to view this post
VIEW IN TELEGRAM
【二、EVM层面】

这一层发生的漏洞主要是由于EVM的限制导致的, 例如
😍 变量使用类型限制:是因为var关键字声明变量时默认变量的类型是uint8,如果使用了for(var i=0;i<x;i++)这样的用法且恰好x>255,那将导致无限循环直到gas耗尽。 所以在编写合约时应显式标注变量类型,避免使用var;
😍 Gas限制:是由于在合约被调用时,每次修改合约状态都需要使用gas,如果一个函数涉及特别复杂的操作,需要消耗的gas达到了交易或区块的gas限制,那么对这个函数的调用将会在消耗很多gas的同时调用失败, 并回滚合约状态;
😍 调用堆栈深度限制:是由于EVM最大允许栈深度为1024,如果调用者嵌套调用时,深度到1024,将会调用失败。

攻击者可以利用EVM的这三个限制使得合约调用失败,以此阻止合约下一步操作。避免这类漏洞的方法就是在编写合约中的函数时,避免让合约的下一步操作依赖这一步的状态。

SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
Please open Telegram to view this post
VIEW IN TELEGRAM
【三、区块链层面】

私有变量依赖
在Solidity中,私有变量虽然无法被自身合约以外的外围直接读取,但只要某一条交易中使用了这个私有变量,它就化私为公了。因为在以太坊中交易信息是全网公开的, 且每个交易的数据字段对应了规定的内容,只要对数据字段进行分析就可以知道私有变量的值。
被操控值依赖
智能合约中可被人为操控的值有随机数的种子、交易顺序、合约余额等

😍 随机数种子。在某类游戏合约中,通常需要依赖一个随机数下注来判断输赢。而计算机世界中不存在一个绝对随机数,只能通过seed去生成一个相对随机数,但如果这个seed是可预测的,那随机数也就不随机了。 智能合约新手习惯使用未来的区块头属性作为随机数种子,如区块Hash、区块高度、时间戳、难度值等,然而这些区块头属性的值都是可被矿工人为控制的,所以不能依赖这些属性作为随机数种子。 解决办法是使用链外可信第三方服务来获取随机数,如Oraclize;或者一些专门的随机数生成合约,如开源项目RANDAO。

😍 交易顺序,也是可被矿工操作的。

😍 合约中的Ether余额,这个值也特别容易诱导开发人员将其当做确定值来作为判断条件。尤其是Solidity新手可能会认为合约只能通过带有payable修饰符的函数接受Ether, 事实上,除此之外还有两种方式可将Ether强制发给合约,一种是通过selfdestruct自毁合约,可在删除合约地址中所有字节码的同时将合约存储的Ether强制发送到指定地址, 若这个地址是一个合约地址,那么这些Ether将不会调用这个合约的任何方法而是直接存入合约中。另一种更神奇的方式是让这个合约在出生前就拥有一笔财富,因为合约地址都是确定的, 可根据这个合约的创建人地址以及交易的nonce值计算得到,这样就可在创建这个合约之前就给它转入一笔Ether,当合约创建后就拥有非零Ether余额。

合约逻辑应该避免依赖于合约余额的确切值,因为可能飞来横币。如果非要使用合约余额作为判断条件,也应根据实时查询到的合约当前余额来判断。


SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
Please open Telegram to view this post
VIEW IN TELEGRAM
智能合约检测现状
目前全球做智能合约安全审计的公司并不多,开发出形式化验证工具的更是少之又少,国内外做合约形式化验证的平台有俄罗斯的SmartDec、瑞士的Securify、 美国的Quantstamp和中国的Vaas,其中VaaS检测平台比较易用。除此之外,非基于形式化验证的工具有Solidity开发文档中推荐的SmartCheck、Oyente、Manticore、Mythril、Porosity等, 这些工具只能检测特定的部分漏洞。再者就是依靠专业智能合约审计人员人工检测,检测结果依赖审计人员水平而定。


SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
智能合约检测方法

👀大致有以下几种方法:
😍 把已知的可能存在漏洞的代码写在工具的源代码中,当待检测的合约代码有类似漏洞代码或逻辑时,便将其标记出来,这一类检测工具有SmarkCheck、Securify等。

😍 对合约代码进行反编译,然后通过对字节码的分析,找出漏洞,这一类检测工具有Oyente、Manticore、Mythril、Porosity等。

😍 通过生成一个DOT图,显示合约代码的功能控制流程,实现对代码逻辑的检测,这列工具主要有Solgraph。

还有一类检测方法与上述工具的检测思路都不一致,它就是形式化验证,这是形式化方法中的一部分。形式化方法就是用数学工具来进行定义、开发和验证一个系统。

SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
Please open Telegram to view this post
VIEW IN TELEGRAM
安全代码编写建议

😍 代码模块化
如果要编写逻辑复杂的合约,尽可能使合约代码模块化,使得一个模块只包含一个特定的功能。模块化不仅方便代码编写者对代码整体逻辑的把我,而且一旦代码发生错误, 也方便测试者定位代码的错误所在。

😍 使用安全代码
如果代码中需要使用的功能,已被安全审计智能合约框架所包含,直接调用已被审计过的代码比自己重写这个功能更安全。例如,在以太坊中发行ERC-20 代币的代码, 在开源框openZeppelin中已有经过大量安全测试的代码模板,使用此代码模板发行代币可避免很多安全风险。

😍 防范代码漏洞
针对上一节中描述的合约漏洞,需要在编码时加以防范,此处不再赘述。


SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
Please open Telegram to view this post
VIEW IN TELEGRAM
合约测试

智能合约编程和传统编程在资金安全方面有很多不同,首先是智能合约本身可以存储大量资金,一旦遭到攻击会直接导致资金损失,很容易被黑客当做攻击目标; 其次,智能合约代码是公开的,黑客可以不受限制地研究代码漏洞,只要代码存在漏洞,不被发现的概率很小,所以编写智能合约时需要尽可能详尽地考虑安全问题。 另外,由于智能合约在区块链上部署成功后就不能修改,即使发现了安全漏洞,也无法像传统程序那样打补丁或升级,所以合约编写者需要做到的是,一方面必须在编写代码过程中就把异常终止和升级逻辑写进智能合约, 另一方面必须减少编写不安全代码的概率。

SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
产生背景

【一、应对其他链带来的威胁】
作为区块链的创世鼻祖,多数交易所、挖矿公司都是以比特币起家,这使得比特币在整个区块链界长期占据着主导地位。但是,随着技术发展,市面上又出现了几种流行的主流区块链,如以太坊、比特股等。 特别是以太坊,其支持智能合约的特性对比特币产生极大的冲击,而基于比特币的项目至今仍然很少。而且,由于比特币共识机制的特性,对其进行重大改造升级, 基本是一件不可能的事情,提出侧链技术有助于在保持比特币主链不进行大的变动下,使得对其进行升级改造变得可能。


SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
【二、提升区块链可扩展性】
可扩展性一直是区块链网络的一个硬伤,提升区块链的交易吞吐率是现阶段一个非常重要的研究方向。不管是比特币后来升级的隔离见证技术或因区块扩容分叉出的BCH, 对交易吞吐率的提升都是十分有限的。以太坊目前(2022)交易的TPS也只有20笔左右,其现阶段的主要任务是升级到PoS共识、分片,最终目标就是提高全网吞吐率。 目前比较知名的Hyperledger Fabric等,在控制节点数量、缩短共识时间的前提下,TPS也只能达到1000笔。这与支付宝在"双十一"顶峰所达到的每秒几十万交易量相差实在太大。

如果实施跨链技术,就有望在多链上并发交易,那么吞吐率也会成倍增长。比如,将比特币的一部分交易放在其侧链上去执行,减轻主链的压力,这样便可以无形中提升比特币系统的可扩展性。


SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
实现方案
目前,主流的跨链技术方案的实现方式主要有三大类,分别是公证人机制、侧链/中继链和哈希锁定

【一、公证人机制】
也称为见证人机制,本质上是一种引入中介的方式。具体而言,假设区块链A和B本身并不能直接进行互操作的,那么它们可以引入一个共同信任的第三方作为中介, 由这个共同信任的中介进行跨链消息的验证和转发。这种实现方式的优点是能够灵活支持各种不同结构的区块链,缺点是存在中心化风险。

😍 传统的公证人机制是基于中心化的交易所来实现跨链资产转移,实现起来比较容易,但功能也单一。以比特币和以太币的交换为例,具体流程是用户将自己在比特币区块链上的资产发送给托管方, 后者收到信息后,锁定比特币区块链上的资产,并且激活等价值的以太币区块链资产。这种方案最大的问题是拥有一个中心化的机构。

😍 还有一种升级版的方式,将交易所省纪委一个由公正联盟使用多签名技术来控制的机构,不再是一个单一机构。这样使得想要偷窃已经锁定的数字资产,就需要得到多个机构的签名。 相对于传统交易所来说,安全性有所增加,但锁定数字资产的安全仍然取决于公正联盟的忠诚度。

😍 最后一种是著名的分布式账本技术Ripple。它是采用类似公证人机制来解决全球金融机构之间的资产交换,并且不收取任何手续费,其交易可以在几秒内完成。读者可以谷歌上搜索关于Ripple共识的资料。


SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
Please open Telegram to view this post
VIEW IN TELEGRAM
【二、侧链/中继链】
关于侧链。实现侧链的技术基础是双向锚定(Two-way Peg),这种技术可以将数字资产在主链中锁定,同时在侧链中释放等价数字资产。而且可以这个操作可以反过来进行。 现阶段去中心化的双向锚定实现,主要基于SPV技术,这是一种只需要少量数据就可以证明某笔交易存在的方法,在这种模式下,可以将主链上的数字资产发送到一个特定的地址, 在经过一定区块链数量的确认交易生效之后,创建一个SPV证明发送到侧链,侧链收到后再验证主链上资产是否已经被锁定,同时释放侧链上等价的数字资产。 同理,在侧链经过一定区块数量确认之后,可以使用同样的操作,将侧链上的数字资产锁定发送到主链。
BTC Relay号称史上第一个侧链。它通过以太坊构建了一个比特币的侧链,运用以太坊智能合约验证比特币交易的存在性。


关于中继链。中继链算是公证人机制和侧链机制的融合及扩展,即在两条链之间建立一条类似公证人角色的通信通道,如果这个通道本身也是一个区块链, 则称这个链为中继链。目前,比较著名的跨链项目Cosmos就是采用了中级链的多链多层架构,支持跨链资产交互

SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
拥塞攻击
除了利用智能合约漏洞的攻击外,还有些攻击其实是利用区块链本身的特性进行攻击。其中最有意思的一类攻击叫做“拥塞攻击”。比如Fomo 3D,前几年Fomo 3D是很流行的彩票游戏,最终获得钥匙的人可以获得该合约的几乎所有ETH。游戏规则是怎样的?在每一轮限定时间内大家都可以买钥匙,每轮钥匙价格会持续增高。如果在限定时间内有用户参与买钥匙,那么下一轮就会继续进行。直至当前轮在限定时间内没有人买钥匙,那么上轮的买到钥匙的用户就是最终赢家。

Fomo3D的第一轮赢家也是攻击者,他获得了超过1万以太的奖励。正常情况下,游戏规则是挺公平的,最后一轮用户获得最终奖励。然而,攻击者发现了以太坊本身的拥塞问题,通过自己的操作获得了更高的成功空间,让自己变成了最终的赢家。


SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
警惕Solana钓鱼攻击:钱包Owner权限被篡改

Solana Owner 修改机制

攻击者利用了两种反直觉的场景成功诱骗了用户点击:
1、通常交易签名时,钱包会模拟运行交易的执行结果,如果有资金变化那么会显示在交互界面上,而攻击者精心构造的交易没有资金变化;

2、传统的以太坊 EOA 账号是私钥控制所有权,主观上不清楚 Solana 存在可以修改账号所有权的特性;


下面我们来分析一下 Solana Owner 修改究竟是一种什么样的操作。

SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
账号所有权

通常我们用钱包创建账号时,Owner 是系统账号(11111111111111111111111111111111),在交易时需要通过系统验证交易签名是否由对应的公钥签署而来的。用 Solana Account 命令可以查看账号的基本信息
还有一种账号称为 PDA 账号,它是由智能合约派生的账号,主要用于存储智能合约数据,它的 Owner 是派生它的智能合约,例如:用于保存 Token 发行和持有信息的账号就是一种 PDA 账号,用 Solana Account 查看账号基本信息时可以看到它的 Owner 是 Token 智能合约 TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA:


这两种账号都可以修改 Owner,但有不同的规则和限制

SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
PDA 账号

简单来说 PDA 账号可以修改 Owner,但要求账号的 data 为空,同样是通过 assign 指令进行操作,我们简单测试了一下几种场景下修改 Owner 的反馈:
1. 新创建的 PDA 账号,可以任意指定 Owner,如果 Owner 不为创建它的 Program,那么 Program 无写入权限。

2. 创建完成的 PDA 账号试图修改 Owner 时报错:instruction illegally modified the program id of an account。

3. PDA 账号最终 assign 之前试图写入数据:instruction modified data of an account it does not own。


账号被修改 Owner 后用户就失去了账号的控制权,攻击者可以通过 CPI 调用的方式转移账号资产。

还有一种常见的所有权变更,那就是 Token 账号的所有权,本质上这是一种智能合约内逻辑控制的所有权,不是由 Solana 底层逻辑控制,但它也经常被用于钓鱼攻击,广大用户应警觉这类钓鱼攻击方式。

SOL区块链破解生成代币 破解合约绕过区块链制定新的规则合约代币 #区块链破解 #代币生成 需要做的人可以来联系:@Perlah544
双花攻击 Double Spend Attack

双花攻击(Double Spend Attack)即一笔钱花了两次,双重支付,利用货币的数字特性两次或多次使用“同一笔钱”完成支付。双花不会产生新的 Token,但能把自己花出去的钱重新拿回来。简单说就是,攻击者将一笔 Token 转到另外一个地址,通常是转到交易所进行套现,然后再利用一些攻击手法对转账交易进行回滚。目前有常见的几种手法能够引发双花攻击