将 Socket 缓冲区中的数据直接拷贝到 内核缓冲区中 , 然后写出到文件 ; 使用零拷贝机制 , 一行代码完成 20M 的文件从 Socket 接收到硬盘文件写出操作 ; fileChannel.transferFrom 零拷贝核心操作 fileChannel.transferFrom(socketChannel, 0, 1024 * 1024 * 32); // 5.
智能合约里的 transferFrom 是批准转账流程里的关键函数,这个由于不如 transfer 那么常用,容易被不小心忽略。这个流程最大的问题是权限问题。 spender] = _value; Approval(msg.sender, _spender, _value); return true; } // 代我转账的流程 function transferFrom 这就是为什么如果用了 SafeMath 就会没问题,因为 SafeMath 会抛出错误,直接中断回滚 transferFrom 函数。 整体这样看下来,EDU 和 BAI 等合约的 transferFrom 盗币事件最核心的问题是权限问题,溢出在这仅仅是个小插曲而已。 ---- 本文摘自慢雾区微信公众号文章"智能合约 transferFrom 权限控制不当导致的任意盗币攻击简述"
这里,我们假设外部合约提供了一个transferFrom函数,用于从一个账户向另一个账户转移代币。 (msg.sender, address(this), amount); } } 在这个合约中,exchangeTokens函数调用了外部合约的transferFrom函数。 恶意合约可能在transferFrom函数中包含额外的逻辑,比如在转移代币的同时,调用我们的合约中的其他函数,或者执行一些未授权的操作。 这里,我们假设外部合约提供了一个transferFrom函数,用于从一个账户向另一个账户转移代币。 恶意合约可能在transferFrom函数中包含额外的逻辑,比如在转移代币的同时,调用我们的合约中的其他函数,或者执行一些未授权的操作。
因为我们在写特洛伊木马的 ERC20 token 是直接继承的 OpenZeppelin 的 ERC20,那么应该是直接调用 super.transferFrom();但问题在于是应该直接写 super.transferFrom 呢还是应该写 return super.transferFrom 呢? ///super.transferFrom(_from, _to, _value); ?? } } else { return super.transferFrom(_from, _to, _value); ///super.transferFrom } } 经过测试,是应该写 return super.transferFrom 而不是直接的 super.transferFrom 这里的 super 应该理解为一个 inner function
6. test_ERC20_transferFromToZeroAddress - 不应允许向零地址进行transferFrom转账。 8. test_ERC20_selfTransferFrom - 自我transferFrom转账不应破坏账户记录。 12. test_ERC20_transferFromZeroAmount - 零金额的transferFrom转账不应破坏账户记录。 14. test_ERC20_transferFrom - 有效的transferFrom转账应正确更新账户记录。 23. test_ERC20_pausedTransferFrom - 启用暂停状态时,不应允许进行代币transferFrom转账。
FileChannle类提供了transferTo()和transferFrom()方法来操作。 transferFrom() FileChannel.transferFrom()方法可以实现从一个源Channel到当前Channel的数据传递。 toChannel = toFile.getChannel(); long position = 0; long count = fromChannel.size(); toChannel.transferFrom position = 0; long count = fromChannel.size(); fromChannel.transferTo(position, count, toChannel); 与transferFrom
另外 assert 有三个参数,我们没必要调用完全符合三个参数类型的合约,因为在 EVM 中,只要找到了方法需要的参数,就会去执行,其他参数就会被忽略,不会产生任何影响 漏洞分析 function transferFrom Alerts the token controller of the transfer if(isContract(controller)){ throw; } require(super.transferFrom ){ return false; } else { return authority.canCall(src,this,sig); } } 核心漏洞代码片段 function transferFrom Alerts the token controller of the transfer if(isContract(controller)){ throw; } require(super.transferFrom 点击 owner 查看合约所有者的地址,返回了默认账户的地址 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c 调用带有 _custom_fallback 参数的 transferFrom
Step 3::之后切换为攻击者1身份,并通过攻击者1使用transferFrom向攻击者2进行转账操作 transferFrom: "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 Step 3:攻击者1继续使用:transferFrom向攻击者2进行转账操作,仍然能转账成功,因为 allowed[_from][msg.sender]没有发生变化 transferFrom: "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4 Step 3:切换回攻击者1,然后使用transferFrom向自己进行转账操作 transferFrom: "0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db","
ERC777 的转账实现一般类似下面这样:(transfer 和 transferFrom 实现差不多,下面用transfer举例) function transfer(address to, uint256 在Defi合约调用Token 的transferFrom 时,Token合约会调用 tokensToSend 和 tokenReceived 以便发送者和接收者进行相应的相应。 注意 tokensToSend() 、 withdraw()和tokensReceived() 函数都是在 transferFrom()中执行的,根据deposit的代码: function deposit (uint256 amount) external { uint balance = balances[msg.sender] + amount; if(token.transferFrom (msg.sender, this, amount)){ balances[msg.sender] = balance; } } 只要前面 3 个函数没有出错,transferFrom
address to, uint value) returns (bool ok) { return token.transfer(to, value); } function transferFrom (address from, address to, uint value) returns (bool ok) { return token.transferFrom(from, to, value ,而题目的合约只对 transfer 进行了重写,我们可以使用题目 import 的那一个合约中的 transferFrom,先看一下 StandardToken.sol import 的 ERC20Lib.sol ,看一下 transferFrom 是怎么定义的,他需要先经过 approve 批准才能使用 ... function transferFrom(TokenStorage storage self, address 使用 approve 进行授权 await contract.approve(player,toWei(1000000)) 然后通过 transferFrom 来实施转账 await contract.transferFrom
0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2" image.png 此时此时攻击者2的余额为 0: image.png Step 3::之后切换为攻击者1身份,并通过攻击者1使用transferFrom 向攻击者2进行转账操作 transferFrom: "0x5B38Da6a701c568545dCfcB03FcB875f56beddC4","0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db ",10000 image.png 交易记录信息如下: image.png Step 3:攻击者1继续使用:transferFrom向攻击者2进行转账操作,仍然能转账成功,因为 allowed[_from 一定的转账额度权限 approve: "0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2",10000 image.png Step 3:切换回攻击者1,然后使用transferFrom 向自己进行转账操作 transferFrom: "0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db","0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2
FileChannel类有一个transferTo()和transferFrom()方法来完成。 transferFrom FileChannel.transferFrom()方法可以将数据从源通道传输到FileChannel中,一个简单例子如下: RandomAccessFile fromFile FileChannel toChannel = toFile.getChannel(); long position = 0; long count = fromChannel.size(); toChannel.transferFrom
) balanceOf(account) transfer(recipient, amount) allowance(owner, spender) approve(spender, amount) transferFrom * * This value changes when {approve} or {transferFrom} are called. */ function allowance * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. 函数与transfer函数首先不同的就是参数的个数不同,这里的transferFrom需要调用这提供三个参数: sender——授权账户地址 recipient——代币接受地址 amount——要转的代币数量
transferFrom() FileChannel的transferFrom()方法可以将数据从源通道传输到FileChannel中(译者注:这个方法在JDK文档中的解释为将字节从给定的可读取字节通道传输到此通道的文件中 toFile.getChannel(); 06 07 long position = 0; 08 long count = fromChannel.size(); 09 10 toChannel.transferFrom
require(msg.value >= _amount, "msg.value smaller than amount");} else {require(ERC20(orderAddresses[1]).transferFrom } 1、在代码第5行可以看到先对orderAddresses[1]是否为 KYBER_ETH_ADDRESS地址做了判断,由于 orderAddresses[1] 为DAI 合约地址,因此将直接调用 transferFrom 合约地址,而具体的调用即攻击者自定传入的_callData,因此如果持有 DAI 用户在DAI合约中对SaverExchange合约进行过授权,则可以通过传入的_callData 调用DAI合约的 transferFrom 3、通过链上调用过程可看出攻击者直接调用 DAI 合约的 transferFrom 函数将被盗用户的 31 万枚 DAI 转走: ? 4、通过构造的_callData 与此前用户对SaverExchange合约进行过 DAI的授权,SaverExchange合约可以通过调用DAI合约的 transferFrom函数将用户账户中的DAI
function stake(uint256 amount) external { _updateReward(msg.sender); stakingToken.transferFrom tokenB); } function addLiquidity(uint256 amountA, uint256 amountB) external { tokenA.transferFrom (msg.sender, address(this), amountA); tokenB.transferFrom(msg.sender, address(this), amountB) } function swapAforB(uint256 amountIn) external returns (uint256 amountOut) { tokenA.transferFrom
Foundry 测试2、知识点梳理ERC721 核心接口balanceOf(address)ownerOf(uint256)safeTransferFrom(address,address,uint256)transferFrom approved; emit ApprovalForAll(msg.sender, operator, approved); } // 转移 NFT function transferFrom ; } function testERC721Transfer() public { vm.prank(alice); // 伪装成 Alice nft721.transferFrom alice); nft721.approve(bob, 1); // Bob 代替 Alice 转移 vm.prank(bob); nft721.transferFrom 未授权的地址尝试转移,应失败 vm.prank(bob); vm.expectRevert(bytes("not authorized")); nft721.transferFrom
call_value":0,"owner_address":"41977C20977F412C2A1AA4EF3D49FEE5EC4C31CDFB"}'3、实现功能与页面:下载链接:网盘下载二、调用TRC20合约的transferFrom ;async function triggerSmartContract() {// Address B transfers 10 USDT from address A to C: B calls transferFrom bandwidth and energy) to perform as the changes need to be broadcasted out to the network.await contract.transferFrom
可以调用)function transfer(address _to, uint _value) returns (bool success);// 这里是拥有者和拥有者之间的代币转移function transferFrom owner.totalSupply() 函数返回这个Token的总发行量;balanceOf() 查询某个地址的Token数量 , 结合mapping实现transfer() owner 使用这个进行发送代币transferFrom
external returns (bool);function transfer(address to, uint256 value) external returns (bool);function transferFrom remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */function transferFrom( address sender, address recipient, uint256 amount) external returns