当前位置: 首页 > news >正文

青岛制作网站软件白云区建设局网站

青岛制作网站软件,白云区建设局网站,wordpress 推荐环境,网页制作培训教案背景知识\定义 NFT 是数字或物理资产所有权的区块链表示。不仅限于数字图片#xff0c;视频和画作等艺术品也可以转化为 NFT 进行交易。近年来受到广泛关注#xff0c;2021 年 NFT 交易额达到约 410 亿美元。 智能合约 是在区块链上运行的图灵完备程序。支持各种去中心化…背景知识\定义 NFT 是数字或物理资产所有权的区块链表示。不仅限于数字图片视频和画作等艺术品也可以转化为 NFT 进行交易。近年来受到广泛关注2021 年 NFT 交易额达到约 410 亿美元。 智能合约 是在区块链上运行的图灵完备程序。支持各种去中心化应用 (DApp) 的部署。是 NFT 项目的底层技术。开发人员可以使用智能合约编码 NFT 交易规则。允许用户在交易市场上铸造和转移 NFT。 场景 假设 Alice 想要购买一个 NFT而 Bob 想要出售自己的 NFT。 传统方式 Alice 和 Bob 需要找到一个中介机构例如拍卖行或交易平台。 他们需要签订一份合同并支付手续费。 中介机构负责验证交易并确保双方履行合同。 交易完成后中介机构将 NFT 转移给 Alice并将资金转移给 Bob。 智能合约方式 Alice 和 Bob 可以使用智能合约来执行交易。 他们将 NFT 和资金存入智能合约。 智能合约会自动验证交易条件例如价格和数量。 如果条件满足智能合约会将 NFT 转移给 Alice并将资金转移给 Bob。 如果条件不满足智能合约会自动退还 NFT 和资金。 EVM EVM以太坊虚拟机是运行在以太坊区块链上的虚拟机它负责执行智能合约代码。 EVM 的执行机制 EVM 将智能合约的字节码拆分成操作码 (opcode)。 EVM 遵循操作码的指令执行相应的操作例如读取和写入状态变量、调用其他合约等。 EVM 的执行过程是顺序执行的但也可以通过跳转指令进行分支执行。 EVM 字节码的特点 跳转位置无法静态确定EVM 的跳转指令 (例如 jump, jumpi) 的目标地址需要在运行时动态确定这增加了智能合约代码的复杂性和安全性。 没有返回指令EVM 没有类似于函数调用的返回指令而是通过状态转换完成函数调用和返回。 智能合约中的数据存储 存储 (Storage): 用于存储永久数据例如 NFT 的所有权信息、DeFi 合约的余额等。 内存 (Memory): 用于存储临时数据例如函数调用的参数和返回值、循环变量等。 calldata: 用于存储函数调用的输入数据例如交易数据、NFT 的 ID 等。 智能合约中的状态变量 每个可变状态变量在编译时都会被分配一个 slot ID指示其在存储空间中的位置。 slot ID 帮助 EVM 在执行时确定状态变量的存储位置。 对于复杂的数据类型例如映射 (mapping) 和动态数组需要结合 slot ID 和哈希计算来确定存储位置。 ERC-721 用于在智能合约中跟踪NFTs的一套规则和接口。 ERC-721 标准 由以太坊改进提案EIPs定义用于在智能合约中实现 NFT 的标准 API。ERC-721 标准适用于非同质化、不可分割且独特的代币这些代币代表特定数字或物理资产的所有权。与 ERC-20 标准不同后者适用于可互换的同质化代币。 ERC-721 的关键功能 approve允许代币所有者授权另一个地址_approved管理特定的代币_tokenId。setApprovalForAll允许代币所有者授权一个操作者_operator管理他们所有的代币。transferFrom允许代币所有者、授权操作者或特定代币操作者转移代币所有权。safeTransferFrom与 transferFrom 类似但增加了安全检查确保接收方能够处理代币。 ERC-721 的接口 ERC-721 标准定义了强制性和可选性的接口。开发者必须遵循 ERC-721 提出的开发注释来实现每个接口。每个 ERC-721 兼容的智能合约都应该实现 ERC-721 和 ERC-165 接口。 安全性和元数据 safeTransferFrom 函数会调用 onERC721Received 接口确保接收方能够处理代币。钱包或代币接收者必须实现 onERC721Received 接口以支持代币转移。ERC721Metadata 扩展允许代币所有者在铸造新代币时设置代币 URI用户可以通过此接口查询代币代表的资产详情ERC721Enumerable 接口允许 NFT 智能合约发布其完整的 NFT 列表并使其可被发现。 存在的问题 the high value of NFTs also makes them a target for attackers. The defects in NFT smart contracts could be exploited by attackers to harm the security and reliability of the NFT ecosystem NFT 的高价值也使其成为攻击者的目标。NFT 智能合约中的缺陷可能被攻击者利用从而损害 NFT 生态系统的安全性和可靠性。 In addition, due to the immutability of smart contracts, it is critical to ensure that the NFT smart contract is bugfree before it is deployed on the blockchain. 智能合约的不可变性意味着一旦部署就无法修改。因此在将 NFT 智能合约部署到区块链之前必须确保其没有缺陷。 Although a set of smart contract defects have been reported in previous work [21], many scenarios cannot be covered due to the increasing complexity and security requirements of smart contracts, e.g., NFT smart contracts 尽管之前的工作已经报告了一些智能合约缺陷但无法涵盖 NFT 智能合约等复杂场景下的所有情况。 创新点 提出5种缺陷 数据收集通过收集StackOverflow 帖子使用“NFT”和“ERC721”标签进行过滤我们获得了 672 个与 NFT 相关的 StackOverflow 帖子和安全分析报告例如 Medium、Twitter 以及知名区块链安全团队如 SlowMist 和 PeckShield 的官方网站88份数据分析 1. Risky Mutable Proxy风险可变代理: 背景 * OpenSea 是 NFT 生态系统中最大、最受欢迎的交易市场。 * OpenSea 使用 Wyvern 协议来促进 NFT 的去中心化交易。 * 当卖家首次在 OpenSea 上列出他们的 NFT 时一个代理注册合约会创建一个智能合约称为 OwnableDelegateProxy。 * 这个合约存储了卖家的地址代理注册合约可以使用这个新合约代表卖家采取行动并调用其他合约的方法。 * 当卖家在他们 NFT 智能合约中列出任何项目时他们会授权代理注册合约转移他们的代币。 * 因此用户不需要为每个 NFT 支付额外的 gas 费用以获取额外批准使得交易变得简单。示例 * 如果代理注册合约的地址可以被修改那么所有用户的代币都可能被转移到攻击者手中。 * 攻击者可以通过代理设置功能更改代理注册地址而无需获得权限。 缺陷代码 setProxyRegistryAddress 函数 function setProxyRegistryAddress(address proxyAddress) external onlyOwner {proxyRegistryAddress proxyAddress; }这个函数允许合约的所有者设置一个新的代理合约地址。这是通过简单地将传入的proxyAddress赋值给状态变量proxyRegistryAddress来实现的。问题在于如果合约的所有者是恶意的或者所有者的私钥被泄露那么攻击者可以利用这个函数将代理合约地址更改为一个他们控制的地址。 isApprovedForAll 函数 function isApprovedForAll(address owner, address operator) override public view returns (bool) {ProxyRegistry proxyRegistry ProxyRegistry(proxyRegistryAddress);if (address(proxyRegistry.proxies(owner)) operator) {return true;}return super.isApprovedForAll(owner, operator); }这个函数检查一个操作者是否有权代表所有者进行操作。它首先尝试通过代理合约来验证操作者是否被授权。如果proxyRegistry.proxies(owner)返回的地址与operator相匹配那么函数返回true表示操作者被授权。如果不匹配它会调用父合约的isApprovedForAll函数来检查是否有其他形式的授权。 安全风险 代理地址可修改性 由于setProxyRegistryAddress函数允许修改代理合约地址这可能被恶意行为者利用。如果代理合约地址被更改为攻击者控制的合约那么攻击者可以通过这个代理合约来控制所有通过它授权的NFT。权限管理漏洞 isApprovedForAll函数的逻辑可能会导致未经授权的操作者获得对NFT的控制权尤其是当代理合约的地址被恶意更改后。 防范措施 限制代理地址修改权限 应该限制或完全禁止修改代理合约地址的功能或者确保只有通过多重签名或其他安全机制才能更改代理地址。增强权限检查 在isApprovedForAll函数中增加更严格的权限检查确保只有经过严格验证的操作者才能被授权。 2. ERC-721 ReentrancyERC-721可重入: 定义 在外部调用后修改状态变量。示例 描述了一种情况其中智能合约在调用外部合约如在safeTransferFrom函数中后没有正确地锁定状态变量导致可以重新进入reentering并修改状态这可能会破坏合约的逻辑。 缺陷代码 function mintNFT(uint256 _numOfTokens, bytes memory _signature) public payable {// 预检查地址是否已经铸造过NFT(bool success, string memory reason) canMint(msg.sender, _signature);require(success, reason);for (uint i 0; i _numOfTokens; i) {_safeMint(msg.sender, totalSupply() 1);}addressMinted[msg.sender] true; }函数定义 mintNFT 函数接受两个参数_numOfTokens 表示要铸造的NFT数量_signature 表示一些验证信息。该函数是 payable 的意味着它可以接收以太币。 预检查 canMint 函数被调用来检查 msg.sender调用者地址是否有权限铸造NFT。这个检查基于传入的签名。如果 canMint 返回 success 为 false则函数会停止执行并显示错误信息 reason。 铸造NFT 通过一个循环为每个要铸造的NFT调用 _safeMint 函数。_safeMint 函数是安全铸造NFT的标准实践它调用接收合约的 onERC721Received 钩子函数以确保接收方合约能够接受NFT。 标记已铸造 循环结束后将 addressMinted[msg.sender] 设置为 true表示该地址已经铸造过NFT。 安全风险 可重入调用 在 _safeMint 调用期间如果接收NFT的合约可能是恶意的实现了 onERC721Received 函数它可以在 _safeMint 调用期间再次调用 mintNFT 函数。状态竞争条件 因为 addressMinted[msg.sender] 在循环结束后才被设置为 true如果在 _safeMint 调用期间 mintNFT 被重新调用那么 canMint 的检查可能会被绕过允许用户铸造超过限制的NFT。大多数情况下这种重入调用会导致铸造的 NFT 数量超过稀有度阈值损害其他买家的利益。 防范措施 互斥锁 在 mintNFT 函数开始时设置一个互斥锁确保在铸造过程中不能再次进入 mintNFT 函数。状态检查提前 在循环内部在每次调用 _safeMint 之前立即更新 addressMinted[msg.sender] 的状态以防止重入。 3. Unlimited Minting无限铸造: 定义 在铸造NFT时不检查NFT的最大供应量。示例 合约中没有适当的检查来限制铸造的NFT数量可能导致超过预定数量的NFT被铸造影响NFT的稀缺性和价值。 缺陷代码解析 function reserveApes() public onlyOwner {uint supply totalSupply();uint i;for (i 0; i 30; i) {_safeMint(msg.sender, supply i);} }函数定义 reserveApes 函数没有参数并且只能由合约的所有者onlyOwner调用。 获取当前供应量 调用 totalSupply() 函数获取当前已铸造的NFT总量并将其存储在变量 supply 中。 铸造NFT 通过一个循环每次循环调用 _safeMint 函数来铸造一个新的NFT。_safeMint 函数接受两个参数接收者地址在这里是 msg.sender即合约所有者和要铸造的NFT的ID在这里是 supply i。 安全风险 无限制铸造 这个函数没有检查每次铸造后是否超出了项目的预定最大供应量。由于在循环中连续调用 _safeMint每次铸造的NFT ID都是基于当前供应量supply这可能导致铸造的NFT数量超出了项目的预定限制。潜在的经济影响 如果攻击者或合约所有者滥用这个功能他们可以无限制地铸造新的NFT这将破坏NFT的稀缺性从而对项目的货币价值和市场信任造成重大损害。 防范措施 最大供应量检查 在铸造每个NFT之前应该检查当前供应量加上预定铸造的数量是否超出了项目的最大供应量限制。事件记录 记录每次铸造的事件包括铸造的数量和铸造后的总供应量以便于审计和监控。权限管理 限制能够调用 reserveApes 函数的地址确保只有经过严格验证的合约所有者或管理者可以执行此操作。 4. Missing Requirements缺少要求: 定义 未遵循ERC-721标准接口的开发注释。示例 开发者在实现合约时没有遵循ERC-721标准的要求例如在approve函数中没有进行必要的权限检查这可能导致安全问题。 缺陷代码解析 /* ERC-721 annotations on approve function */ // Throws unless msg.sender is the current NFT owner, or an authorized operator of the current owner. function approve(address to, uint256 tokenId) public virtual override {address owner ERC721.ownerOf(tokenId);require(to ! owner, ERC721: approval to current owner);/* missing requirement of checking msg.sender */_approve(to, tokenId); }函数注释 注释说明了 approve 函数的预期行为除非 msg.sender 是当前NFT的所有者或被授权的操作者否则应抛出异常。 获取NFT所有者 owner 变量通过调用 ERC721.ownerOf(tokenId) 获取指定NFT的所有者地址。 检查接收者 使用 require 函数检查被授权的地址 (to) 是否不等于NFT的所有者 (owner)。如果是将抛出异常因为逻辑上不应该将NFT授权给其所有者。 缺少调用者检查 注释中提到缺少对 msg.sender 的检查这是ERC-721标准中 approve 函数的一个重要要求。msg.sender 应该是NFT的所有者或被授权的操作者。 实际授权 调用 ERC721 合约的内部函数 _approve 来实际设置授权允许地址 to 转移或操作指定的 tokenId。 安全风险 授权给非所有者或非授权操作者 由于缺少对 msg.sender 的检查任何人都可以调用此 approve 函数尝试授权自己为特定NFT的操作者。如果这个缺陷被利用攻击者可以授权自己操作他人的NFT然后转移或以其他方式滥用这些NFT。 防范措施 调用者检查 在 approve 函数中添加对 msg.sender 的检查确保只有NFT的所有者或已授权的操作者可以调用此函数。require(msg.sender owner || isApprovedForAll(owner, msg.sender), ERC721: approve caller is not owner nor authorized);遵循ERC-721标准 确保实现符合ERC-721标准的所有要求包括对调用者身份的验证。 5. Public Burn公开销毁: 定义 在销毁NFT的操作中未检查调用者权限。示例 合约中的burn函数是公开的没有适当的权限检查任何用户都可以调用它来销毁他人的NFT这显然违背了NFT所有权的基本原则。 缺陷代码解析 function burn(uint256 tokenId) public {_burn(tokenId); }function _burn(uint256 tokenId) internal virtual {address owner ERC721.ownerOf(tokenId);// Clear approvals_approve(address(0), tokenId);_balances[owner] - 1;delete _owners[tokenId]; }burn 函数 burn 函数是公开的意味着任何外部调用者都可以触发这个函数。它接受一个 tokenId 参数代表要销毁的NFT的ID。函数内部直接调用了一个内部函数 _burn传递了相同的 tokenId。 _burn 函数 _burn 函数是内部的internal意味着它只能在合约内部或继承合约中被调用。它首先获取NFT的所有者地址。然后调用 _approve 函数将NFT的授权地址设置为0这表示撤销所有对该NFT的授权。接下来减少所有者账户的余额计数。最后使用 delete 语句从 _owners 映射中移除该NFT实际上销毁了这个NFT。 安全风险 公开销毁权限 burn 函数是公开的没有对调用者进行检查这意味着任何外部调用者都可以销毁任何NFT而不仅仅是他们自己的。这显然是一个严重的安全漏洞因为它允许任何人销毁他人的资产。所有权检查缺失 在 _burn 函数中尽管获取了NFT的所有者地址但没有检查调用 burn 函数的地址是否与NFT的所有者地址相同。这导致了上述的安全风险。 防范措施 权限检查 在 burn 函数中添加对调用者身份的检查确保只有NFT的所有者可以销毁自己的NFT。function burn(uint256 tokenId) public {require(ownerOf(tokenId) msg.sender, Only the owner can burn the NFT);_burn(tokenId); }增强安全性 考虑为销毁操作添加额外的安全措施例如权限列表或销毁操作的确认机制。 设计NFTGuard 工具 NFTGuard工具概述 主要组件 Inputter 负责接收和处理输入的Solidity源代码。Feature Detector 用于检测合约中的关键特征如映射存储、删除操作和外部调用。CFG Builder 基于符号执行构建控制流图CFG用于分析合约的执行路径。Defect Identifier 根据预定义的规则和模式识别和报告检测到的缺陷。 工作流程 用户输入Solidity源代码该代码被编译成EVM字节码和抽象语法树AST以供进一步分析。Inputter组件从AST中提取源映射信息并使用槽映射来存储变量与它们槽ID之间的映射关系。通过Geth API将合约字节码反汇编成操作码opcodes然后动态构建CFG。在符号执行过程中Feature Detector检测关键的操作特征如映射存储、删除操作和外部调用。Defect Identifier根据预定义的模式和规则报告检测到的缺陷。 结合源代码和字节码信息 NFTGuard利用从源代码和字节码中提取的关键信息来提高检测的准确性和覆盖率。通过分析ASTNFTGuard能够获取状态变量的槽ID和数据类型这些信息在符号执行期间用于监控特定变量的操作。 设计动机 使用源代码信息的目的是为了在执行特定操作码时定位缺陷代码这有助于更有效地检测复杂的NFT智能合约。 扩展性 NFTGuard被设计为一个可扩展的框架支持最新的Solidity编译器版本例如v0.8并允许开发者添加新的检测模式来识别更多类型的缺陷。 实验 数据集 Smart Contract Sanctuary 是一个专为在 Etherscan 上验证过的 Ethereum 智能合约提供存储的仓库。 作者通过关键词“NFT”或“ERC721”过滤提取了 NFT 智能合约。 由于这篇论文撰写时最新的 Solidity 编译器版本是 0.8.16作者选择了这个版本并移除了无法编译的合约。 最终作者获得了 16,527 个智能合约并进行了大规模的实验。 评估效果 合约缺陷Contract Defect这列列出了NFTGuard检测到的缺陷类型。# Defects这列显示了数据集中每个缺陷类型的数量。Per(%)这列显示了数据集中每个缺陷类型的百分比。# Samples这列显示了为评估每个缺陷类型而随机抽取的样本数量。# TP这列显示了每个缺陷类型中被正确检测为缺陷的样本数量真阳性。# FP这列显示了每个缺陷类型中被错误检测为缺陷的样本数量假阳性。Prec(%)这列显示了每个缺陷类型的精确率即真阳性与真阳性加假阳性总数之比。 关于随机抽取 作者通过以下步骤来评估 NFTGuard 的性能 随机抽样从每个缺陷的检测结果中随机抽取一定数量的合约。这些合约是 NFTGuard 报告为阳性的合约。样本大小确定为了确定每个缺陷的样本大小作者采用了基于置信区间的抽样方法。这种方法旨在从总体中推断出特定缺陷的缺陷数量。置信区间和置信水平作者设定了 10% 的置信区间和 95% 的置信水平并计算了需要收集的样本数量。样本数量计算根据计算结果作者为五个缺陷分别计算了所需的样本数量分别为 13、81、86、44 和 30。数据集抽样和手动标注根据计算结果作者对数据集进行了抽样并由两位作者仔细手动标注了这些样本。真阳性和假阳性分离在标注过程中作者将样本分为真阳性和假阳性以便分析 NFTGuard 的性能。相关工作的采用这种评估方法也被其他相关研究采用以评估智能合约缺陷检测工具的性能。 通过这种方法作者能够评估 NFTGuard 在检测 NFT 智能合约缺陷方面的性能包括其精确率和误报情况从而回答 RQ2。
http://www.dnsts.com.cn/news/173882.html

相关文章:

  • 开天猫旗舰店网站建设上海建设银行网站招聘
  • 免费模板下载网站如何加入网站
  • 织梦搭建商城网站wordpress调用php文件上传
  • 恩施市网站建设typecho对比wordpress
  • 建立公司网站需要注意什么黄山公司做网站
  • 网站和域名区别吗设计公司网页欣赏
  • 洛阳头条最新消息重庆网站seo外包
  • wordpress关键字回复手机网站优化怎么做
  • 云南网站建设优化企业台州网站策划台州网站策划
  • 网站制作需要什么北京快速优化排名
  • 网站建设推广报价wordpress 重置管理员密码
  • 做网站服务器需要自己提供吗免费交友软件
  • 衡州网站建设seo免费cms网站管理系统
  • 企业网站建设外包pac网站代理
  • 学校手机网站模板17网一起做网店
  • 百度网盘可以做网站吗?江苏宏远建设集团网站
  • dw做的网站与浏览器不匹配微信小程序会员管理系统怎么做
  • 东莞市南城装饰工程东莞网站建设娱乐网站 建站软件
  • 网站中的下拉菜单奥德贵阳网络推广公司
  • 镇江网站建设教程seo外链自动群发工具
  • 网站建设公司怀化网络搭建视频教程
  • 网站开发报价明细徐州专业网站建设
  • 视频logo免费生成网站软件东莞建网站平台
  • 定制网站和模板网站的区别南宁法拍房源信息
  • 什么网站做玩具的外贸做网站小图标大全
  • 网站前台做好之后再怎么做兰州产品营销网站建设
  • 去哪里找做网站教育app定制
  • 苏州吴江区住房和城乡建设局网站傻瓜一键自助建站系统
  • 怎么做网站关键词优化吉安网站建设343000
  • 物流网站开发公司网站开发命名规则