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

智能合约审计重点

审计流程

  1. 需要先阅读开发人员提供的非代码问题(文档、白皮书、营销材料、博客文章、说明书等,来了解整个项目,创建一个项目是什么的想象。接下来,关注下当前这个智能合约在做什么,而开发人员设计它的初衷是让它做什么)
  2. 整体浏览下,了解智能合约的整体架构,不同合约之间的差异,还有它们之间相互调用的关系(最好是整个图形出来)
  3. 可以尝试使用Surya 这样的安全工具
  4. 最好整理一份漏洞列表以及攻击智能合约的代码(代码模板),列出可能存在的漏洞(形成威胁模型)
  5. 看下可能存在价值交换的地方,比如传输(transfer)、从…转移(transferFrom)、发送(send)、调用(call)、委托调用(delegatecall)、自毁(selfdestruct)等功能,找这些函数的每一个实例,然后从那个调用往后走,看看那个调用是如何被触发的,如果那个调用是安全的并且不能够被操纵,或者没有经过授权的人不能够触发此调用或者类似的东西
  6. (在成千上万行的代码、代码库的时候使用这个办法-查看最关键的几个功能是否含有漏洞)逐行审计(1、寻找是否含有逻辑错误,即虽然不算安全问题,但是没有按照智能合约应该运行的方式去运行。2、检查漏洞列表,确保智能合约存在漏洞列表上的漏洞)
  7. 从攻击者的角度再做一次尝试(比如这个参数设置为这个数值,或者遵循函数调用的这种顺序),运行在slither这样的工具并查看它们的输出,自己写一些测试用例来验证合约的正常运行,浏览代码覆盖率
  8. 模拟用户的心态去尝试做他们做的事情,比如模拟最常用的用途。流动性提供者增加流动性和去除流动性(以各种组合和排列去调用这两个函数),从交换资产的角度(交换一些资产进行多跳交换之类的),这些都是普通用户可能做的事情。(尝试所有奇怪的边缘案例,忽略常见的案例)->这些以用户的角度来看,只是为了确保智能合约的正常工作
  9. 修复,沟通是比较重要的。修复后,验证第一次发现的漏洞,寻找一些小问题。如果发现十几个严重漏洞,可能需要重新写项目。

审计过程中需要注意的点

1、从证券的角度来思考相关的代码问题。

2、人们存入代币,所有者撤走代币,这中间可能存在破坏。

3、审计的时候有些像视图功能和纯函数会被忽略,比如说处理0.4中更新solidity版本的时候,如调用视图功能时solidity会从较新的版本进行静态调用,而不是常规调用。尽管这些可以通过常规调用,但是如果你从solidity调用它们,它们将被straticon调用,这意味着如果此函数试图更改任何状态,将导致恐慌,将发送恢复并且事务中的所有内容都将回滚,所以不需要关注它们(假设这些函数不会修改状态,只是辅助函数)。

4、有一些修饰符和事件,帮助我们了解这个智能合约试图做什么,比如人们在这里存入资金,而这里发出一个事件。一个链下的应用应该捕获这个事件并对这些数据做一些事情就像桥接不同区块链上的代币或者类似的东西,然后就是一些用于撤回和销毁的功能(需要确定它们是否是在紧急情况下出现。

5、建议让所有者成为一个多重签名和一个带有时间锁定的多重签名。而没有单个密钥就可以访问,且所有者可以执行任何操作,应该有一个延迟一天的功能,这样人们可以至少知道发生了什么,但假设人们只是在这里转移了以太币而没有任何回报,我会假设用户已经彻底相信你。

6、一些修复可以打开另一个或者其他含有漏洞的合同(在修复中大量更改智能合约,进行新一轮审计时,前一轮审计将变得不合格;如果修复少就像只是将百分比更改为另一个,即可通过简单的审查跟踪该更改所产生的影响且能够验证。

7、时间锁只是多重签名的守卫,如果多重签名必须执行一个动作,通常是多少秒,但它可以是任何人。如果它必须执行一个活动,然后它必须提交它的意图来执行一个动作,比如至少一天或12小时或某个时间段,然后它才能真正执行这个动作,这样任何使用这个项目的人能够提前知道这件事情发生改变,这样比如他们想要退出项目等。虽然时间锁定在这种情况下不会真正由帮助,因为用户没有办法取回他们的钱,但是如果有这样一个时间锁,假设时间锁现在是一天,如果所有者想从智能合约中提取余额,他们将必须在区块链上创建一个交易,他们必须表明他们打算借此提款平衡功能。现在每个人都有24小时的领先优势,他们知道所有者将调用这个提取余额功能,所以如果这是恶意的或者如果这改变了他们对项目的看法,他们现在可以退出项目,所有者只能在24小时过去后才能调用它,这就是时间锁背后的意识形态。

8、以太坊中多重签名是作为智能合约实现的,这意味着它们只是合约一个地址,它们不关心它是最终用户还是gnosis多重签名或者其他东西,因此只是建议设置一个gnosis多重签名或者其他一些受信任的多重签名,并将该地址设置为此处的所有者。

9、可能会出现模糊测试,即fuzz(对于复杂的智能合约可能模糊测试的时间会很长),也可能出现逆向源代码这种情况

10、正常的代码审计(根据敏感关键字回溯参数传递过程,查找可控变量,正向追踪变量传递过程,寻找敏感功能点,通读功能点代码,敏感函数回溯参数过程,根据敏感函数来逆向追溯参数的传递过程,大多数漏洞是由于函数的使用不当造成的。查看目录结构的适合,注意(1函数集文件,包含公用函数,2配置文件,包括程序运行必须的功能性配置选项及数据库等配置信息,3安全过滤文件,对参数进行过滤,4index文件,即程序的入口文件,了解程序的架构、运行流程,包含的文件。

相关文章:

  • ZIP压缩文件如何加密?忘记密码怎么办?
  • 通过OpenDDSSharp在.NET应用程序中使用OpenDDS
  • 爆肝9万字,我已从小白晋升ARM嵌入式工程师!带你从零熟悉常用的M4嵌入式功能,建议收藏(含码源)
  • vue3.0中echarts实现中图地图的省份切换,并解决多次切换后地图卡死的情况
  • fork函数详解
  • PowerDesigner设计表时显示注释列Comment
  • SpringBoot的filter过滤器
  • Acwing---1231.航班时间
  • 小白一看就懂,交换机VLAN是如何划分的?
  • leetcode 2246. Longest Path With Different Adjacent Characters(不同相邻字母的最长路径)
  • 【蓝桥杯算法 1】AcWing166.飞行员兄弟
  • Python argparse对象与dict对象的相互转化
  • Qt图表操作(QCustomPlot 与 QtCharts的介绍与使用)
  • 代码随想录--数组相关题目整理
  • python学习笔记---IO编程【廖雪峰】
  • 2023年1月Free Excel 第二次打卡
  • 不懂Token,就是别说自己是中级测试工程师
  • SQL优化核心思想:或许你不知道的5条优化技巧
  • 并发场景使用SimpleDateFormat异常问题和解决
  • 【十 三】Netty 私有协议栈开发