S13. 未检查的低级调用
WTF Solidity 合约安全: S13. 未检查的低级调用
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity 合约安全”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍智能合约的未检查低级调用(low-level call)的漏洞。失败的低级调用不会让交易回滚,如果合约中忘记对其返回值进行检查,往往会出现严重的问题。
低级调用
以太坊的低级调用包括 call(),delegatecall(),staticcall(),和send()。这些函数与 Solidity 其他函数不同,当出现异常时,它并不会向上层传递,也不会导致交易完全回滚;它只会返回一个布尔值 false ,传递调用失败的信息。因此,如果未检查低级函数调用的返回值,则无论低级调用失败与否,上层函数的代码会继续运行。对于低级调用 ...
S14. 操纵区块时间
WTF Solidity 合约安全: S14. 操纵区块时间
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity 合约安全”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍智能合约的操纵区块时间攻击,并使用 Foundry 复现。在合并(The Merge)之前,以太坊矿工可以操纵区块时间,如果抽奖合约的伪随机数依赖于区块时间,则可能被攻击。
区块时间
区块时间(block timestamp)是包含在以太坊区块头中的一个 uint64 值,代表此区块创建的 UTC 时间戳(单位:秒),在合并(The Merge)之前,以太坊会根据算力调整区块难度,因此出块时间不定,平均 14.5s 出一个区块,矿工可以操纵区块时间;合并之后,改为固定 12s 一个区块,验证节点不能操纵区块时间。
在 Soli ...
S15. 操纵预言机
WTF Solidity 合约安全: S15. 操纵预言机
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity 合约安全”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍智能合约的操纵预言机攻击,并复现了一个攻击示例:用1 ETH兑换17万亿枚稳定币。仅2022年一年,操纵预言机攻击造成用户资产损失超过 2 亿美元。
价格预言机
出于安全性的考虑,以太坊虚拟机(EVM)是一个封闭孤立的沙盒。在EVM上运行的智能合约可以接触链上信息,但无法主动和外界沟通获取链下信息。但是,这类信息对去中心化应用非常重要。
预言机(oracle)可以帮助我们解决这个问题,它从链下数据源获得信息,并将其添加到链上,供智能合约使用。
其中最常用的就是价格预言机(price oracle),它可以指代任何可以让你查询币价 ...
S12. tx.origin钓鱼攻击
WTF Solidity 合约安全: S12. tx.origin钓鱼攻击
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity 合约安全”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍智能合约的tx.origin钓鱼攻击和预防方法。
tx.origin钓鱼攻击
笔者上初中的时候特别喜欢玩游戏,但是项目方为了防止未成年人沉迷,规定只有身份证号显示已满十八岁的玩家才不受防沉迷限制。这该怎么办呢?后来笔者使用家长的身份证号进行年龄验证,并成功绕过了防沉迷系统。这个案例与tx.origin钓鱼攻击有着异曲同工之妙。
在solidity中,使用tx.origin可以获得启动交易的原始地址,它与msg.sender十分相似,下面我们用一个例子来区分它们之间不同的地方。
如果用户A调用了B合约,再通过B合约 ...
无题
{"name":"ethers_examples","version":"1.0.0","description":"Minimal Tutorial to Ethers.js","type":"module","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":"0xAA","license":"MIT","dependencies":{"ethers":"^5.7.1","merkletreejs":"^0.2.32"}}
S11. 抢先交易
WTF Solidity 合约安全: S11. 抢先交易
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity 合约安全”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍智能合约的抢先交易(Front-running,抢跑)。据统计,以太坊上的套利者通过三明治攻击(sandwich attack)共获利$12亿。
Front-running
传统抢跑
抢跑最初诞生于传统金融市场,是一场单纯为了利益的竞赛。在金融市场中,信息差催生了金融中介机构,他们可以通过最先了解某些行业信息并最先做出反应从而实现获利。这些攻击主要发生在股票市场交易和早期的域名注册。
2021 年 9 月,NFT 市场 OpenSea 的产品负责人 Nate Chastain,被发现通过抢先购买将在 OpenSea 首页展示的 N ...
S10. 貔貅
WTF Solidity 合约安全: S10. 貔貅
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity 合约安全”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍貔貅合约和预防方法(英文习惯叫蜜罐代币 honeypot token)。
貔貅学入门
貔貅是中国的一个神兽,因为在天庭犯了戒,被玉帝揍的肛门封闭了,只能吃不能拉,可以帮人们聚财。但在Web3中,貔貅变为了不详之兽,韭菜的天敌。貔貅盘的特点:投资人只能买不能卖,仅有项目方地址能卖出。
通常一个貔貅盘有如下的生命周期:
恶意项目方部署貔貅代币合约。
宣传貔貅代币让散户上车,由于只能买不能卖,代币价格会一路走高。
项目方rug pull卷走资金。
学会貔貅合约的原理,才能更好的识别并避免被割,才能做一个顽强的韭菜!
貔貅合约
这里我们 ...
无题
// provider.on("pending", listener)
import { ethers, utils } from "ethers";
// 1. 创建provider
var url = "http://127.0.0.1:8545";
const provider = new ethers.providers.WebSocketProvider(url);
let network = provider.getNetwork()
network.then(res => console.log(`[${(new Date).toLocaleTimeString()}] 连接到 chain ID ${res.chainId}`));
// 2. 创建interface对象,用于解码交易详情。
const iface = new utils.Interface([
"function mint() external",
])
// 3. 创建钱包,用于发送抢跑交易
const privateKey = '0x5de4111afa1a4b94908f83103e ...
S09. 拒绝服务
WTF Solidity 合约安全: S09. 拒绝服务
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity 合约安全”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍智能合约的拒绝服务(Denial of Service, DoS)漏洞,并介绍预防的方法。NFT 项目 Akutar 曾因为 DoS 漏洞损失 11,539 ETH,当时价值 3400 万美元。
DoS
在 Web2 中,拒绝服务攻击(DoS)是指通过向服务器发送大量垃圾信息或干扰信息的方式,导致服务器无法向正常用户提供服务的现象。而在 Web3,它指的是利用漏洞使得智能合约无法正常提供服务。
在 2022 年 4 月,一个很火的 NFT 项目名为 Akutar,他们使用荷兰拍卖进行公开发行,筹集了 11,539.5 ETH,非常 ...
S08. 绕过合约检查
WTF Solidity 合约安全: S08. 绕过合约长度检查
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity 合约安全”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
推特:@0xAA_Science|@WTFAcademy_
社区:Discord|微信群|官网 wtf.academy
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
这一讲,我们将介绍绕过合约长度检查,并介绍预防的方法。
绕过合约检查
很多 freemint 的项目为了限制科学家(程序员)会用到 isContract() 方法,希望将调用者 msg.sender 限制为外部账户(EOA),而非合约。这个函数利用 extcodesize 获取该地址所存储的 bytecode 长度(runtime),若大于0,则判断为合约,否则就是EOA(用户)。
12345678910// 利用 extcodesize 检查是否为合约function isContract(address account) public ...