简介
本文详细介绍了黑客如何利用授权函数和盲签名等方式盗取数字钱包中的加密货币,并提供了一些防范措施。
在数字货币交易中,授权函数是一种常见的网络钓鱼攻击方式。
攻击者会创建一个看起来像正常转账的交易,但实际上这个交易会调用授权函数来转移用户的代币。
攻击者会将交易的数据设置为授权的数量,从而能够成功转移用户的代币。用户在看到这个交易时可能会认为这是一个普通的转账。
实际内容
巫巫的关注者中,有部分小白,为了让新手能完整明白整个过程,巫巫先将过程在WEB端模拟出来,
通过模拟,读者将知道整个过程,再通过代码自动化,内容是为大家科普原理,学习用途,小伙伴可千万不要这样盗别人的虚拟货币。
然后,大家明白整个过程,巫巫再讲整个过程中逻辑,与代码实现。
为了让大家更加直观的看懂合约的整个交易,我会手动将整个过程还原:
执行合约前需要准备:
合约地址 Contract Address
合约执行接收地址 to Address
现在开始:
这里使用MEW为大家模拟整个过程:
输入合约相关信息
这里会自动匹配合约ABI信息,不知道的可以在合约上面查找.
选择好钱包后,点击最后的 “Write”按钮。
点击“Write”后会看到以下弹框,
查看详情:
这里的data就是一个approve的头。
到这里就已经是完成了真个手动还原了整个过程,使用的是approve的函数。
———
基本写到这里,已经没有很多的技术点需要还原了。先将交易包数据进行说明。
有人会上当估计也是因为:大家可能习惯了授权(approve)钓鱼这种常规风险,但对于超出 approve 这类方式的提醒就不一定理解了,其实除了 increaseAllowance 还有permit 等等,更别提低级签名、盲签、多协议组合操作等签名方式了。
increaseAllowance 授权
这里给出increaseAllowance 方式的授权钓鱼手法:
请求包的示例内容:
请求URL: https://api.etherscan.io/api?module=proxy&action=eth_sendTransaction&apikey=YourApiKeyToken
请求方法: POST
请求头: Content-Type: application/json
请求体:
{
"from": "0x1234567890abcdef1234567890abcdef12345678",
"to": "0xa9ce62c5eddad3755a86e027772b5d90661efd0b",
"value": "1000000000000000000",
"gas": "200000",
"gasPrice": "10000000000",
"data": "0xa9059cbb000000000000000000000000a9ce62c5eddad3755a86e027772b5d90661efd0b000000000000000000000000000000000000000000000000000de0b6b3a7640000"
}
-
“from”:转账发起人的以太坊地址。 -
“to”:ERC20代币的合约地址。 -
“value”:转账金额,以Wei为单位。如果是ERC20代币,该值应该为0。 -
“gas”:交易需要的Gas数量。 -
“gasPrice”:每单位Gas的价格,以Wei为单位。 -
“data”:调用ERC20代币的transfer函数所需要的参数,以16进制表示。其中前4个字节为函数选择器(transfer函数的keccak256哈希值),后面32个字节为接收代币的以太坊地址(去掉前面的”0x”),再后面32个字节为转账金额的以16进制表示(去掉前面的”0x”)。
这里可以追加成:fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff 无穷大。或无穷小
该交易数据意味着你向某个账户授权了 100000000000000000000(即 100 ETH)的代币数量,这也是在后续发生转账操作时,该账户可以转出的最大代币数量。
它是函数 increaseAllowance(address,uint256) 的第二个参数,即新的授权金额。它表示你想要将授权的金额设置为多少。
因为该参数在交易数据中的位置是在授权地址之后,所以该参数值是不受攻击者控制的。如果该参数被替换为其他值,就会导致授权金额不正确,从而可能对用户造成财务损失。
/**
* 增加代币授权
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
当前确定授权后, 攻击者就可以将你的USDT全部转走,只要你有U 他就能转走。
如果地址没有及时取消授权的话,将会带来跟多的损失,下面教大家如何检查钱包地址授权了哪些合约和地址,定期取消授权过期的合约
还是那句话:如果你不确定你钱包弹框的含义,就别点确认按钮…
permit授权
permit
(address,address,uint256,uint256,uint8,bytes32,bytes3
看到这里,如果看过巫巫之前的文章,巫巫使用的手法就是这种。
防范虚拟货币钱包盗窃:揭秘非Approve的新型盗U诈骗手段(终极版)
真个过程的复现大概是这个样子(巫巫改过公众号名字,这是之前巫巫写的):
案例的分析这里有篇详细的过程:
https://twitter.com/korpi87/status/1560416631678910464
permit 函数是有风险的
详细的解释可以参见这个 Twitter 帖子:
https://twitter.com/korpi87/status/1560416631678910464。
还有哪些函数是有风险的:
详细解释:
https://twitter.com/korpi87/status/1560416631678910464
transfer 授权
“transferFrom” 钓鱼攻击是一种常见的网络钓鱼攻击。攻击者会创建一个看起来像正常转账的交易,但是实际上这个交易会调用 “transferFrom” 函数来转移用户的代币。
攻击者会将交易的数据设置为授权的数量,从而能够成功转移用户的代币。用户在看到这个交易时可能会认为这是一个普通的转账,然后通过签名的方式进行确认,从而被欺骗。
因此,用户在进行转账操作时,一定要仔细核对交易的信息,特别是授权的数量和地址信息。如果有任何不明确的地方,最好不要进行确认,以免遭受损失。
另一种针对ETH的盲签方式:
盲签转移资产:
ETH被盗,只可能是因为自己私钥泄露吗?签名也能导致eth被盗?!解析黑客如何利用盲签转移资产!
这里首先要介绍
Toggle eth_sign requests
使用:https://metamask.github.io/test-dapp/
在线模拟eth_sign
Toggle eth_sign requests” 是一个在以太坊钱包中的选项,用于允许或禁止在发送交易时进行签名。启用这个选项后,发送交易时,钱包将向用户请求签名,并将签名信息包含在交易中。如果不启用这个选项,则钱包将自动使用私钥对交易进行签名,不需要用户手动确认。
黑客通过利用 “Toggle eth_sign requests” 这个选项,实施了一种叫做 “盲签”(blind signing)的攻击方式。这种攻击方式的基本思路是,黑客向受害者发送一笔看似无害的交易请求,要求受害者通过签名来授权这笔交易。但实际上,这个交易请求中包含了恶意合约地址和恶意数据,受害者在签名授权之后,黑客就可以使用这个签名信息来发送一笔恶意交易,将受害者的资产转移到黑客的地址。
由于签名本身并不会触发任何风险提示,受害者很难意识到自己已经中了盲签的陷阱。因此,建议在使用以太坊钱包时,不要随意启用 “Toggle eth_sign requests”,尤其是在接收到未知来源的交易请求时要谨慎,最好进行多重确认或通过其他手段来验证交易的合法性。
eth_sign、personal_sign、signTypedData请注意,这种要求进行 eth_sign 盲签名的签名请求存在风险。
总结
本文介绍了其他一些可能存在风险的函数,如permit、transferFrom等,以及一些常见攻击方式。本文提供了详细的解释和案例分析,帮助用户更好地了解数字货币交易中的风险和安全措施。
私信的小伙伴太多,巫巫忙不过来。
如果你喜欢巫巫的原创文章,推荐加入巫巫的社群(可申请退款)。
合抱之木,生于毫末。
九层之台,起于累土。
每一次努力和积累,都是在为网络安全领域的发展贡献自己的一份力量。
感谢您一直以来的支持和关注!
原文始发于微信公众号(安全女巫):【盗币科普】你可千万不能这样盗别人的虚拟货币钱包