
WTF Solidity 合约安全: S08. 绕过合约检查
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍绕过合约长度检查,并介绍预防的方法。绕过合约检查很多 freemint 的项目为了限制科学家(程序员)会用到 isContract() 方法,希望将调用者 msg.sender 限制为外部账户(EOA),而非合约。这个函数利用 extcodesize 获取该地址所存储的 bytecode 长度(runtime),若大于0,则判断为合约,否则就是EOA(用户)。 // 利用 extcodesize 检查是否为合约 function isContract(address account) public view returns (bool) { // extcodesize > 0 的地址一定是合约...

WTF Solidity 合约安全: S09. 拒绝服务
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍智能合约的拒绝服务(Denial of Service, DoS)漏洞,并介绍预防的方法。NFT项目 Akutar 曾因为 DoS 漏洞损失 11,539 ETH,当时价值 3400 万美元。DoS在 Web2 中,拒绝服务攻击(DoS)是指通过向服务器发送大量垃圾信息或干扰信息的方式,导致服务器无法向正常用户提供服务的现象。而在 Web3,它指的是利用漏洞使得智能合约无法正常提供服务。 在2022年4月,一个很火的 NFT 项目名为 Akutar,他们使用荷兰拍卖进行公开发行,筹集了 11,539.5 ETH,非常成功。之前持有他们社区Pass的参与者会得到 0.5 ETH的退款,但是他们处理...

WTF Solidity 合约安全 S06. 签名重放
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍智能合约的签名重放(Signature Replay)攻击和预防方法,它曾间接导致了著名做市商 Wintermute 被盗2000万枚 $OP。签名重放上学的时候,老师经常会让家长签字,有时候家长很忙,我就会很“贴心”照着以前的签字抄一遍。某种意义上来说,这就是签名重放。 在区块链中,数字签名可以用于识别数据签名者和验证数据完整性。发送交易时,用户使用私钥签名交易,使得其他人可以验证交易是由相应账户发出的。智能合约也能利用 ECDSA 算法验证用户将在链下创建的签名,然后执行铸造或转账等逻辑。更多关于数字签名的介绍请见WTF Solidity第37讲:数字签名。 数字签名一般有两种常见的重放攻击...
WTF Academy: wtf.academy

WTF Solidity 合约安全: S08. 绕过合约检查
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍绕过合约长度检查,并介绍预防的方法。绕过合约检查很多 freemint 的项目为了限制科学家(程序员)会用到 isContract() 方法,希望将调用者 msg.sender 限制为外部账户(EOA),而非合约。这个函数利用 extcodesize 获取该地址所存储的 bytecode 长度(runtime),若大于0,则判断为合约,否则就是EOA(用户)。 // 利用 extcodesize 检查是否为合约 function isContract(address account) public view returns (bool) { // extcodesize > 0 的地址一定是合约...

WTF Solidity 合约安全: S09. 拒绝服务
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍智能合约的拒绝服务(Denial of Service, DoS)漏洞,并介绍预防的方法。NFT项目 Akutar 曾因为 DoS 漏洞损失 11,539 ETH,当时价值 3400 万美元。DoS在 Web2 中,拒绝服务攻击(DoS)是指通过向服务器发送大量垃圾信息或干扰信息的方式,导致服务器无法向正常用户提供服务的现象。而在 Web3,它指的是利用漏洞使得智能合约无法正常提供服务。 在2022年4月,一个很火的 NFT 项目名为 Akutar,他们使用荷兰拍卖进行公开发行,筹集了 11,539.5 ETH,非常成功。之前持有他们社区Pass的参与者会得到 0.5 ETH的退款,但是他们处理...

WTF Solidity 合约安全 S06. 签名重放
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。 推特:@0xAA_Science|@WTFAcademy_ 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity这一讲,我们将介绍智能合约的签名重放(Signature Replay)攻击和预防方法,它曾间接导致了著名做市商 Wintermute 被盗2000万枚 $OP。签名重放上学的时候,老师经常会让家长签字,有时候家长很忙,我就会很“贴心”照着以前的签字抄一遍。某种意义上来说,这就是签名重放。 在区块链中,数字签名可以用于识别数据签名者和验证数据完整性。发送交易时,用户使用私钥签名交易,使得其他人可以验证交易是由相应账户发出的。智能合约也能利用 ECDSA 算法验证用户将在链下创建的签名,然后执行铸造或转账等逻辑。更多关于数字签名的介绍请见WTF Solidity第37讲:数字签名。 数字签名一般有两种常见的重放攻击...
WTF Academy: wtf.academy

Subscribe to 0xAA

Subscribe to 0xAA
Share Dialog
Share Dialog


