历年跨链合约恶意交易详解(四)——Chainswap20210711
漏洞合约函数
function receive(uint256 fromChainId, address to, uint256 nonce, uint256 volume, Signature[] memory signatures) virtual external payable {_chargeFee();require(received[fromChainId][to][nonce] == 0, 'withdrawn already');uint N = signatures.length;require(N >= MappingTokenFactory(factory).getConfig(_minSignatures_), 'too few signatures');for(uint i=0; i<N; i++) {for(uint j=0; j<i; j++)require(signatures[i].signatory != signatures[j].signatory, 'repetitive signatory');bytes32 structHash = keccak256(abi.encode(RECEIVE_TYPEHASH, fromChainId, to, nonce, volume, signatures[i].signatory));bytes32 digest = keccak256(abi.encodePacked("\x19\x01", _DOMAIN_SEPARATOR, structHash));address signatory = ecrecover(digest, signatures[i].v, signatures[i].r, signatures[i].s);require(signatory != address(0), "invalid signature");require(signatory == signatures[i].signatory, "unauthorized");_decreaseAuthQuota(signatures[i].signatory, volume);emit Authorize(fromChainId, to, nonce, volume, signatory);}received[fromChainId][to][nonce] = volume;_receive(to, volume);emit Receive(fromChainId, to, nonce, volume);}
function _decreaseAuthQuota(address signatory, uint decrement) virtual internal updateAutoQuota(signatory) returns (uint quota) {quota = _authQuotas[signatory].sub(decrement);_authQuotas[signatory] = quota;emit DecreaseAuthQuota(signatory, decrement, quota);}
modifier updateAutoQuota(address signatory) virtual {uint quota = authQuotaOf(signatory);if(_authQuotas[signatory] != quota) {_authQuotas[signatory] = quota;lasttimeUpdateQuotaOf[signatory] = now;}_;}
function authQuotaOf(address signatory) virtual public view returns (uint quota) {quota = _authQuotas[signatory];uint ratio = autoQuotaRatio != 0 ? autoQuotaRatio : Factory(factory).getConfig(_autoQuotaRatio_);uint period = autoQuotaPeriod != 0 ? autoQuotaPeriod : Factory(factory).getConfig(_autoQuotaPeriod_);if(ratio == 0 || period == 0 || period == uint(-1))return quota;uint quotaCap = cap().mul(ratio).div(1e18);uint delta = quotaCap.mul(now.sub(lasttimeUpdateQuotaOf[signatory])).div(period);return Math.max(quota, Math.min(quotaCap, quota.add(delta)));}
相关交易与地址
攻击者地址:0xeda5066780de29d00dfb54581a707ef6f52d8113
漏洞合约地址:0x089165ac9a7Bf61833Da86268F34A01652543466
执行的恶意交易:

具体细节分析
在receive函数里,仅仅对signature做了完整性判断,而没有判断它的正确性,是通过_decreaseAuthQuota函数里的sub函数,根据减后的quota值是否小于0来判断该签名是否正确,并决定是否revert。不过,_decreaseAuthQuota包含updateAutoQuota修饰器,该修饰器会先调用authQuotaOf函数对签名的quota进行更新。在更新过程中,忽略了solidity对于key不存在的情况,并不会报错,而是返回一个空值,所以对于quotaCap.mul(now.sub(lasttimeUpdateQuotaOf[signatory]))语句,攻击者传入一个并不存在于lasttimeUpdateQuotaOf数组的signatory,令该数组返回零,会让quotaCap乘上等同于当前时间戳的倍数,使得delta的值巨大,最后莫名令不存在于数组里的signatory拥有了一笔quota,从而绕过了验证。攻击者即可调用receive函数,获得任意多的代币。
攻击产生的事件:



