EthereumのJSON RPCにおけるスキャン活動の観測

SOCでは、仮想通貨の一つであるEthereumのクライアントを対象としたスキャン活動の増加を観測しました。攻撃者が狙ったポートは8545/TCPであり、このポートはEthereumのクライアントに対してJSON RPC(JSON Remote Procedure Call)を用いてアクセスするためのインターフェースとして設定されることが知られています。JSON RPCはJSON形式で遠隔からプログラムに処理を依頼するためのプロトコルで、複数の仮想通貨のクライアントで利用されている通信プロトコルとなります。
EthereumのクライアントにおいてJSON RPCの通信をインターネット上へ公開してアクセスする場合は、送信元IPアドレスをフィルタリングするなどの措置を取る必要があります。JSON RPCの利用方法については、2015年8月29日にEthereumの公式ブログでも注意喚起されています。また、2019年1月10日時点のShodanによる調査では、8545/TCPを外部に公開している端末が約4600台存在することを確認しています。

SOCでの観測情報

2018年12⽉3⽇から8545/TCPにおけるスキャン活動をIIJマネージドファイアウォールサービスで観測しています。以下に2018年12⽉中の観測状況をグラフに⽰します。

図1 8545/TCPに対するスキャン活動(2018年12月)

対象期間中に観測したスキャン活動の特徴として、2018年12月3日の20時ごろから2018年12月14日15時までロシア(RU)を送信元とするスキャン活動を多く観測しました。日常的に観測している8545/TCPに対する通信に対して、1時間あたり最大で約15倍の増加率となっています。また、ロシアを送信元とするスキャンと入れ替わるように、対象期間中の終わりにかけて米国(US)を送信元とするスキャンが多くを占めるようになっています。さらに、2018年12月19日の23時頃から新たにブルガリア共和国(BG)を送信元とするスキャンが増加しています。このスキャン活動はZDnet社の記事でも取り上げられています。

スキャン通信の解析

スキャン通信の特徴から、今回の活動は送信元が大きく3つのクラスタに分類できることがわかりました。

まず、スキャン活動の送信元には、「送信元ポート」が「固定」された特定のポートが利用されるものと、「ランダム」であるものが確認できました。
また、SYNパケットにも2種類の特徴が確認できています。一つはSYNパケットのWINDOWサイズが必ず「1024」であり、もう一方は「65535」であることが確認できています。

これらの特徴を元に分類すると、送信元を以下の3つのクラスタに分けることができます。

  1. 特定の送信元ポートが利用され、SYNパケットのWINDOWサイズが1024である8545/TCP宛てのスキャン通信
  2. 送信元ポートがランダムであり、SYNパケットのWINDOWサイズが65535である8545/TCP宛てのスキャン通信
  3. その他、日常的に観測している8545/TCP宛てのスキャン通信

今回のEthereum JSON RPCに対するスキャン通信の増加は、上記クラスタの1と2が大きな要因となっていることがわかります。以下に、クラスタ1と2のスキャン通信の推移を示します。

図2 クラスタ1と2におけるスキャン活動(2018年12月)

以上のことから、複数のスキャン活動が少なくとも2種類のツールを用いて実施されていることが解析の結果から確認できます。

不正送金の実施可能な条件

今回の対象期間中に観測したスキャン活動では、実際にJSON RPCを利用したHTTPのPOST通信を観測しています。攻撃者は一連のスキャン活動の中で、通信のレスポンスを確認することで8545/TCPでEthereumクライアントがJSON RPCを利用し、アクセス可能であるかを判断しているものだと考えられます。

SOCで観測している通信はスキャンを目的としたものでしたが、JSON RPCを用いることで攻撃者は不正に送金のトランザクションを発行し、資金を調達することが可能となります。この送金のトランザクションの発行を試みる場合には、以下に示す条件をEthereumのクライアント(Gethなど)が満たす必要があります。

  1. 8545/TCPでJSON RPCが利用可能で、インターネット上からアクセスできるオープンポートであること
  2. EOA(Externally Owned Account)のUnlockが可能であること

まず、8545/TCPでJSON RPCが利用可能であるには、Gethの場合では実行時のオプションで「–rpc」が指定されている必要があります。次にインターネット上からアクセス可能であるためには、「–rpcaddr」が指定されている必要があります。このオプションは外部からJSON RPCを用いてアクセスを受け付けるIPアドレスを指定できます。しかし、このオプションのデフォルトはlocalhost(127.0.0.1)となるため、インターネット上から直接Ethereumクライアントへのアクセスはできません。したがって、ファイアウォール等で適切にアクセス制御をかけていない状況で、インターネット上からJSON RPCが利用できるEthereumクライアントは、本オプションで「0.0.0.0」もしくは、インターネットから疎通のあるIPアドレスを指定しているものであると考えられます。最後にJSON RPCで利用するポートの指定ですが、「–rpcport」オプションを用います。このオプションは明示的に指定しない限りデフォルトのポートが設定されます。ただし、Ethereumのクライアントが実装されている言語によって設定されるデフォルトのポートが異なります。クライアントの実装がC++やGo、Rustである場合には8545/TCPが設定されますが、Pythonの場合は4000が指定されます。そのため、Pythonの実装であるクライアント以外では「–rpcport」を指定していない場合も今回のスキャン活動の対象となります。

次に「EOAのUnlockが可能であること」とは、JSON RPCでmanagement APIが利用できる設定であることに相当します。尚、EOAとはいわゆるWalletのアドレスを意味します。management APIの他にもDApp(decentralized application)というAPIが存在します。DApp APIには、Ethereumのクライアント上で管理されているEOAの情報や、トランザクションの発行を実行するためのAPIが定義されています。しかし、基本的には送金のトランザクションを発行する前には送金元のEOAのロックを解除する必要があり、そのロックを解除するためのAPIが定義されているのがmanagement APIです。Gethでmanagement APIを利用する場合、「–rpcapi」オプションで「personal」を明示的に指定する必要があります。したがって、不正に送金のトランザクションを発行を行うためにはロックが解除されたEOAがEthereumクライアントに存在する状況で成立します。

しかし、management APIを利用してEOAのロックを解除する場合には、EOAのパスフレーズを入力しなければなりません(パスフレーズはEOAの秘密鍵を利用する際に必要です)。そのため、攻撃者が既に存在するEOAのロックを解除する方法として、安易なパスフレーズに対する辞書攻撃が成立する場合が考えられます。その他にもmanagement APIを利用しなくとも、EOAのロックが解除された状況でEthereumクライアントを起動させる方法があります。Gethにおいて起動時のオプションで「–unlock」を指定されている場合に、任意のEOAアカウントはロックを解除された状況でEthereumクライアントが起動します。攻撃者はEOAのリストをDApp APIで容易に確認することが可能であるため、EOAのリストに対して、ロックを解除することなく不正に送金のトランザクションを発行することで資金を得ることが可能です。

既に存在するEOAのロックが解除できない場合にも不正に資金を調達するシナリオは存在します。それはEthereumの送金元EOAを攻撃者が作成することで実現可能です。ただし、management APIの指定で「personal」と「miner」が指定されていることが不正に資金を調達するための条件となります。具体的には攻撃者がmanagement APIを利用してEthereumクライアント上でEOAを新規に作成します。新規に作成されたEOAのパスフレーズは攻撃者が決めたものであるため、EOAのロックを解除することが可能です。また、DApp APIを利用して攻撃者によって新規作成されたEOAにマイニングで得られた報酬を割り当てるようにした場合、Ethereumのクライアントが動作している端末を管理者が意図しない形で利用され、攻撃者が作成したEOAに仮想通貨が蓄積されます。本シナリオの場合、別のEOAに送金することも可能です。

最後に

SOCではEthereumクライアントがJSON RPCを8545/TCPで利用している端末に対するスキャン活動を観測しました。観測した一連の活動では不正に送金するトランザクションを発行するものではありませんでしたが、攻撃者の最終目的はEthereumを不正に送金することが考えられます。しかし、攻撃者が不正に送金のトランザクションを発行させるために、少なくともGethでは複数の条件を満たす必要があります。

前章で示した条件は比較的厳しくあるものの、設定不備等で条件を満たしてしまう可能性は存在します。また、Ethereumに限らず様々な仮想通貨のクライアントやWalletアプリケーションでJSON RPCは利用されています。過去にはElectrumと呼ばれるWalletアプリケーションでJSON RPCにおける脆弱性が発見されており、Ethereum以外の仮想通貨についても注意が必要です。

今回、攻撃者がEthereumを対象としたスキャン活動を12月に実施した理由は分かりませんでしたが、一つの可能性としてEthereumにおけるDAppsの動向が関係していることが考えられます。
このDAppsの開発は近年増加傾向にあり、同時にDAppsを利用する新規ユーザも増加していると推測できます。また、DappRadarによると2018年12月上旬から中旬にかけてDApps内のETHの量が大きく増加していることが確認できます。この変動は12月に実施されたDApps内のイベントやクラウドセール(資金調達)が関係していると考えられ、攻撃者は新規ユーザを対象としたスキャン活動を試みた可能性があります。

最後に、SOCでは8545/TCPのスキャン活動以外にも様々なポートに対するスキャン行為を日々観測しています。12月に観測した一連のスキャン活動は8545/TCPを対象としていましたが、他のポートを利用している場合でも先述した条件を満たす場合には脆弱な設定と考えられます。今回観測した事象に限らず、定期的に外部からのアクセス制御が正しく設定されているかをご確認いただくことをお勧めします。

執筆者プロフィール

セキュリティオペレーションセンター 守田 瞬

セキュリティ本部 セキュリティビジネス推進部 セキュリティオペレーションセンター データアナリスト