我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。
所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity
这一讲,我们将介绍智能合约的权限管理漏洞。这个漏洞导致了跨链桥 Poly Network 被黑 6.11 亿美元,并导致了BSC上DeFi项目 ShadowFi 被黑 $300,000。
智能合约中的权限管理定义了不同角色在应用中的权限。通常来说,代币的铸造、提取资金、暂停等功能都需要较高权限的用户才能调用。如果权限配置错误,就可能造成意想不到的损失。下面我们介绍两种常见的权限管理漏洞。
如果合约中特殊功能没有加上权限管理,那么任何人都能铸造大量代币或将合约中的资金提光。跨链桥 Poly Network 的合约中转移守护者的函数没有配置相应权限,被黑客改为自己的地址,从而提走了合约中的 6.11 亿美元。
在下面的代码中,mint()函数没有进行权限管理,那么任何人都可以调用它铸造代币。
// 错误的mint函数,没有限制权限
function badMint(address to, uint amount) public {
_mint(to, amount);
}

另一类常见的权限管理漏洞是没有在函数中检查调用者是否拥有足够的授权。BSC上DeFi项目 ShadowFi 的代币合约忘了在 burn() 销毁函数中检查调用者的授权额度,导致攻击者可以任意的销毁其他地址的代币。在黑客将流动性池子中的代币销毁之后,仅需卖出一点代币就可以将池子里的所有 BNB 提走,获利 $300,000。
// 错误的mint函数,没有限制权限
function badBurn(address account, uint amount) public {
_burn(account, amount);
}

权限管理漏洞主要有两种预防办法:
1.使用 Openzeppelin 的权限管理库给合约的特殊函数配置相应的权限,比如使用OnlyOwner修饰器,只有合约所有者才能调用。
// 正确的mint函数,使用 onlyOwner 修饰器限制权限
function goodMint(address to, uint amount) public onlyOwner {
_mint(to, amount);
}
2.在函数的逻辑中确保合约调用者拥有足够的授权。
// 正确的burn函数,如果销毁的不是自己的代币,则会检查授权
function goodBurn(address account, uint amount) public {
if(msg.sender != account){
_spendAllowance(account, msg.sender, amount);
}
_burn(account, amount);
}
这一讲,我们介绍了智能合约中的权限管理漏洞。它主要有两种形式:权限配置错误和授权检查错误。为了避免这类漏洞,我们要使用权限管理库给特殊函数配置相应的权限,并且在函数的逻辑中确保合约调用者拥有足够的授权。
我最近在重新学solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新1-3讲。
所有代码和教程开源在github: github.com/AmazingAng/WTFSolidity
这一讲,我们将介绍智能合约的权限管理漏洞。这个漏洞导致了跨链桥 Poly Network 被黑 6.11 亿美元,并导致了BSC上DeFi项目 ShadowFi 被黑 $300,000。
智能合约中的权限管理定义了不同角色在应用中的权限。通常来说,代币的铸造、提取资金、暂停等功能都需要较高权限的用户才能调用。如果权限配置错误,就可能造成意想不到的损失。下面我们介绍两种常见的权限管理漏洞。
如果合约中特殊功能没有加上权限管理,那么任何人都能铸造大量代币或将合约中的资金提光。跨链桥 Poly Network 的合约中转移守护者的函数没有配置相应权限,被黑客改为自己的地址,从而提走了合约中的 6.11 亿美元。
在下面的代码中,mint()函数没有进行权限管理,那么任何人都可以调用它铸造代币。
// 错误的mint函数,没有限制权限
function badMint(address to, uint amount) public {
_mint(to, amount);
}

另一类常见的权限管理漏洞是没有在函数中检查调用者是否拥有足够的授权。BSC上DeFi项目 ShadowFi 的代币合约忘了在 burn() 销毁函数中检查调用者的授权额度,导致攻击者可以任意的销毁其他地址的代币。在黑客将流动性池子中的代币销毁之后,仅需卖出一点代币就可以将池子里的所有 BNB 提走,获利 $300,000。
// 错误的mint函数,没有限制权限
function badBurn(address account, uint amount) public {
_burn(account, amount);
}

权限管理漏洞主要有两种预防办法:
1.使用 Openzeppelin 的权限管理库给合约的特殊函数配置相应的权限,比如使用OnlyOwner修饰器,只有合约所有者才能调用。
// 正确的mint函数,使用 onlyOwner 修饰器限制权限
function goodMint(address to, uint amount) public onlyOwner {
_mint(to, amount);
}
2.在函数的逻辑中确保合约调用者拥有足够的授权。
// 正确的burn函数,如果销毁的不是自己的代币,则会检查授权
function goodBurn(address account, uint amount) public {
if(msg.sender != account){
_spendAllowance(account, msg.sender, amount);
}
_burn(account, amount);
}
这一讲,我们介绍了智能合约中的权限管理漏洞。它主要有两种形式:权限配置错误和授权检查错误。为了避免这类漏洞,我们要使用权限管理库给特殊函数配置相应的权限,并且在函数的逻辑中确保合约调用者拥有足够的授权。
>100 subscribers
>100 subscribers
No activity yet