主页 > 苹果版imtoken图标 > 揭秘以太坊潜伏多年的“走私”漏洞,全球黑客疯狂盗币
揭秘以太坊潜伏多年的“走私”漏洞,全球黑客疯狂盗币
节点的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,则永远不会超时,账户会一直保持解锁状态,直到节点进程退出。
详细使用方法参考官方文档:
攻击方法揭晓
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″,”值”:”0x112345fc212345000″}]}
{"jsonrpc":"2.0″,"id":2,"method":"eth_sendTransaction","params":[{"from":"受害者钱包地址3″,"gas":"0x55f0″," to ”:”0xdc3431d42c0bf108b44cb48bfbd2cd4d392c32d6″,”值”:”0x112345fc212345000″}]}
价值单位是以太币的最小单位:wei。 如果以以太计算,需要除以10的18次方:
>>> 0x112345fc212345000
19758522752314920960L
>>> 19758522752314920960L/10000000000000000000
19L
黑客会持续发送转账操作,并定期监测余额变化,更新转账金额,直到用户使用钱包并输入密码解锁钱包。 这时,钱包余额会立即被转走。
快速漏洞测试
安装python的web3库,连接RPC端口,发起请求。 如果获取到返回结果,则可能存在该漏洞。
参考:
from web3 import Web3, HTTPProvider, IPCProvider
web3 = Web3(HTTPProvider(‘http://ip:port’))
print 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 等待以太坊最新代码更新,使用已修复漏洞的节点程序