首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏深入浅出区块链技术

    智能合约审计指南

    本指南将引导你了解审计智能合约的基础知识和一些常见的智能合约漏洞。 第 1 部分:为什么要审计你的智能合约? 智能合约之所以重要,有很多原因。 这些黑客是由于智能合约中的漏洞导致的,这使得黑客可以窃取存储在这些合约中价值数百万美元的加密货币。 第二部分:如何开始审计 在你开始审计之前,你应该首先进行一次安全 review。 第 3 部分:智能合约审计的不同阶段 智能合约审计的不同阶段包括: 确定审计的目标和目的: 这一步你要设定智能合约审计的目标和目的。 进行审计: 真正的工作,试图在智能合约的代码中找到漏洞。 撰写审计报告: 现在你所有的辛勤工作都结束了,是时候把你在审计过程中发现的情况写成报告了。 这种类型的漏洞可以被任何能够访问合约的人所利用,并可能导致合约被破坏。 第 10 部分:整数算术错误 当你在编写智能合约时,一定要注意整数算术错误。

    1.6K20编辑于 2022-11-07
  • 来自专栏网络安全攻防

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

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

    1.5K40编辑于 2023-08-10
  • 来自专栏网络安全攻防

    智能合约审计之evilReflex攻击

    approve操作时发出相关的调用通知,而在上述代码的L136处_spender.call(_extraData)中的_extraData为用户可控参数,而在solidity语言中可以通过call方法来实现对某个合约或者本地合约的某个方法进行调用 bytecode之后作为_extraData参数传入,之后通过_spender.call(_extraData)实现对合约中的任意方法的调用,而此时的_spender也是可控的,所以也可以在存在漏洞的合约中调用任意合约的任意方法并为其提供相关的方法参数 漏洞演示 下面我们来做一个漏洞演示,模拟如何通过evilReflex漏洞窃取合约自身的token到任意地址,下面是存在漏洞的合约代码: pragma solidity ^0.4.26; contract the founder function HACKME() { founder = msg.sender; totalSupply = 20180000 * 10 合约地址:0xf8e81D47203A594245E36C48e151709F0C19fBe8 合约资产:10090000000000000000000000 image.png image.png

    59920发布于 2021-07-16
  • 来自专栏Seebug漏洞平台

    以太坊智能合约审计 CheckList

    作者:知道创宇404区块链安全研究团队 时间:2018年11月12日 在以太坊合约审计checkList中,我将以太坊合约审计中遇到的问题分为5大种,包括编码规范问题、设计缺陷问题、编码安全问题、编码设计问题 其中涵盖了超过29种会出现以太坊智能合约审计过程中遇到的问题。帮助智能合约的开发者和安全工作者快速入门智能合约安全。 initialSupply, string tokenName, string tokenSymbol ) public { totalSupply = initialSupply * 10 owner; uint256 public totalSupply; function OPL() public { totalSupply = 210000000 * 10 https://solidity.readthedocs.io/en/develop/security-considerations.html#tx-origin (10) 条件竞争问题 合约中尽量避免对交易顺序的依赖

    1.3K31发布于 2018-12-13
  • 来自专栏区块链入门

    如何做智能合约审计

    我已经研究过很多智能合约审计,并且我已经找到了从任何合约中提取所有重要信息的最常规步骤。 在本文中,你将会学到以下内容: 生成对一个智能合约的完整审计报告所需的所有步骤。 让我们直接开始审计合约吧: 如何审计一个智能合约 为了教会你如何进行审计,我会审计我自己写的一份合约。这样,你可以看到可以由你自行完成的真实世界的审计审计总结: 你对合约的看法和关于审计的最终结论。 将这份结构说明保存在一个安全的地方,这是你安全地审计智能合约时需要做的全部内容。它将确实地帮助你找到那些难以发现的漏洞。 Casino.sol的审计报告: 序言 在这份智能合约审计报告中将包含以下内容: 免责声明 审计概览和优良特性 对合约的攻击 合约中发现的严重漏洞 合约中发现的中等漏洞 低严重性的漏洞 逐行评注 审计总结 此智能合约的目的是参与随机抽奖,人们在1到9之间下注。当有10个人下注时,奖金会自动分配给赢家。每个用户都有一个最低下注金额。

    1.6K20发布于 2018-08-10
  • 来自专栏网络安全攻防

    智能合约审计之算术精度

    在使用Solidity开发智能合约时,你会发现Solidity和普通编程语言有一个较大的区别——Solidity没有浮点型,且Solidity所有的数值运算结果都只会是整数,不会出现小数的情况,同时也不允许定义小数类型数据 确实,之前是定义了,但是这里就是在问,到底再编写智能合约时是先把同级运算中的乘法放到前面还是先把除法运算放到前面呢?也许,有读者已经发现问题了! test函数的左右只是根据用户输入的a,b,c的值进行数值运算,之后返回result的结果,下面我们将a,b,c依次赋值如下: a:5 b:2 c:10 image.png 之后我们查看output结果信息 result=0; result= a*c/b; return result; } } image.png 之后,传入同样的值: a:5 b:2 c:10 游戏合约中的游戏币的兑换功能、货币的买卖 文末小结 智能合约在发布之前应该在本地针对合约中的功能逻辑部分进行多次测试,并用不同的测试数据进行多次测试,同时建议对合约的安全性进行安全审计合约开发没小事,

    1.1K30发布于 2021-07-16
  • 来自专栏字节脉搏实验室

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

    文章源自【字节脉搏社区】-字节脉搏实验室 作者-毕竟话少 描述:漏洞合约中某个函数中,使用call()方法发送eth,若eth的接收者为一个合约地址,则会触发该合约的fallback()函数。 若该合约是攻击者的恶意合约,攻击者可以在fallback()函数中重新调用漏洞合约的上述函数,导致重入攻击 核心问题:重要的合约变量在“重入”的过程中没有被修改,从而绕过了限制 ? wei ETH,这里受害者合约ReentrancyGame就部署完成了) 攻击者合约部署ReentrancyAttack(攻击者合约),由于漏洞合约地址在提现的时候需要一定的ETH,所以这里在设置ReentrancyAttack 即可部署攻击者合约,部署完成后点击checkBalance查看当前账户余额为5 wei ETH,说明攻击者合约部署完成了 漏洞攻击-点击ReentrancyAttack(攻击者合约)attack即可攻击 漏洞预防 在将 Ether 发送给外部合约时使用内置的 transfer() 函数 。transfer转账功能只发送 2300 gas 不足以使目的地址/合约调用另一份合约(即重入发送合约)。

    1.3K30发布于 2020-03-08
  • 来自专栏FreeBuf

    如何审计一个智能合约

    在withdraw方法中函数中我们传了10个以太到调用我们合约的调用者中,到目前来说并没有啥问题。然鹅,接受者可以通过多次递归的调用该函数进行恶意利用,具体看下面的流程。 第一个是用于提现的函数调用了存在重入漏洞的智能合约的withdraw()函数发送10个以太到hacker智能合约中,这样就会触发在hacker合约中定义的 function() payable {}这个回调函数 上述过程的最终表现就是当Hacker合约中反复的调用withdarw()函数直到if条件控制语句中的条件达成即count变量最终到达10。 如果合约已经被修复,要思考合约是否已经安全到可以在主网中使用? 更多的审计和Bug的例子 在这里,我们将从一些历史的审计例子和代码片段中找到一些灵感,您可以将它们应用到您自己的智能合约审计中。 请注意,新添加的合约将使它们处于未经审计的状态,因为代码重构可能会引入新的漏洞。最终会造成合约新的问题——无论是在公共审计还是私人审计中。

    1.4K40发布于 2019-10-16
  • 来自专栏网络安全攻防

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

    文章前言 Solidity允许在继承时对状态变量进行歧义命名,定义有变量x的合约A可以继承同样含有状态变量x的合约B,这将导致两个单独版本的x,一个可以从合约A访问, 而另一个则需要从合约B访问,在更复杂的合约系统中 () constant returns (uint x) { uint n = 4; return n+x; // Will return 4 } } 首先部署合约 test3函数来测试当同名的全局变量与局部变量同时存在且局部变量已初始化并与另一个全局变量进行数值运算时作何回应——当前局部变量与所需的全局变量进行数值运算: image.png 下面我们再来看一个示例,合约 TokenSale合约的Presale合约中 fetchCap函数来查看继承合约中的hardcap的数值是多少: 10000000000000000000000=10000ether: image.png 由此可见Presale合约中的同名变量hardcap并未起到预期的作用,在调用fetchCap时使用的变量hardcap依旧源自fetchCap函数所处的合约上下文环境 防御措施 检查合约系统的存储变量布局

    50440发布于 2021-07-16
  • 来自专栏字节脉搏实验室

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

    一些概念 满足“条件竞争”的发生条件 并发访问:对同一个合约发起的调用的交易可以被“并发”的发生,虽然这些交易会被放进交易池线性执行,但是这些交易的执行顺序并不能得到保证。 共享对象:对于一个合约来说,合约的Storage变量就是所有合约函数调用中都能访问的共享对象 写操作:对Storage变量的更新,就是对共享对象的写操作 智能合约的特点 矿工在交易打包前(智能合约真正执行前 ,矿工可能选择对自己有利的打包顺序,而不会带来任何的后果 如果某个重要而秘密的值通过合约的参数传递,矿工可能发起中间人攻击 普通用户可以通过提高gas price的方式,尽可能尝试改变交易顺序,发起竞争条件 漏洞合约分析 ? tokens) 函数在用于授权用户转账额度,在owner修改用户的转账额度的时候,当该操作被用户监听到的时候,可以增大gas price提前转走这比额度 漏洞预防 对于提高gas price的行为:在合约中设置最高的

    85010发布于 2020-05-12
  • 来自专栏中二病也要当白帽子

    solidity合约审计 - Out of gas的处理办法

    这段时间在做solidity以及常见合约漏洞的学习。 在使用测试网络做ethernaut的题目时,经常遇到Out of Gas的错误。 Warning!

    3.1K10发布于 2019-10-19
  • 来自专栏Gcow安全团队

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

    描述:变量在参与运算的过程中,运算结果超出了变量类型所能表示的范围,导致实际存储的计算结果出错 核心问题:非预期的整数溢出将导致智能合约运行出错,影响合约的可靠性和安全性 基础知识 整数溢出的分类 整数上溢 漏洞合约分析 pragma solidity ^0.4.24; contract IntOverflow{ function addNumber(uint a, uint b) public address) onlyOwner { for (uint i = 0; i < addresses.length; i++){ balances[owner] -= 2000 * 10 **8; balances[address[i]] += 2000 * 10**8; Transfer(owner, addresses[i], 2000 * 10**8 } } 漏洞点:通过在distributeBTR函数中调用onlyOwner管理员向指定的用户列表地址进行批量打款,这里就存在一个减法下溢漏洞,当balances[owner]小于2000 * 10

    49010发布于 2020-03-19
  • 来自专栏字节脉搏实验室

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

    描叙: 智能合约开发中,在程序中使用随机数较好的伪随机数是很难的。很多看似无法被预言的随机数种子或变量,实际被预言的难度很低。 核心问题:一旦在智能合约中使用了随机性很差的随机数作为关键变量,就面临着随机数被预言的攻击风险。 ? 编译完成后会出现2个合约分别为RandomGame、AttackRandom部署 将AttackRandom合约中setTarget设置为RandomGame合约地址(0xdc0…46222) 点击attack 发起攻击,然后在RandomGame合约中balances中输入攻击者合约地址(0x8c1…401f5),查询余额,发现为1000 wei ETH,实验成功。 漏洞预防 使用Oraclize提供的一个合约接口库,可以通过链下off-chain的数据流推送data-feed来提供与链状态无关的随机数

    1.3K10发布于 2020-04-21
  • 来自专栏字节脉搏实验室

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

    描述:合约没有设置合理的访问控制模型,以及没有对合约有效的校验导致访问控制漏洞的发生 核心问题:public的恶意使用(本次案例合约为例) ? public 默认状态下,可以进行任何形式的调用 external 可以通过其他合约或者交易来调用,不能在合约内部进行调用 internal 只能在合约(含子合约)内部进行调用 private 只能在合约 (不包含子合约)内部进行调用 逻辑层面的权限约束的函数普及: modifier 1.用于函数执行前的函数检查 2.可以设置参数 3.特殊符号“_”用于指代函数代码的执行位置 ? 使用Remix进行进行调试 首先对合约进行编译(Current version设置为0.4.24,Auto compile,Enable Optimization全部勾上。 编译完成后会出现1个合约为AccessGame 首先部署AccessGame(漏洞合约),Account设置默认管理员地址(0Xca3…a733c),点击Deploy,部署完成后,首先点击owner,查看管理员为

    1.4K20发布于 2020-03-08
  • 来自专栏字节脉搏实验室

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

    描述:以太坊智能合约中使用block.timestamp来向合约提供当前区块的时间戳,并且这个变量通常被用于计算随机数、锁定资金等。 漏洞合约分析 TimeGame1合约分析 ? block.timestamp); //block.timestamp获取当前区块的时间戳 lastBlockTime = block.timestamp; if(lastBlockTime % 10 普通用户可以自己写一个攻击合约来调用lucky(),也是可以自由设置满足交易的时间戳 TimeGame2合约分析 ? 漏洞预防 在合约中使用block.timestamp时,需要充分考虑该变量可以被矿工操纵,评估矿工的操作是否对合约的安全性产生影响 block.timestamp不仅可以被操纵,还可以被同一区块中的其他合约读取

    3.1K31发布于 2020-03-08
  • 来自专栏字节脉搏实验室

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

    描述:变量在参与运算的过程中,运算结果超出了变量类型所能表示的范围,导致实际存储的计算结果出错 核心问题:非预期的整数溢出将导致智能合约运行出错,影响合约的可靠性和安全性 基础知识 整数溢出的分类 整数上溢 Solidity中的整数类型 int8/int16/int24/…/int256(int8表示-127~127) uint8/uint16/uint24/…/uint256(uint8表示0~255) 漏洞合约分析 address) onlyOwner { for (uint i = 0; i < addresses.length; i++){ balances[owner] -= 2000 * 10 **8; balances[address[i]] += 2000 * 10**8; Transfer(owner, addresses[i], 2000 * 10**8 } } 漏洞点:通过在distributeBTR函数中调用onlyOwner管理员向指定的用户列表地址进行批量打款,这里就存在一个减法下溢漏洞,当balances[owner]小于2000 * 10

    1.2K10发布于 2020-03-19
  • 来自专栏Seebug漏洞平台

    以太坊合约审计 CheckList 之变量覆盖问题

    payable { require(msg.value == 0.001 ether || token.allowance(msg.sender,address(this))>=1*(10 public payable { require(msg.value == 0.001 ether || token.allowance(msg.sender,address(this))>=1*(10 “昊天塔(HaoTian)”是知道创宇404区块链安全研究团队独立开发的用于监控、扫描、分析、审计区块链智能合约安全自动化平台。目前Haotian平台智能合约审计功能已经集成了该规则。 截至2018年11月15日,我们使用HaoTian对全网公开的智能合约进行扫描,其中共有277个合约存在潜在的该问题,其中交易量最高的10合约情况如下: ? 总 结 这是一起涉及到底层设计结构的变量覆盖问题,各位智能合约的开发者们可以关于代码中可能存在的这样的问题,避免不必要的损失。 上述变量覆盖问题已经更新到以太坊合约审计checkList

    81820发布于 2018-12-14
  • 来自专栏网络安全攻防

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

    而在操作授权用户授权的资产时需要同步更新授权用户的资产数量,即销毁授权用户特定数量的资产,同时需要更新代币总量以及授权转账的额度,同时burnFrom函数应该具备溢出检查逻辑设计或者使用SafeMath函数进行溢出防御,而不少合约中缺乏 漏洞演示 Step 1:下载合约源代码到本地并使用Remix进行部署调试 https://cn.etherscan.com/address/0xa8ba4095833a3f924d86cb3941099c1abb75ea13 Step 2:查询当前合约owner所持资产数量 Owner地址:0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 所持资产:500000000000000000 数值精度 Step 3:使用合约的owner地址向用户A和用户B分别转账,为后期测试做准备 用户A地址:0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2 转账数量:100000000000000000 Step 5:由于合约中的burnFrom函数存在设计缺陷,在销毁授权用户特定数量的资产时,未更新授权转账的额度,导致被授权账户可以无限制销毁授权账户的资产,下面我们使用B账户来销毁A账户的资产,销毁数量为之前

    87620发布于 2021-07-21
  • 来自专栏字节脉搏实验室

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

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

    1.8K40发布于 2020-03-31
  • 来自专栏Seebug漏洞平台

    以太坊合约审计 CheckList 之“以太坊智能合约编码隐患”影响分析报告

    一、简 介 在知道创宇404区块链安全研究团队整理输出的《知道创宇以太坊合约审计CheckList》中,我们把超过10个问题点归结为开发者容易忽略的问题隐患,其中包括“语法特性”、“数据私密性”、 “昊天塔(HaoTian)”是知道创宇404区块链安全研究团队独立开发的用于监控、扫描、分析、审计区块链智能合约安全自动化平台,目前已经集成了部分基于opcode的审计功能。 我们利用该平台针对上述提到的《知道创宇以太坊合约审计CheckList》中“以太坊智能合约编码隐患”类问题在全网公开的智能合约代码做了扫描分析。 截止2018年10月31日,以太坊合约审计Checklist的所以问题完成了第一轮扫描,第一轮扫描针对以太坊公开的所有合约,其中超过80%的智能合约存在1个以上的安全隐患问题。 在接下来的扫描报告中,我们会公开《以太坊合约审计Checklist》并使用HaoTian对以太坊公链上的所有智能合约进行基于opcode的扫描分析。

    77420发布于 2018-12-11
领券