solidity 合约权限授权_智能合约:整数溢出、访问控制缺陷漏洞与跨合约调用漏洞...

2023-10-28

整数溢出:

漏洞简介:
简单来说,就是Solidity整形变量被赋值高于或者低于可以表示的范围时 值会发生改变 一般会溢出为2的uint类型次方 -1 或者 0:
**上溢:会溢出为0
下溢:会溢为2*n-1 如果是uint256 即为:2的256次方 -1

漏洞通常出现地方:
1.条件检测的地方容易出现
2.任何计算的地方都可能出现

规避方法:
1.在solidity中运算之前 必须对输入和输出进行有效性认证
在进行任何计算之前,务必对操作数进行可能溢出与否的预判,或者用safemath库来编写计算逻辑,否则就可能会出现溢出问题;

实际案例:
Beauty Chain中出现的整数溢出漏洞:
eth address: 0xC5d105E63711398aF9bbff092d4B6769C82F793D
源码搜索此地址:
https://etherscan.io/address/0xC5d105E63711398aF9bbff092d4B6769C82F793D#code

整数溢出部分代码:
function batchTransfer(address[] _reveivers,uint256 _value) public whenNotPaused returns(bool) {

//在这里只讨论存在溢出的部分的代码 其余部分省略 有兴趣可以在上述网址查看源码进行审计

uint cnt = _reveivers.length;
uint256 amount = uint256(cnt) * _value;
require(cnt >0 && cnt <= 20);
requitre(_value >0 && balances[msg.sender]>=amount);
(接下来是一些转账运算)

}

代码逻辑分析:
在这里 代码逻辑主要是检测交易发起人的余额是否大于要转账的总余额(转账人数 * 转给每个人的钱) 如果大于 就转账

漏洞利用:
注意该合约在进行乘法运算的时候,直接用cnt强转uint256然后乘以_value, 这个时候如果乘积溢出uint256最大值,那么就可以绕过require中的要求,并且进行非法请求

具体操作:
将_value 传值 2**256 +1 / 2
2为address数组长度 即两个收款人地址 这个具体是几无所谓 只要保证溢出条件即可(即 2 * (2的256次方+1)/2 = 2的256次方 +1 > uint256最大值)
那么 amount就溢出为0 那么就绕过了下面的require 从而进行非法操作

P.S.
python生成的数 方便审计检测使用:
unsigned int range:
Unsigned int(uint) 最大表示数 超过此数会上溢为0:
uint8 最高为: 255
uint16 最高为: 65535
uint24 最高为: 16777215
uint32 最高为: 4294967295
uint40 最高为: 1099511627775
uint48 最高为: 281474976710655
uint56 最高为: 72057594037927935
uint64 最高为: 18446744073709551615
uint72 最高为: 4722366482869645213695
uint80 最高为: 1208925819614629174706175
uint88 最高为: 309485009821345068724781055
uint96 最高为: 79228162514264337593543950335
uint104 最高为: 20282409603651670423947251286015
uint112 最高为: 5192296858534827628530496329220095
uint120 最高为: 1329227995784915872903807060280344575
uint128 最高为: 340282366920938463463374607431768211455
uint136 最高为: 87112285931760246646623899502532662132735
uint144 最高为: 22300745198530623141535718272648361505980415
uint152 最高为: 5708990770823839524233143877797980545530986495
uint160 最高为: 1461501637330902918203684832716283019655932542975
uint168 最高为: 374144419156711147060143317175368453031918731001855
uint176 最高为: 95780971304118053647396689196894323976171195136475135
uint184 最高为: 24519928653854221733733552434404946937899825954937634815
uint192 最高为: 6277101735386680763835789423207666416102355444464034512895
uint200 最高为: 1606938044258990275541962092341162602522202993782792835301375
uint208 最高为: 411376139330301510538742295639337626245683966408394965837152255
uint216 最高为: 105312291668557186697918027683670432318895095400549111254310977535
uint224 最高为: 26959946667150639794667015087019630673637144422540572481103610249215
uint232 最高为: 6901746346790563787434755862277025452451108972170386555162524223799295
uint240 最高为: 1766847064778384329583297500742918515827483896875618958121606201292619775
uint248 最高为: 452312848583266388373324160190187140051835877600158453279131187530910662655
uint256 最高为: 115792089237316195423570985008687907853269984665640564039457584007913129639935

访问控制缺陷漏洞:

漏洞简介:
即某些对权限有要求的方法的修饰符逻辑错误造成合约中的某些私有函数可以被非法调用

常出现的地方:

在function修饰符modifier上 或者访问权限 private public internal external 调用方法:call delegatecall中

防范方法:
1.在编写合约的时候 务必检查好函数调用权限 调用逻辑一定要清晰 否则一旦部署到区块链上 则不可更改 容易造成经济损失
2.避免disable enable在合约逻辑中存在
3.敏感变量必须通过函数修饰符进行权限控制 对可以操纵合约内部敏感变量的函数 应该用assert if-else等进行权限限制

漏洞举例:

IcxToken 合约中的 
modifier onlyFromWallet {
    require(msg.sender != walletAddress);
    _;



function disableTokenTransfer()
external
onlyFromWallet {
    tokenTransfer = false;
    TokenTransfer();
}

function IcxToken( uint initial_balance, address wallet) {
    require(wallet != 0);
    require(initial_balance != 0);
    _balances[msg.sender] = initial_balance;
    _supply = initial_balance;
    walletAddress = wallet;
    }

在 disableTokenTransfer方法中 关闭合约交易权限应该只能由wallet执行
否则 如果被恶意调用disableTokenTransfer函数 那么该合约中被isTokenTransfer修饰的函数均不可正常使用
即这里的msg.sender != walletAddress 应该为 msg.sender == walletAddress

利用方法:
只要调用disableTokenTransfer的地址不是walletaddress即可
在remix实验时,可以直接点击函数进行调用

智能合约

跨合约调用漏洞:

漏洞简介:
由call系列函数引起的外部合约注入,即外部合约A调用B合约中的私有 || 具有权限限制的函数

原理解释:
solidity中 合约相互调用有两种:
对象:合约地址当作合约对象适用 然后调用
用call() delegatecall() callcode()

方法解释:
call函数与delegatecall函数:
比如:
B中的function名字为 Bfunc
如果 A合约中以call方式调用B合约的Bfunc 那么Bfunc会在B合约上下文中执行 结果返回给A合约
如果用delegatecall调用Bfunc 那么会将Bfunc方法以“复制粘贴”的方式放在A合约中(A中需要包含Bfunc所需函数与变量),然后在A合约中调用

安全漏洞主要是由call()方法调用引起的:
call():
调用方法:
address.call(function_name, args[])
|| address.call(bytes)

漏洞代码:

 contract sample{
    
 
 function a(byte data) {
 this.call(data)
}
 function secret public{
 require(this == msg.sender)
 //code
}
}

在这个合约中 secret函数要求调用方必须为合约自己
如果在函数a中 合约byte码指向的合约构造了一个调用:调用secret函数 那么根据call函数机制 会将此代码“粘贴”到secret函数中
那么通过a函数 就可以调用secret函数 达到注入攻击目的

关于callcode的漏洞:
EVM中,对callcode方法:传参时,不会验证参数的个数,只要找到了需要的参数,其他参数就会忽略 不会产生影响

漏洞地址(之后补上):

防范方法:
出现这类漏洞的根本在于滥用call系列方法,防范自然是减少此类方法使用 比如交易可以用transfer()实现

实例:漏洞代码:

 contract sample{
    
 
 function a(byte data) {
 this.call(data)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

solidity 合约权限授权_智能合约:整数溢出、访问控制缺陷漏洞与跨合约调用漏洞... 的相关文章

  • 使用echarts实现简单的关系图谱

    使用echarts实现简单的关系图谱 如图 代码
  • pytorch载入数据与对应的标签,使用torch.utils.data详解,DataLoader的使用

    在进行深度学习处理的时候 我们需要将数据输入到神经网络中进行训练 训练网络的学习能力 其实是根据一定的规则更新网络节点中的参数 而这个规则的来源就是依赖于数据与标签 我们需要将数据与标签相匹配 才能让网络进行训练 比如说网络学习到了一定的特
  • stem教育资源

    人生不同阶段都有不同的使命 在学生阶段 学习掌握知识为以后的人生获得成就的能力 就是这个阶段使命 为了这个使命 他们必须要学习忍耐 学会放弃 学会付出 这不仅仅是学习的需要 也是人生的一种修炼 纵观我们身边的人 但凡取得一定成就的都是要经过
  • 用 LangChain 构建基于资料库的问答机器人(三):ReAct

    大家好 我是 Jambo 我们已经学习了如何使用 LangChain 的一些基本功能 解下我们就应该要结合这些功能来做一些复杂的东西了 但在这之前 为了让同学们更好的理解 LangChain 在这其中做了什么 我想先介绍一下关于 GPT 使
  • 修改索引值python_pandas DataFrame的修改方法(值、列、索引)

    对于DataFrame的修改操作其实有很多 不单单是某个部分的值的修改 还有一些索引的修改 列名的修改 类型修改等等 我们仅选取部分进行介绍 一 值的修改 DataFrame的修改方法 其实前面介绍loc方法的时候介绍了一些 1 loc方法
  • STM32 IAP Ymodem

    STM32 IAP采用Ymodem协议升级固件 公司最近软件需要通过IAP来升级所有板卡的固件 其中板卡有2块 一块主控板卡 一块子控板卡 其中 主控板卡与子控板卡之间采用RS485通信 PC与主控板卡采用RS232通信 具体框架 一 PC
  • pc817光耦参数_光耦在电子电路中有什么作用?关键参数有哪些?一起了解一下...

    光耦作为一个可以对信号进行电气隔离的电子元器件 常用于开关电源电压反馈隔离 电路隔离控制 光耦在电子电路中有不可或缺的地位 了解光偶的特性对学习电子电路有不少帮助 开关电源电压反馈 光耦隔离控制继电器 今天就一起来了解一下光耦吧 电子元器件
  • linkstack头文件 c语言,链式栈的基本操作——LinkStack(C语言版)

    include stdafx h include define OK 1 define ERROR 0 define TRUE 1 define FALSE 0 define MAXSIZE 20 存储空间初始分配量 typedef int
  • odoo10源码win系统开发环境安装图文教程

    前言 odoo10的源码安装教程不太完整或对新手不够友好 本新手再次整合出一份友好的新手教程 老鸟慎入 准备工作 一个干净的window系统 事先没有其他python环境的系统 如果怕系统污染可以先用虚拟机安装熟悉了再正式安装 亲测wind
  • 【论文写作】——设置中英文字体

    打开文件 点击选项 选择高级 取消中文字体也应用于西文的勾选 然后选中全文 设置中文字体为宋体 设置英文字体为times new Roman
  • flask框架

    flask框架 一 flask简介 二 初体验 三 flask配置 1 开启debug模式 2 如何正确显示中文 2 1 配置文件的优化 四 URL与视图 1 构造URL url for 五 指定HTTP方法 六 页面跳转和重定向 七 模板
  • 【PostMan】postman如何发送并发请求

    1 概述 假设我们有一个接口 单次调用可以调通 然后我们将这个接口加入到集合 也可以复制一个接口或者多个到集合 然后点击 后面点击运行就可以模拟 20个线程 轮训集合中的接口 并发的调用
  • [423]定时任务(saturn)

    项目地址 https github com vipshop Saturn 参考文档 https vipshop github io Saturn zh cn 3 0 https vipshop github io Saturn zh cn
  • 揭秘python函数:编程艺术的核心力量

    文章目录 前言 什么是 python 函数 函数的使用步骤 1 定义函数 2 调用函数 带有参数的函数 函数的返回值 函数的说明文档 函数的嵌套调用 实现简易的计算器 前言 当我们深入研究 Python 的内心深处 我们将会发现 函数是其内
  • c语言的文件末尾没有换行符,为什么文本文件应该以换行符结尾?

    这个答案是一种技术性的回答 而不是意见 如果我们想成为POSIX纯粹主义者 我们定义一条线为 零个或多个非字符加上终止字符的序列 不完整的一行 如 文件末尾一个或多个非字符的序列 文本文件 如 包含组织成零行或多行的字符的文件 这些行不包含
  • 面向对象基础--类和对象

    类和对象的关系 一 对象 用来描述客观事物的一个实体 由一组属性和方法构成 对象是由静态特征和动态特征组成 1 静态特征 属性 2 动态特征 方法 对象的特征 属性 属性 对象具有的各种特征 每个对象的每个属性都拥有特定值 对象的特征 方法
  • npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

    npm 无法将 npm 项识别为 cmdlet 函数 脚本文件或可运行程序的名称 请检查名称的拼写 如果包括路径 请确保路径正确 然后再试一次 目录 一 报错 二 解决 1 安装node js node js安装过程中的报错问题 解决nod
  • 五大板块(4)——链表

    参考 五大板块 4 链表 作者 丶PURSUING 发布时间 2021 02 15 09 33 29 网址 https blog csdn net weixin 44742824 article details 114981905 目录 一

随机推荐

  • index=False含义

    index False含义 输出不显示index 索引 值 在输出代码行中 加入 index False 如下 m pred survived to csv clasified csv index False
  • 深度学习(30)随机梯度下降七: 多层感知机梯度(反向传播算法)

    深度学习 30 随机梯度下降八 多层感知机梯度 反向传播算法 1 多层感知机模型 2 多层感知机梯度 3 传播规律小结 tens Recap Chain Rule Multi output Perceptron E
  • Unity--使用Cinemachine Confiner设置摄像机边界

    使用Cinemachine Confiner设置摄像机边界 前提提要 在做这个功能前需要 main camera 另外一个相机 思路 创建一个对象绑定Polygon Collider2D 边界 然后在另外一个相机Cinemachine Co
  • 嵌入式Linux:简单的模块源码分析

    目录 1 常用命令 2 insmod与module init宏 这里还有一个知识点 函数修饰符 3 模块的版本信息查看 模块中常用宏 printk函数 调试程序是可以用到 打印机别 0 7 关于驱动模块中的头文件 1 常用命令 lsmod
  • Linux 服务器安装配置vsftpd

    一 基础安装阶段 1 查看是否已安装ftp which vsftpd 2 查看ftp状态 service vsftpd status 3 若是以上检查均没有安装ftp 查询是否有可用的rpm安装包 yum list grep vsftpd
  • 通过vcpkg安装、配置 CGAL 5.2.1

    1 背景 CGAL是Computational Geometry Algorithms Library 计算几何算法库 的缩写 用C 语言提供高效 可靠的算法库 被广泛应用于几何计算相关的领域 如信息可视化系统 计算机辅助设计 分子生物学
  • LeetCode20. 有效的括号

    20 有效的括号 给定一个只包括 的字符串 判断字符串是否有效 有效字符串需满足 左括号必须用相同类型的右括号闭合 左括号必须以正确的顺序闭合 注意空字符串可被认为是有效字符串 示例 1 输入 输出 true 示例 2 输入 输出 true
  • Servlet的初始化时期

    初始化时期 概述 默认情况 Servlet在第一次请求时初始化 要求Servlet随着服务器的启动而初始化 这就需要设置servlet的初始化时机 load on startup进行设置 范围1 10 值越小 优先级越大 代码实现 Serv
  • qml中,在ListView中添加滚轮无法展现最后几行数据的问题解决

    这个是我困扰我数几个小时的问题 好不容易知道了如何在LIstView中添加滚轮 然而 当我鼠标滚轮到最后的时候 展现的总不是最后那几行数据 这真的很让人头大 还好有了这次经历 把这个问题记录下来 给那些在qml中遇到同样问题的人 首先介绍我
  • GitHub Atom - 移除编辑器内的竖线

    本文转载至 http stackoverflow com questions 25579775 github atom remove the center line in the editor 这根竖线是由 wrap guide 包提供 如
  • Python3-基础- 包、闭包

    包 包 包是模块的一种形式 包的本质就是含有 py文件的文件夹 模块 模块就是封装好的具有特定功能的函数代码 例如sum 求和函数 py文件的两种功能 1 脚本 一个文件就是完整的程序 用来直接执行 2 模块 一个文件中存放的某些功能函数
  • Bp神经网络

    智能系统课程设计 老师要求做一个识别手写数字的神经网络算法 数据集是Mnist image数据集 在网上找了好多教程 结果仍然不清楚 后来在B站找了个视频才弄懂 传上来代码 以备以后回顾 Minss image newBpLearn cpp
  • 汇编基础(3)---常用汇编指令

    汇编指令集合太多 以下是常用的指令归纳 具体的用法还需要进一步整理 一 数据传输指令 它们在存贮器和寄存器 寄存器和输入输出端口之间传送数据 1 通用数据传送指令 MOV 传送字或字节 MOVSX 先符号扩展 再传送 MOVZX 先零扩展
  • 打工族必看!省钱订餐攻略,经本人亲测多日!

    这不是广告哦 不像其他平台一样需要扫码关注等等 我的常用平台是不需要关注的 只要领取即可使用 我已经在这个平台点外卖很久了 几个月了 平常我会在这个平台领取优惠券 和同事一起拼单下单 每个人能省下三四块钱 有时候多的话可以省下七八块钱 这个
  • 精妙布局,乐车邦领跑2017互联网汽车后市场

    2017年的汽车后市场可谓是冰火两重天 上半年资本寒冬持续 行业几乎没有融资新闻 下半年苏宁 京东等互联网巨头动作频频 市场重现热火朝天 冰火的洗礼 让玩家们备受煎熬 许多企业不堪重负 纷纷倒下 但也不乏一些企业愈战愈勇 成立仅2年多的乐车
  • Android SWT机制

    Android SWT机制 Android SystemServer Watchdog Timeout 安卓看门狗超时机制 Watchdog字面上是 看门狗 的意思 有做过嵌入式低层的朋友应该知道 为了防止嵌入式系统MCU里的程序因为干扰而
  • 观察者模式-猫捉老鼠(委托与事件)

    猫捉老鼠是一个典型的观察者模式的实现案例 在其中加入委托与事件的程序实现 将会提高代码的一个可读性 其下是代码实现 创建一个Cat类 using System using System Collections Generic using S
  • 华为OD机试 - 开放日活动、取出尽量少的球(Java)

    题目描述 某部门开展Family Day开放日活动 其中有个从桶里取球的游戏 游戏规则如下 有N个容量一样的小桶等距排开 且每个小桶都默认装了数量不等的小球 每个小桶装的小球数量记录在数组 bucketBallNums 中 游戏开始时 要求
  • Redis-基本数据类型与内部存储结构

    1 概览 Redis是典型的Key Value类型数据库 Key为字符类型 Value的类型常用的为五种类型 String Hash List Set Ordered Set 2 Redis内部内存管理 redisObject 核心对象 R
  • solidity 合约权限授权_智能合约:整数溢出、访问控制缺陷漏洞与跨合约调用漏洞...

    整数溢出 漏洞简介 简单来说 就是Solidity整形变量被赋值高于或者低于可以表示的范围时 值会发生改变 一般会溢出为2的uint类型次方 1 或者 0 上溢 会溢出为0下溢 会溢为2 n 1 如果是uint256 即为 2的256次方