主页 > imtoken1.0钱包下载 > 揭秘潜伏多年的以太坊“走私”漏洞
揭秘潜伏多年的以太坊“走私”漏洞
节点的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
·等待以太坊更新最新代码以太坊全节点钱包,使用已修复漏洞的节点程序