参考链接
https://etherscan.io/
https://zhuanlan.zhihu.com/p/389738041
相关文章:
历年跨链合约恶意交易详解(四)——Chainswap20210711
漏洞合约函数 function receive(uint256 fromChainId, address to, uint256 nonce, uint256 volume, Signature[] memory signatures) virtual external payable {_chargeFee();require(received[fromChainId][to][nonce] 0, withdrawn already);uint N signatures.length;r…...
Python基于OpenCV和SVM实现中文车牌识别系统GUI界面
说明:这是一个系统实战项目,如需项目代码可以直接到文章最后关注获取。 项目背景 随着智能交通系统和智慧城市的发展,车牌识别技术在车辆管理、交通监控、停车场收费等领域发挥着重要作用。传统的车牌识别系统主要针对英文和数字的识别&…...
有瓶颈设备的多级生产计划问题:基于Matlab的深度解析与实践
内容摘要 本文围绕有瓶颈设备的多级生产计划问题展开,通过实例详细阐述问题背景、建立数学模型,并用Matlab代码进行求解。旨在帮助读者理解该问题的本质,掌握利用Matlab解决此类生产计划优化问题的方法,为企业在实际生产中合理规…...
网络性能优化参数关系解读 | TCP Nagle / TCP_NODELAY / TCP_QUICKACK / TCP_CORK
注:本文为 “网路性能优化” 相关文章合辑。 未整理去重。 如有内容异常,请看原文。 TCP_NODELAY 详解 lenky0401 发表于 2012-08-25 16:40 在网络拥塞控制领域,Nagle 算法(Nagle algorithm)是一个非常著名的算法&…...
mac命令操作
mac命令操作 快速删除一行: control u 剪切文件:步骤1、先进行Command c 进行选择复制文件,2、进行commandoptionv进行移动文件,如果commandv是进行复制文件。 commandcontrolD 三个键即可屏幕取词进行翻译 mac中可以使用快捷方…...
react 18 可中断的理解以及应用
React 的“可中断(interruptible)”渲染,指的是 React 在执行渲染过程中可以暂停、中断、再继续或放弃更新。这是 React 18 引入的并发特性的一部分,目的是让界面响应更流畅,防止“卡顿”。 📖 举个例子&am…...
【Python】Python环境管理工具UV安装gdal
目录 一、UV简介1.2 UV高效包管理工具二、UV配置流程步骤1:安装UV工具步骤2:配置环境变量(Windows)三、UV包管理实战3.1 常用命令速查3.2 完整 `uv` 工作流(无需手动 `venv`)**1. 创建项目****2. 初始化依赖管理(可选)****3. 添加依赖****4. 运行代码****5. 更新/移除依…...
如何将内网的IP地址映射到外网?详细方法与步骤解析
01 为什么需要将内网IP映射到外网 在当今数字化时代,远程访问内网资源已成为许多企业和个人的刚需。将内网IP地址映射到外网的主要目的是允许外部网络访问内网中的特定服务,比如Web服务器、远程桌面、文件共享等应用场景。无论是企业需要远程办公访问内…...
HTTP 响应头 Strict-Transport-Security 缺失漏洞
HTTP 响应头 Strict-Transport-Security 缺失漏洞 这个漏洞就是说明网站的HTTP响应头中没有设置Strict-Transport-Security,没有设置则可以通过将https自己手动改成htttp的方式进行访问。不安全 解决方法 1.nginx配置 nginx中增加如下配置: location / …...
【SPSS/EXCEl】主成分分析构建__综合评价指数
学习过程中实验操作的记录 1.数据准备和标准化: (1)区分正负相关性:判断每个因子是正向指标还是负向指标,计算每个的最大值和最小值 (2) 标准化: Min-Max标准化 Min-Max标准化(最大最小值法): 将数据映射到指定的区间ÿ…...
电池分选机:新能源时代的品质守护者|深圳比斯特自动化
在这个新能源蓬勃发展的时代,电池作为能量的存储与释放单元,其性能与质量直接关系到整个系统的稳定运行与效率提升。而电池分选机,作为电池生产流程中的关键一环,正扮演着品质守护者的角色,为新能源产业的高质量发展保…...
STM32江科大----IIC
声明:本人跟随b站江科大学习,本文章是观看完视频后的一些个人总结和经验分享,也同时为了方便日后的复习,如果有错误请各位大佬指出,如果对你有帮助可以点个赞小小鼓励一下,本文章建议配合原视频使用❤️ 如…...
顺序表——C语言实现
目录 一、线性表 二、顺序表 1.实现动态顺序表 SeqList.h SeqList.c Test.c 问题 经验:free 出问题,2种可能性 解决问题 (2)尾删 (3)头插,头删 (4)在 pos 位…...
ARM 汇编启动代码详解:从中断向量表到中断处理
ARM 汇编启动代码详解:从中断向量表到中断处理 引言 在嵌入式系统开发中,ARM 处理器(如 Cortex-A 系列)的启动代码是系统初始化和运行的基础。启动代码通常包括中断向量表的创建、初始化硬件状态(如关闭缓存和 MMU&a…...
LTSPICE仿真电路:(二十六)跨阻放大器简单仿真
1.前言 由于有个机会刚好了解了下跨阻,简单做个这个仿真,实际上跨阻放大器应该要复杂的多,由于跨阻放大器实际上是将电流转换为电压,最需要注意的参数肯定是运放的偏置电流 2.跨阻放大器仿真 这篇是纯记录 这是一个将0-50uA电流…...
特辣的海藻!15
题 1.迷宫 - 蓝桥云课 2.外卖店优先级 - 蓝桥云课 3.后缀表达式 - 蓝桥云课 题 1.迷宫 - 蓝桥云课 import java.util.*;public class Main {static class Node {int x;int y;String str;public Node(int x, int y, String str) {this.x x;this.y y;this.str str;} …...
RISCV GCC 后端 -- 依赖(Dependence)简析
在命令式语言,如C/C中,其依赖关系及分类如下: 依赖(Dependence) -- Control Dependence -- Data Dependence (Reads and Writes of the same location, registers / Memories etc) -- True Dependence (Write then Rea…...
算法-- js排序
汇总 注:以下log n 是 O(log2n) 注:快速排序实际应用中通常最优,但需避免最坏情况。 1 快速排序 [快速排序的思路] 分区:从数组中任意选择一个“基准”,所有比基准小的元素放在基准前面,比基准大的元素…...
FfreeRTOS有阻塞作用的API
在 FreeRTOS 中,阻塞 API 是指那些会导致调用任务进入阻塞状态(Blocked State)的函数,即任务会暂时让出 CPU,直到某个条件满足(如超时、信号量可用、队列数据到达等)。以下是常见的阻塞 API 分类及示例: 1. 任务延迟(延时) vTaskDelay() 使任务阻塞指定的时间(以系统…...
【棒垒球规则】全国幼儿软式棒垒球比赛规则(三)·棒球1号位
棒垒球球队的组成 3.01球队的组成 球队由教练员及工作人员 2 名至 4 名、队员 9 至 12 名组成。 球衣背号不大于两位数,背号不小于 15 厘米。 上场队员名单应填写上场选手和替补选手。 3.02防守位置及名称(参照图四) a.9 名队…...
stm32week10
stm32学习 七.CAN 7.STM32 CAN外设 标识符过滤器: 每个过滤器的核心由两个32位寄存器组成:R1[31:0]和R2[31:0] FSCx:位宽设置,置0为16位,置1为32位 FBMx:模式设置,置0为屏蔽模式,…...
Linux上历史命令显示时间,修改时间戳
今天分享一个生产环境避免背锅的小技巧:设置历史命令执行的具体时间。还可以快速定位问题出现的时间点并恢复误操作导致的系统问题,用于追踪溯源。 在Linux系统中,默认情况下,history命令只会显示命令的编号和命令内容࿰…...
看雪 get_pwn3(2016 CCTF 中的 pwn3)
get_pwn3(2016 CCTF 中的 pwn3) 格式化字符串漏洞 get_pwn3(2016 CCTF 中的 pwn3) (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file pwn3 pwn3: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, …...
python全栈-JavaScript
python全栈-js 文章目录 js基础变量与常量JavaScript引入到HTML文件中JavaScript注释与常见输出方式 数据类型typeof 显示数据类型算数运算符之加法运算符运算符之算术运算符运算符之赋值运算符运算符之比较运算符运算符之布尔运算符运算符之位运算符运算符优先级类型转换 控制…...
操作系统概述(3)
批处理系统 1.单道批处理系统 单道批处理系统是成批地处理作用,并且始终只有一道作业在内存中的系统。优点:提高系统资源的利用率和系统吞吐量。缺点:系统中的资源得不到充分利用。 2.多道批处理系统 引入多道程序设计技术,是…...
SolidWorks2025三维计算机辅助设计(3D CAD)软件超详细图文安装教程(2025最新版保姆级教程)
目录 前言 一、SolidWorks下载 二、SolidWorks安装 三、启动SolidWorks 前言 SolidWorks 是一款由法国达索系统(Dassault Systmes)公司开发的三维计算机辅助设计(3D CAD)软件,广泛用于机械设计、工程仿真和产品开…...
powershell绑定按钮事件的两种方式
写一个powershell的简单GUI做本地任务,试验出2个方法: 方法1: function btn1_click {write-host $text1.Text -ForegroundColor Green -BackgroundColor Black }$btn1.Add_Click({btn1_click})方法2: $btn2_click {write-host $…...
JBDC Java数据库连接(1)
目录 JDBC概述 定义 JDBC API 实例 JDBC搭建 建立与数据库连接: 形式: 实例 获得Satement执行sql语句 Satement中的方法: 实例 实例 JDBC概述 定义 JDBC(Java DataBase Connectivity)java数据库连接是一种用于执行SQL…...
Spring Boot 3.x 集成 MongoDB 的 默认配置项及默认值,以及 常用需要修改的配置项 的详细说明
以下是 Spring Boot 3.x 集成 MongoDB 的 默认配置项及默认值,以及 常用需要修改的配置项 的详细说明: 一、默认配置项及默认值 Spring Boot 对 MongoDB 的默认配置基于 spring.data.mongodb 前缀,以下是核心配置项: 配置项默认…...
git rebase复杂场景验证
经常面临复杂的分支管理,这里对几种场景的行为做一些验证。 结论总结 git rebase br_name:等价与新建br_name分支,然后找到当前分支与br_name分支的分叉点。然后把分叉点以后的提交(当前分支)一个一个的cherry-pick过…...
