主页 > imtoken钱包最新版下载不能 > 以太坊盗窃问题的答案

以太坊盗窃问题的答案

以太坊盗窃问题的答案

最近在技术讨论群(QQ群:659809063)和网上遇到了很多以太坊被盗的问题。 这种盗窃经常发生在刚接触以太坊的同学身上。 今天,我就简单总结一下这种盗窃的原因和场景。

偷来的场景

下面是一个网上论坛求解答的问题,也是我们今天要讲的一个典型的以太坊盗窃场景。

1、前一天晚上,我们使用本地代码连接到阿里云以太坊节点(公链)服务器进行交易。 私钥文件(A地址)保存在服务器上。 在交易过程中,它失败了。 当我们去etherscan查看交易时,发现以太币被转入了一个未知地址(H地址),此时并没有意识到被盗,怀疑是有问题代码。

2、第二天,我转了一些ether到地址A,然后在服务器的命令行上进行了一笔交易。 命令行查询账户ether正常。 解锁账户后,交易失败。 当我去etherscan查看交易时,发现以太币被转到了昨天的地址(H地址),pending。

3、我们分析可能是私钥泄露,密码简单,所以在服务器上新建了一个地址(B地址),密码变复杂了,转了一些以太坊,更新了以太坊客户端(从1.7.3更新到1.8.1),事务也是在服务器上用命令行完成的。 命令行查询以太坊账户正常。 解锁账户后,交易再次失败,转出以太币(H地址),pending。

4、这个分析可能是服务器感染了病毒,所以格式化了服务器,重新搭建了环境,创建了账户,转了以太币,交易还是在命令行上完成。 再次出现同样的问题,以太币被转走(K地址),pending

这是什么问题? 哪位高手遇到过。 请帮我回答一下。 我会很感激! ! !

问题恢复及解答

看到这里很多掉坑的朋友可能已经知道被盗的原因了,现在就来分析一下,免得后来者重蹈覆辙。

其实这个问题的原因很简单。 问题出在以太坊转账的解锁机制上。 显然,这位同学的以太坊节点是可以从公网访问的,对网络IP没有限制。 我们都知道发起转账交易时,需要解锁。 看一下解锁码:

func (s *PrivateAccountAPI) UnlockAccount(addr common.Address, password string, duration *uint64) (bool, error) {
    const max = uint64(time.Duration(math.MaxInt64) / time.Second)
    var d time.Duration
    if duration == nil {
        d = 300 * time.Second
    } else if *duration > max {
        return false, errors.New("unlock duration too large")
    } else {
        d = time.Duration(*duration) * time.Second
    }
    err := fetchKeystore(s.am).TimedUnlock(accounts.Account{Address: addr}, password, d)
    return err == nil, err
}

通过源码我们可以看到,如果不传递解锁时间参数,系统默认会为发起交易的账户解锁300秒。 而ETH的盗窃就发生在这恐怖的300秒内,发生在没有任何安全保护的节点服务器上以太坊被盗能追回吧,也就是说5分钟之内,任何人都可以调用转账方法将本账户的ETH转入其他账户。 黑客通过工具监测到某个地址被解锁,立即调用该服务的地址支付高额手续费,将余额全部转走。

概括

以上是新手常见的盗窃场景之一。 可能你还在疑惑,为什么我发出交易的时候代码报转账手续费不足,而在此之前你的以太坊已经不见了。 针对此问题的最简单防御措施是确保服务器访问限制。 至于更高级的安全防护,新手很难做到,也是一个很大的话题以太坊被盗能追回吧,会在后续的文章中进行讲解。

原文链接: