概述
关于漏洞是什么,可以查看参考中的金钱难寐,大盗独行——以太坊 JSON-RPC 接口多种盗币手法大揭秘
文章。
因为不清楚最新的以太坊程序是否已不存在此问题,所以对这个安全漏洞做了一次本地环境的测试。
环境搭建
搭建私链
根据参考中的的如何搭建以太坊私有链
文章,基本没坑地在本地起了一个以太坊节点。
自己一开始使用–testnet参数,却好像因为不能同步测试网络的原因,区块链高度(eth.blockNumber)一直是0。最终就没在测试网络复现了。
如果不是mac,可以在geth容器里操作,后面的步骤还是参考如何搭建以太坊私有链
文章。
进入geth容器命令行:docker run -ti --name ethereum-node --entrypoint="/bin/sh" -v /mnt/files/myethereum:/root -p 8546:8545 -p 30303:30303 ethereum/client-go
需要注意的地方:
- 使用
geth --datadir data0 --networkid 1108 --rpcaddr 0.0.0.0 --rpc --rpccorsdomain "*" --rpcapi "web3,eth" --rpcvhosts=* console
开放rpc端口 - 使用容器搭建环境,需要指定–entrypoint来进容器里
测试代码
需要安装python3
|
|
实验步骤
- 新建两个账号
- 给账号一挖矿,拿钱
模拟攻击者调rpc接口偷账号一的钱到账户二 (没有解锁用户时)
123456789101112➜ /tmp python3 转账测试.py153976949999999999947410305258970Traceback (most recent call last):File "转账测试.py", line 15, in <module>web3.eth.sendTransaction({'to': eth.accounts[1], 'from': eth.accounts[0], 'value': 12345})File "/usr/local/lib/python3.7/site-packages/web3/eth.py", line 268, in sendTransaction[transaction],File "/usr/local/lib/python3.7/site-packages/web3/manager.py", line 112, in request_blockingraise ValueError(response["error"])ValueError: {'code': -32000, 'message': 'authentication needed: password or unlock'}模拟攻击者调rpc接口偷账号一的钱到账户二 (解锁用户时)
123personal.unlockAccount(eth.accounts[0]) 解锁时间默认为300秒再运行python3 转账测试.py,此时交易就被提交上去了如此重复调用转账测试.py,区块链高度不断增加,账户一的余额越来越少
总结
- 这个解锁用户后一段时间内无需密码是个功能,最新版的以太坊程序一样存在。
- 不太清楚真实世界里,unlockAccount是怎么发生的。