以太坊“假充值”漏洞技术分析

发布时间: 2018-07-10

7 月 9 日凌晨 2 点左右,“慢雾区”发布以太坊代币“假充值”漏洞攻击预警,提醒相关交易所、中心化钱包、代币合约需要特别警惕,尽快自查以太坊相关代币的充值是否存在异常,因为根据慢雾区情报,已经发现有交易所及中心化钱包遭受此攻击。

据推测,该问题应该跟之前爆出的 USDT 虚假充值问题类似,没有严格校验交易的有效性导致安全风险,下面我们来分析一下该漏洞可能的原因。

1. 问题分析

那么问题来了:在交易入账环节,是不是仅仅达到指定确认数就认为是一笔有效的交易呢?答案是否定的。

下面我们以目前使用最广泛的以太坊客户端 Geth 来分析一下获取区块交易数据的过程:
(以下获取数据的步骤皆通过 Geth 提供的 JSON-RPC 接口实现,完整文档移步下面的链接查看)

https://github.com/ethereum/wiki/wiki/JSON-RPC

curl -s -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["0x473f25", true],"id":1}' -H 'Content-Type:application/json' http://127.0.0.1:8545/

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    // 省略其他无关数据......
    "transactions": [
      {
        "blockHash": "0x2f77e240c79033b15913aec8217fa2bce54e6029dbdbd7b7ba920c694501fa74",
        "blockNumber": "0x473f25",
        "from": "0xea674fdde714fd979de3edf0f56aa9716b898ec8",
        "gas": "0xc350",
        "gasPrice": "0x3b9aca00",
        "hash": "0xba976331f153810cf063eea3874e6a924adf910f0987413767c079444bf0e2e1",
        "input": "0x",
        "nonce": "0x427efe",
        "to": "0xa9a99145b078f0554114c9ce709ada75769c2d70",
        "transactionIndex": "0x0",
        "value": "0x207680777a29aab",
        "v": "0x25",
        "r": "0x303619a10351b09c2f9cc0b3a92c369220e91aa8d07178a7a6dde59dd9c4df55",
        "s": "0xbf688f14df4f17f655c315602b439c42d451b178ff79b06c3d9d2300189a876"
      }
   // 省略其他交易数据......

https://etherscan.io/tx/0x176649f200682ff22691aebc9f996c5d4f755a088babf650b0c92ef871829e6e

2. 如何预防

  curl -s -d '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x176649f200682ff22691aebc9f996c5d4f755a088babf650b0c92ef871829e6e"],"id":1}' -H 'Content-Type:application/json' http://127.0.0.1:8545/

    {
      "jsonrpc": "2.0",
      "id": 1,
      "result": {
        "blockHash": "0x13f8524a7b2de6a72be4c6ec4109842a247dc9275375ec8f6d1ad402acd3d0cb",
        "blockNumber": "0x5a1bf2",
        "contractAddress": null,
        "cumulativeGasUsed": "0x4fb360",
        "from": "0x00faa4833f31e9dae3eaa738121fa2d72831d550",
        "gasUsed": "0xc738",
        "logs": [],
        "logsBloom": "", // 省略长数据...
        "status": "0x0",
        "to": "0xf207ccfe6d1b90b0b7817ce2d5d262af1514e37b",
        "transactionHash": "0x176649f200682ff22691aebc9f996c5d4f755a088babf650b0c92ef871829e6e",
        "transactionIndex": "0x46"
      }
    }
 

可以看到 “status”: “0x0”,按照官方文档的说明,可以得知 0 表示失败,1 表示成功:

https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_gettransactionreceipt

在此 二三四五新科技研究院区块链实验室 提醒各个区块链交易所以及所有区块链开发者:

联系我们