# NFT合约安全分析:2022年上半年事件回顾与常见问题探讨2022年上半年,NFT领域安全事件频发,造成了巨大的经济损失。据统计,这半年内共发生10起重大NFT安全事件,总损失高达6490万美元。攻击手段主要包括合约漏洞利用、私钥泄露和钓鱼等。值得注意的是,Discord平台上的钓鱼攻击尤为猖獗,几乎每天都有服务器遭受攻击,导致大量用户因点击恶意链接而蒙受损失。## 典型安全事件分析### TreasureDAO事件3月3日,TreasureDAO交易平台遭遇攻击,超过100个NFT被盗。问题出在TreasureMarketplaceBuyer合约的buyItem函数上。该函数在计算总价时未对代币类型进行判断,直接将数量与单价相乘。这导致攻击者可以在ERC-20代币支付额为0的情况下,调用TreasureMarketplace合约的buyItem函数购买代币。根本原因是ERC-1155和ERC-721代币混用引发的逻辑混乱。ERC-721代币本身没有数量概念,但合约却用数量计算购买价格,且在最终转账实现中未进行逻辑分离。### APE Coin空投事件3月17日,黑客通过闪电贷获取了超过6万枚APE Coin空投。问题出在AirdropGrapesToken空投合约上。合约使用alpha.balanceOf()和beta.balanceOf()判断调用者对BAYC/MAYC NFT的所有权,但这种方式只能获取用户对NFT所有权的瞬时状态,而这个状态可以通过闪电贷操纵。攻击者正是利用这一漏洞,通过闪电贷借入BAYC NFT并获取相应空投。### Revest Finance事件3月27日,Revest Finance项目遭受攻击,损失约12万美元。这是一起典型的ERC-1155重入攻击。问题出在Revest合约中。当用户使用depositAdditionalToFNFT()追加FNFT抵押资产时,合约需要先销毁旧FNFT,再铸造新FNFT。然而,铸造过程中min()函数未检查需铸造的FNFT是否已存在,且fnftId状态变量自增在_mint()函数之后。而_min()中存在ERC-1155的隐藏外部调用_doSafeTransferAcceptanceCheck(),这就造成了重入漏洞。### NBA薅羊毛事件4月21日,NBA项目遭遇攻击。问题出在The_Association_Sales合约的签名验证机制上。主要存在两个安全隐患:签名冒用和签名复用。签名复用是因为合约未存储已使用的签名,导致攻击者可多次重复使用同一签名。签名冒用则是因为vData memory参数info在传参时未进行msg.sender校验,使得签名可被冒用。### Akutar事件4月23日,NFT项目Akutar的AkuAuction合约因漏洞导致11539ETH(约3400万美元)被锁死。合约存在两个逻辑漏洞:1. 退款函数processRefunds使用call函数进行退款,并将退款结果作为require判定条件。攻击者可在fallback中恶意revert,导致整个合约退款操作无法进行。2. 退款函数中的两个判断条件未考虑用户可投标多个NFT的情况,导致项目方后续退款操作永远无法执行。### XCarnival事件6月24日,NFT借贷协议XCarnival遭攻击,黑客获利3087枚以太坊(约380万美元)。问题出在XNFT合约的pledgeAndBorrow函数上。该函数在质押NFT时未检查攻击者传入的xToken地址是否在项目白名单中,且在借贷时未对抵押记录状态进行检测,导致攻击者可反复使用无效抵押记录进行借贷。## NFT合约审计常见问题1. 签名冒用和复用: - 签名数据缺少重复执行验证,如缺少用户nonce,导致可重复使用签名数据铸造NFT。 - 签名检查不合理,如未检查签名者为零地址的情况,导致任意用户均可通过检查进行铸币。2. 逻辑漏洞: - 合约管理员可通过特殊方式铸币而不受总量限制,导致NFT实际量超过预期。 - NFT拍卖时,获胜者可利用交易顺序依赖攻击修改竞拍价格,低价获取NFT。3. ERC721/ERC1155重入攻击: - 使用转账通知功能(onERC721Received函数)时,NFT合约向转账目标合约发送调用可能导致重入攻击。4. 授权范围过大: - 质押或拍卖时要求_operatorApprovals授权,而非单个代币授权,增加NFT被盗风险。5. 价格操控: - NFT价格依赖某合约的代币持有量,攻击者可利用闪电贷拉高代币价格,导致质押NFT被异常清算。鉴于NFT合约安全事件频发,且审计过程中发现的漏洞往往与实际攻击相符,寻求专业安全公司对NFT合约进行全面审计显得尤为重要。
NFT合约安全风险剖析:2022上半年事件回顾与审计要点
NFT合约安全分析:2022年上半年事件回顾与常见问题探讨
2022年上半年,NFT领域安全事件频发,造成了巨大的经济损失。据统计,这半年内共发生10起重大NFT安全事件,总损失高达6490万美元。攻击手段主要包括合约漏洞利用、私钥泄露和钓鱼等。值得注意的是,Discord平台上的钓鱼攻击尤为猖獗,几乎每天都有服务器遭受攻击,导致大量用户因点击恶意链接而蒙受损失。
典型安全事件分析
TreasureDAO事件
3月3日,TreasureDAO交易平台遭遇攻击,超过100个NFT被盗。问题出在TreasureMarketplaceBuyer合约的buyItem函数上。该函数在计算总价时未对代币类型进行判断,直接将数量与单价相乘。这导致攻击者可以在ERC-20代币支付额为0的情况下,调用TreasureMarketplace合约的buyItem函数购买代币。
根本原因是ERC-1155和ERC-721代币混用引发的逻辑混乱。ERC-721代币本身没有数量概念,但合约却用数量计算购买价格,且在最终转账实现中未进行逻辑分离。
APE Coin空投事件
3月17日,黑客通过闪电贷获取了超过6万枚APE Coin空投。问题出在AirdropGrapesToken空投合约上。合约使用alpha.balanceOf()和beta.balanceOf()判断调用者对BAYC/MAYC NFT的所有权,但这种方式只能获取用户对NFT所有权的瞬时状态,而这个状态可以通过闪电贷操纵。攻击者正是利用这一漏洞,通过闪电贷借入BAYC NFT并获取相应空投。
Revest Finance事件
3月27日,Revest Finance项目遭受攻击,损失约12万美元。这是一起典型的ERC-1155重入攻击。问题出在Revest合约中。当用户使用depositAdditionalToFNFT()追加FNFT抵押资产时,合约需要先销毁旧FNFT,再铸造新FNFT。然而,铸造过程中min()函数未检查需铸造的FNFT是否已存在,且fnftId状态变量自增在_mint()函数之后。而_min()中存在ERC-1155的隐藏外部调用_doSafeTransferAcceptanceCheck(),这就造成了重入漏洞。
NBA薅羊毛事件
4月21日,NBA项目遭遇攻击。问题出在The_Association_Sales合约的签名验证机制上。主要存在两个安全隐患:签名冒用和签名复用。签名复用是因为合约未存储已使用的签名,导致攻击者可多次重复使用同一签名。签名冒用则是因为vData memory参数info在传参时未进行msg.sender校验,使得签名可被冒用。
Akutar事件
4月23日,NFT项目Akutar的AkuAuction合约因漏洞导致11539ETH(约3400万美元)被锁死。合约存在两个逻辑漏洞:
XCarnival事件
6月24日,NFT借贷协议XCarnival遭攻击,黑客获利3087枚以太坊(约380万美元)。问题出在XNFT合约的pledgeAndBorrow函数上。该函数在质押NFT时未检查攻击者传入的xToken地址是否在项目白名单中,且在借贷时未对抵押记录状态进行检测,导致攻击者可反复使用无效抵押记录进行借贷。
NFT合约审计常见问题
签名冒用和复用:
逻辑漏洞:
ERC721/ERC1155重入攻击:
授权范围过大:
价格操控:
鉴于NFT合约安全事件频发,且审计过程中发现的漏洞往往与实际攻击相符,寻求专业安全公司对NFT合约进行全面审计显得尤为重要。