首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

智能合约审计指南

本指南将引导你了解审计智能合约基础知识和一些常见智能合约漏洞。 第 1 部分:为什么要审计智能合约智能合约之所以重要,有很多原因。...第 3 部分:智能合约审计不同阶段 智能合约审计不同阶段包括: 确定审计目标和目的: 这一步你要设定智能合约审计目标和目的。...依赖时间戳:这是指合约依靠当前时间戳来确定某些条件。这可以被利用来操纵合约状态。 我们将在以下几点讨论一些常见漏洞。你也可以查看我其他文章,了解更多关于可重入和整数溢出/下溢漏洞信息。...这可能导致程序崩溃,或者更糟糕是,它会消耗所运行系统所有资源,造成拒绝服务攻击。这对智能合约来说是不利,因为它可能导致用户亏损。 另一个例子是当一个程序递归太深时。...AuditorsRoadmap awesome-ethereum-security: https://github.com/crytic/awesome-ethereum-security 结论 本文提供了一份关于审计智能合约指南

1.1K20

智能合约安全审计之路-拒绝服务漏洞

描述:拒绝服务漏洞(DOS)智能合约无法按照设定方式被调用 核心问题:智能合约拒绝服务是一个致命漏洞,因为漏洞导致拒绝服务一般为永久性,无法恢复 ?...拒绝服务原因 意外执行了SELFDESTRUCT指令 访问控制策略出错 Gas达到区块上限 非预期异常抛出 ?...漏洞分析 selfdestruct()合约自毁函数 指令执行后,合约将拒绝服务,地址对应字节码将被标注为删除 合约地址中所有的ETH将被发送到指定新地址 进行ETH转移时,即使目标地址为一个合约地址...,也不会触发该地址fallback函数,因此不需要该合约有任何payable函数 如果selfdestruct函数被非预期执行,则整个合约会拒绝服务 ?...在竞拍合约中,竞拍进行时,每个人向合约发送自己竞拍出价对应ETH 如果有人出价高于当前最高出价者,则合约退还当前最高出价者出价,并且此人成为新最高出价者 攻击者构造一个fallback函数一定会抛出异常合约

1.5K40
您找到你想要的搜索结果了吗?
是的
没有找到

如何做智能合约审计

我已经研究过很多智能合约审计,并且我已经找到了从任何合约中提取所有重要信息最常规步骤。 在本文中,你将会学到以下内容: 生成对一个智能合约完整审计报告所需所有步骤。...让我们直接开始审计合约吧: 如何审计一个智能合约 为了教会你如何进行审计,我会审计我自己写一份合约。这样,你可以看到可以由你自行完成真实世界审计。...审计总结: 你对合约看法和关于审计最终结论。 将这份结构说明保存在一个安全地方,这是你安全地审计智能合约时需要做全部内容。它将确实地帮助你找到那些难以发现漏洞。...译者注: Oraclize是一种为智能合约和区块链应用提供数据独立服务,官网:【http://www.oraclize.it】。...因为类似于比特币脚本或者以太坊智能合约这样区块链应用无法直接获取链外数据,所以就需要一种可以提供链外数据并可以与区块链进行数据交互服务

1.3K20

智能合约安全审计技术概览

,导致资产损失甚至系统崩溃,因此对智能合约进行安全审计是至关重要,本文将概述智能合约安全审计技术相关知识为读者带来更深入了解 智能合约 智能合约是一种基于区块链技术自动化合约,它可以在没有第三方干预情况下自动执行合约条款并将结果记录在区块链上...编码设计 DASP Top 10归纳了智能合约常见安全漏洞,智能合约开发人员在开发合约之前可以先研习智能合约安全漏洞以规避在开发合约时出现安全漏洞,合约审计人员可根据DASP Top 10对智能合约已有安全漏洞进行快速审计检查...场景覆盖面充分以及合约代码覆盖率 安全审计 智能合约在正式上线之前建议先寻找可靠、可信任第三方区块链智能合约安全审计公司对合约安全性进行安全审计评估,在初次审计完成后需要对合约中存在安全漏洞进行修复调整...,同时在修复后还需要请安全审计公司再次进行安全审计来检查漏洞修复是否有效可行,同时也建议项目方在进行安全审计时候可以邀请2-3家安全审计公司进行审计来实现对合约安全多重安全保障 文末小结 智能合约安全审计是区块链应用开发过程中不可或缺一环...目前智能合约安全审计技术已经取得了一定进展,但仍需要不断地进行研究和探索以应对日益复杂区块链安全威胁,相信在未来,随着技术不断进步和完善,智能合约安全审计将成为区块链应用开发必要步骤,为区块链技术发展提供重要保障

70940

智能合约审计之evilReflex攻击

文章前言 在这篇文章中,我们对曾经出现过一种叫做evilReflex安全漏洞进行分析研究,攻击者可以通过该漏洞将存在evilReflex漏洞合约任意数量token转移到任意地址。...L136处_spender.call(_extraData)中_extraData为用户可控参数,而在solidity语言中可以通过call方法来实现对某个合约或者本地合约某个方法进行调用,调用方式大致如下...,在这里我们可以将要调用合约方法以及相关参数转换为bytecode之后作为_extraData参数传入,之后通过_spender.call(_extraData)实现对合约任意方法调用,而此时..._spender也是可控,所以也可以在存在漏洞合约中调用任意合约任意方法并为其提供相关方法参数。...————为0 image.png 之后查看账户资产————加倍 image.png 安全建议 造成evilReflex漏洞根本原因还是在于call注入,在合约开发过程中应尽量避免call调用中方法选择器可控以及相关参数可控性或者直接指定方法选择器来规避类

45420

智能合约审计之算术精度

在使用Solidity开发智能合约时,你会发现Solidity和普通编程语言有一个较大区别——Solidity没有浮点型,且Solidity所有的数值运算结果都只会是整数,不会出现小数情况,同时也不允许定义小数类型数据...同级运算就是从左至右依次进行,这有什么可安排呢?确实,之前是定义了,但是这里就是在问,到底再编写智能合约时是先把同级运算中乘法放到前面还是先把除法运算放到前面呢?也许,有读者已经发现问题了!...下面,我们通过几个实例比较来做一个简单演示说明: 编写合约如下: Arithmetic.sol pragma solidity ^0.4.4; contract ArithmeticTest{...),所以建议在进行数值运算时先进行乘法运算,后进行除法运算,在某些情况下也可以借助于()来改变优先级运算顺序。...游戏合约游戏币兑换功能、货币买卖 文末小结 智能合约在发布之前应该在本地针对合约功能逻辑部分进行多次测试,并用不同测试数据进行多次测试,同时建议合约安全性进行安全审计合约开发没小事,

87130

智能合约安全审计之路-重入攻击

文章源自【字节脉搏社区】-字节脉搏实验室 作者-毕竟话少 描述:漏洞合约中某个函数中,使用call()方法发送eth,若eth接收者为一个合约地址,则会触发该合约fallback()函数。...若该合约是攻击者恶意合约,攻击者可以在fallback()函数中重新调用漏洞合约上述函数,导致重入攻击 核心问题:重要合约变量在“重入”过程中没有被修改,从而绕过了限制 ?...Fallback函数 概念: 回退函数,是合约特殊无名函数,有且仅有一个。它在合约调用没有匹配到函数签名,或者调用没有带任何数据时被自动调用。...wei ETH,这里受害者合约ReentrancyGame就部署完成了) 攻击者合约部署ReentrancyAttack(攻击者合约),由于漏洞合约地址在提现时候需要一定ETH,所以这里在设置ReentrancyAttack...也就是说,要添加一个在代码执行过程中锁定合约状态变量,阻止重入调用。 将任何对未知地址执行外部调用代码,放置在本地化函数或代码执行中作为最后一个操作,是一种很好做法。

1.1K30

如何审计一个智能合约

智能合约审计如同传统代码审计一样是保证代码安全性非常重要基础步骤(审计过程主要经过细致研究对象代码,在代码被最终发布在生产环境之前从中找出可能存在安全性缺陷以及漏洞)。...确保在智能合约发布前进行一次完整代码审计过程,尽可能保证完整审计代码是接近用户最终接触到最终版本智能合约版本。...更多审计和Bug例子 在这里,我们将从一些历史审计例子和代码片段中找到一些灵感,您可以将它们应用到您自己智能合约审计中。...Conclusion 本指南提供审计大纲一般适用于各类智能合约,但针对是Ethereum合约,这是目前最流行合约,因此交易资金最多,将它们置于最高攻击风险和最大审计需求。...如果你有兴趣获得支付审计智能合同,或如果你需要你智能合同审计可以看看 Bountyone.io 进一步阅读 由于区块链技术仍然是一个新兴、快速发展领域,因此没有用于全面解决方案首选资源,因此我们建议使用各种资源来增强您对本指南理解

1K40

智能合约审计之变量歧义命名

文章前言 Solidity允许在继承时对状态变量进行歧义命名,定义有变量x合约A可以继承同样含有状态变量x合约B,这将导致两个单独版本x,一个可以从合约A访问, 而另一个则需要从合约B访问,在更复杂合约系统中...: image.png 之后调用Tokensale合约fetchCap函数来查看hardcap数值—10000000000000000000000=10000ether: image.png 之后调用继承自...TokenSale合约Presale合约中 fetchCap函数来查看继承合约hardcap数值是多少: 10000000000000000000000=10000ether: image.png...由此可见Presale合约同名变量hardcap并未起到预期作用,在调用fetchCap时使用变量hardcap依旧源自fetchCap函数所处合约上下文环境 防御措施 检查合约系统存储变量布局...: image.png 之后调用fetchCap进行测试,效果如下所示: image.png 文末小结 在复杂性合约逻辑设计过程中,对于变量名称定义建议具备"专名专用"特性,同时对全局变量与局部变量进行合理使用

38940

智能合约安全审计之路-条件竞争

一些概念 满足“条件竞争”发生条件 并发访问:对同一个合约发起调用交易可以被“并发”发生,虽然这些交易会被放进交易池线性执行,但是这些交易执行顺序并不能得到保证。...共享对象:对于一个合约来说,合约Storage变量就是所有合约函数调用中都能访问共享对象 写操作:对Storage变量更新,就是对共享对象写操作 智能合约特点 矿工在交易打包前(智能合约真正执行前...)看到函数调用参数并预测结果,可以选择对该笔交易是否打包及调准打包顺序 正常情况下矿工打包顺序是按照gas price从大到小顺序,普通用户可以利用这一点来提升交易优先级 漏洞危害 如果特定交易顺序导致合约执行结果对矿工有利...,矿工可能选择对自己有利打包顺序,而不会带来任何后果 如果某个重要而秘密值通过合约参数传递,矿工可能发起中间人攻击 普通用户可以通过提高gas price方式,尽可能尝试改变交易顺序,发起竞争条件...提前转走这比额度 漏洞预防 对于提高gas price行为:在合约中设置最高gas price限制,防止用户通过提高gas price来操纵交易顺序

67810

关于编写安全智能合约

译文出自:登链翻译计划[1] 译者:翻译小组[2] 校对:Tiny 熊[3] 译者注:本文作者是Matthew Di Ferrante[4], 是 ZK Labs 创始人,也是一个知名智能合约开发者及审计人员...举个例子:现在有多少人在写智能合约时知道 ETH 可以在不调用回退函数情况下被发送到合约中,即使该函数是不可支付(non-payable?)?...有多少智能合约在持有 USDC 时,在其内部逻辑中正确处理了这种情况:USDC 管理员将他们地址列入黑名单,并使所有的转账调用失败或抹去其余额?...甚至在一个团队中,如果有人代码看起来以一种方式工作,却奇技淫巧地做了其他事情,那么在该代码基础上用这种破碎假设进行构建,可能会导致在审计中没有发现漏洞,因为如果暴露属性足够细微,审计人员会根据他们自己已有认知...最后,没有比阅读其他人智能合约更好投资回报率了--阅读比你差的人代码,这样你可以从他们错误中学习,来自比你好的人代码,这样你可以看到你可能做错了什么,阅读尽可能多不同来源和领域代码。

39820

智能合约安全审计之路-随机误用漏洞

描叙: 智能合约开发中,在程序中使用随机数较好伪随机数是很难。很多看似无法被预言随机数种子或变量,实际被预言难度很低。...核心问题:一旦在智能合约中使用了随机性很差随机数作为关键变量,就面临着随机数被预言攻击风险。 ?...一些概念 智能合约常用随机数计算方式 keccak256(seed) 常用seed选取: 私有变量 区块有关状态block.something msg.sender 上述数据哈希或者运算组合 ?...,是一种常见但是非常不安全方式,其不安全在于,这些数据对于同一个transaction中合约调用是可预测。...漏洞预防 使用Oraclize提供一个合约接口库,可以通过链下off-chain数据流推送data-feed来提供与链状态无关随机数

1.1K10

智能合约安全审计之路-整数溢出漏洞

描述:变量在参与运算过程中,运算结果超出了变量类型所能表示范围,导致实际存储计算结果出错 核心问题:非预期整数溢出将导致智能合约运行出错,影响合约可靠性和安全性 基础知识 整数溢出分类 整数上溢...整数下溢 整数分类 有符号数(int) 无符号数(uint) Solidity中整数类型 int8/int16/int24/…/int256(int8表示-127~127) uint8/uint16...漏洞合约分析 pragma solidity ^0.4.24; contract IntOverflow{ function addNumber(uint a, uint b) public...,这里就存在一个减法下溢漏洞,当balances[owner]小于2000 * 10**8时候,这个时候balances[owner]就为负数,但是在uint数表示范围之内,balances[owner...]值就是一个超级大数,管理员可以通过这个漏洞对自己balances进行增持。

37610

智能合约安全审计之路-访问控制漏洞

描述:合约没有设置合理访问控制模型,以及没有对合约有效校验导致访问控制漏洞发生 核心问题:public恶意使用(本次案例合约为例) ?...漏洞描述 智能合约访问控制漏洞主要体现在以下俩个方面: 代码层面可见性 针对函数和变量,限制其所能被修改和调用作用域 逻辑层面权限约束 通常针对函数,限制某些特权用户访问 代码层面可见性函数普及:...public 默认状态下,可以进行任何形式调用 external 可以通过其他合约或者交易来调用,不能在合约内部进行调用 internal 只能在合约(含子合约)内部进行调用 private 只能在合约...(不包含子合约)内部进行调用 逻辑层面的权限约束函数普及: modifier 1.用于函数执行前函数检查 2.可以设置参数 3.特殊符号“_”用于指代函数代码执行位置 ?...漏洞预防 设计合理访问控制模型,并在代码中进行校验 合理使用可见性约束和modifier 使用形式化验证检测智能合约访问控制漏洞 ?

1.2K20

智能合约安全审计之路-整数溢出漏洞

描述:变量在参与运算过程中,运算结果超出了变量类型所能表示范围,导致实际存储计算结果出错 核心问题:非预期整数溢出将导致智能合约运行出错,影响合约可靠性和安全性 基础知识 整数溢出分类 整数上溢...整数下溢 整数分类 有符号数(int) 无符号数(uint) Solidity中整数类型 int8/int16/int24/…/int256(int8表示-127~127) uint8/uint16.../uint24/…/uint256(uint8表示0~255) 漏洞合约分析 pragma solidity ^0.4.24; contract IntOverflow{ function...,这里就存在一个减法下溢漏洞,当balances[owner]小于2000 * 10**8时候,这个时候balances[owner]就为负数,但是在uint数表示范围之内,balances[owner...]值就是一个超级大数,管理员可以通过这个漏洞对自己balances进行增持。

98610

智能合约安全审计之路-时间操纵漏洞

描述:以太坊智能合约中使用block.timestamp来向合约提供当前区块时间戳,并且这个变量通常被用于计算随机数、锁定资金等。...但是区块打包时间并不是系统设定,而是可以由矿工在一定幅度内进行自行调整。因此,一旦时间戳使用不当,则会引起漏洞 核心问题:矿工操纵时间戳生成对自己有利随机数,或者来解除合约时间限制 ?...普通用户可以自己写一个攻击合约来调用lucky(),也是可以自由设置满足交易时间戳 TimeGame2合约分析 ?...漏洞预防 在合约中使用block.timestamp时,需要充分考虑该变量可以被矿工操纵,评估矿工操作是否对合约安全性产生影响 block.timestamp不仅可以被操纵,还可以被同一区块中其他合约读取...,因此不能用于产生随机数或用于改变合约重要状态、判断游戏胜负等 需要进行资金锁定等操作时,如果对于时间操纵比较敏感,建议使用区块高度、近期区块平均时间等数据来进行资金锁定,这些数据不能被矿工操纵 ?

2.8K31

Solidity开发智能合约安全建议

因此,每一个外部调用都会有潜在安全威胁,尽可能从你智能合约内移除外部调用。当无法完全去除外部调用时,可以使用这一章节其他部分提供建议来尽量减少风险。...尽管这些外部智能合约函数可以被触发执行,但补贴给外部智能合约2,300 gas,意味着仅仅只够记录一个event到日志中。...尽管如此,Interfaces在实现智能合约之前设计智能合约阶段仍然有很大用处。...智能合约应该应该使用和它们测试时使用最多编译器相同版本来部署。...关于如何在以太坊上设计一个合约升级系统是一个正处于积极研究领域,在这篇文章当中我们没法覆盖所有复杂领域。然而,这里有两个通用基本方法。

1.3K50

智能合约审计之BurnFrom设计缺陷攻击演示

同时burnFrom函数应该具备溢出检查逻辑设计或者使用SafeMath函数进行溢出防御,而不少合约中缺乏allowance更新操作,甚至存在下溢问题、特权后门等。...Step 2:查询当前合约owner所持资产数量 Owner地址:0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 所持资产:500000000000000000 数值精度...Step 3:使用合约owner地址向用户A和用户B分别转账,为后期测试做准备 用户A地址:0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2 转账数量:100000000000000000...Step 5:由于合约burnFrom函数存在设计缺陷,在销毁授权用户特定数量资产时,未更新授权转账额度,导致被授权账户可以无限制销毁授权账户资产,下面我们使用B账户来销毁A账户资产,销毁数量为之前...依次类推,可知授权用户B可以销毁被授权用户A所有的资产 安全建议 采用OpenZeppelin官方标准 https://github.com/OpenZeppelin/openzeppelin-contracts

74120

智能合约审计之一致性检查

文章前言 本篇文章将对Lightcoin合约内transfeFrom授权转账函数allowance不一致性问题和CountryCoin合约内transfeFrombalance不一致性问题进行简单分析介绍...A资产,直到转完账户所有余额 image.png balances不一致性 漏洞介绍:如下面的代码所示,条件检测语句"require(balances[msg.sender] >= _value);...首先,下载Lightcoin合约代码之后在本地Remix中进行部署调试(这里需要改一下合约中owner地址便于调试),相关账户地址信息如下所示: 管理者:0x5B38Da6a701c568545dCfcB03FcB875f56beddC4...","0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db" image.png balances不一致性 首先,下载CountryCoin合约然后在Remix中进行部署分析调试...token数量为: image.png 另一个攻击者2地址账户余额为0 image.png Step 2:接下来我们攻击就是让第二个账户溢出,之后使用攻击者2给予攻击者1一定转账额度权限 approve

45810
领券