Redis・Docker APIを狙うマルウェアの調査とスキャンの観測

はじめに

SOCではインターネットに対して公開されたホストを狙うスキャン活動を観測しています。2021年以降は特に6379/TCP(Redis)と2375/TCP(Docker API)へのスキャンが大幅に増加していることを確認しており、IIJが発行している技術レポート「Internet Infrastructure Review(IIR)Vol.54」内のSOCレポートで紹介しています。

Redisはパスワードが標準では設定されていないため、外部に公開するとパスワードなしでアクセスされる可能性があります。 攻撃者によりconfigコマンドが悪用されることで、任意のコマンドが実行される恐れがあります。 また、Dockerはコンテナを操作できるDocker APIを外部に公開すると、攻撃者が用意したコンテナイメージがデプロイされ、任意のコマンドが実行される恐れがあります。 図-1と図-2に、2020年1月から2022年5月までにIIJマネージドファイアウォールサービスで観測した6379/TCPと2375/TCPへのスキャン通信回数の割合をそれぞれ示します。図の縦軸は対象期間におけるスキャン通信の合計を100%として正規化しています。

図-1 6379/TCPへのスキャン活動(2020年1月~2022年5月)
図-2 2375/TCPへのスキャン活動(2020年1月~2022年5月)

6379/TCPへのスキャンは2021年3月から増加し、2375/TCPへのスキャンは2021年5月から増加しています。 6379/TCP・2375/TCPへのスキャンの増加は、国立研究開発法人情報通信研究機構(NICT)や一般社団法人JPCERTコーディネーションセンター(JPCERT/CC)でも同様に確認されています 1 2。 また当該ポートは、クリプトジャックを行う特定の攻撃グループの攻撃対象であることが知られており、攻撃グループのマルウェアに感染するとマイニングツールのダウンロード及び実行を行います。 マイニングの他に感染拡大を狙うスキャンも行うため、当該ポートへのスキャン増加に影響した可能性があります。

SOCの調査では2022年5月にRedis・Docker APIを狙う新たなマルウェアを観測しており、本記事ではその調査結果を紹介します。 そして、2022年のIIJマネージドファイアウォールサービスにおけるスキャンの観測情報を紹介します。

Redis・Docker APIを狙うマルウェアの調査

2022年5月に観測したマルウェアは、RedisやDocker APIが動作しているホストを標的としたもので、ホスト上で攻撃者が用意したシェルスクリプトを実行させることでマルウェア感染させます。そして、ユーザがrootである場合は、外部ホストの6379/TCP(Redis)・2375/TCP(Docker API)・2376/TCP(Docker API)に対してスキャンツール(pnscan・masscan)を用いてスキャンを行い、脆弱なホストを発見した際に感染の拡大を行います。 2375/TCPはDocker APIとの通信が暗号化されていない場合に使用されるポートで、2376/TCPは通信が暗号化されている場合に使用されるポートです。 また、masscanを用いたスキャンの対象にはほぼ全てのIPアドレスレンジが含まれていますが、pnscanを用いた6379/TCPに対するスキャンの対象は、特定の97種類のIPアドレスレンジに限定されているという特徴があります。
図-3にマルウェア感染の流れを示し、表に各マルウェアのハッシュ値と主な挙動を示します。

図-3 マルウェア感染の流れ
マルウェア SHA-256/主な挙動
  • /b2f628/b.sh
  • /b2f628/cronb.sh
3724b0555d0c8d0d0eb3856d84fc29317a1e8c4a8f4725344cb7336d97be80cb

  • 特定クラウド事業者で使用されるホストのセキュリティコンポーネントを停止
  • ユーザがrootではない場合は、/s3f815/d/ai.shをダウンロード・実行
  • ユーザがrootの場合は、/s3f815/d/ar.shをダウンロード・実行
  • /s3f815/d/ai.sh
2391e6c61fe2228b057199d0a3c8b9763cd2d24ba9e56c48e96aafdf615253ea

  • 他のマイニング関連のプロセスを停止
  • /b2f628/b.shを定期的にダウンロード・実行するようにcronを設定
  • マイニングツールをダウンロード・実行
  • /s3f815/d/ar.sh
3331f1a753a3cd9f15234ccc221725ed8cfca9039f3e9ede624971d173042ce0

  • 特定クラウド事業者で使用されるホストのセキュリティコンポーネントを停止
  • 他のマイニング関連のプロセスを停止
  • /b2f628/b.shを定期的にダウンロード・実行するようにcronを設定
  • マイニングツールをダウンロード・実行
  • /s3f815/d/b.shをダウンロード・実行
  • /s3f815/d/b.sh
5d7d95b5e51db0ac8800ffdd0ea5e87859bc119ebfc590af48cfc4e90e7b3822

  • スキャンツール(zgrab・pnscan・masscan)をインストール
  • /s3f815/d/c.sh・/s3f815/d/d.shをダウンロード・実行
  • /s3f815/d/c.sh
54760c42d932de7feb0bfacc49126e67f4a019f222ad2e9d3e3d28e9b7a20b5e

  • pnscan・masscanを用いて6379/TCPにスキャン
  • 感染対象のホスト上で/b2f628/b.shをダウンロード・実行
  • /s3f815/d/d.sh
3a43288cfdee3cc2f5c305990d81986c7190702711edf985951bb44f4a587a9e

  • masscanを用いて2375/TCP・2376/TCPにスキャン
  • 感染対象のホスト上で/b2f628/cronb.shをダウンロード・実行

当該マルウェアは、外部から認証なしでアクセスできるRedis・Docker APIのホストを対象に、外部から任意のコマンドを実行することでマルウェア感染させます。 Redisの場合は/b2f628/b.sh、Docker APIの場合は/b2f628/cronb.shがはじめにダウンロード・実行されます。 ファイル名は異なりますが、ファイルの中身は同じものです。 その後、ホストのユーザがrootであるかによって次にダウンロード・実行されるマルウェアが異なります。 いずれのマルウェア(/s3f815/d/ai.sh・/s3f815/d/ar.sh)でも、/b2f628/b.shを定期的にダウンロード・実行するようにcronを設定しています。 これは永続的にマルウェア感染させようとしているためだと思われます。 また、マイニングツールをダウンロード・実行する点も共通しています。 これらの挙動に加えて、ユーザがrootの場合は、ホストにスキャンツール(zgrab・pnscan・masscan)をインストールし(/s3f815/d/b.sh)、ダウンロードしたツールを用いてスキャンを行います(/s3f815/d/c.sh・/s3f815/d/d.sh)。 スキャンを行うにはroot権限が必要であるため、ユーザがrootであるかによって実行するマルウェアを変えていると考えられます。

冒頭にも述べたように、SOCではRedis・Docker APIへのスキャンの増加を観測しています。 スキャンがどのようにして行われているのか把握するために、スキャンに関連するコード(/s3f815/d/c.sh・/s3f815/d/d.sh)を調査しました。 以降ではその調査結果を紹介します。

Redisへのスキャン(/s3f815/d/c.sh)

Redisが動作している外部のホストに感染を広げるために、スキャンツールのpnscanとmasscanを用いて6379/TCPにスキャンを行い、外部からRedisコマンドを実行させることで外部のホストをマルウェア感染させます。 図-4にRedisコマンドが書かれているコードを示します。

図-4 感染対象のホスト上で実行されるRedisコマンド

当該マルウェアはRedisのconfigコマンドを悪用することで、任意のコマンドを実行させます。 図-4のコマンドが実行されると、cronに/b2f628/b.shをダウンロード・実行するコマンドが設定されます。

この後にpnscanとmasscanでスキャンを行うコードが書かれています。 はじめに図-5にpnscanのコードを示します。

図-5 pnscanで6379/TCPにスキャンするコード

ここではpnscanを用いて、特定のIPアドレスレンジに対してスキャンを行い、Redisが動作している可能性があるホストに対してRedisコマンドの実行を試みます。 具体的には、6379/TCPが開いているホストに対して’2a 31 0d 0a 24 34 0d 0a 69 6e 66 6f 0d 0a’(*1\r\n$4\r\ninfo\r\n)を送り、’6f 73 3a 4c 69 6e 75 78’(os:Linux)のレスポンスがあるか確認しています。 このレスポンスがあるホストに対しては、図-4のRedisコマンドを外部から実行させることでマルウェア感染させます。 スキャンの対象は$x.$y.0.0/16で、$xには38行目に書かれている97種類の数字が入り、$yには0から255までの数字が入ります。 このため、pnscanでのスキャンの対象は全IPアドレス空間ではなく、特定の97種類のIPアドレスレンジに限定されていることが分かります。 また37行目のfor文から、このスキャンの処理は5,000回行われることが分かります。

次に図-6にmasscanのコードを示します。

図-6 masscanで6379/TCPにスキャンするコード

masscanによるスキャンのコードは3種類書かれています。

  1. 全IPアドレス空間の中でランダムなIPアドレスにスキャン(49行目)
  2. プライベートIPアドレスと特定の4種類のIPアドレスレンジにスキャン(55行目)
  3. ホストが属するIPアドレスレンジにスキャン(63行目)

はじめに、全IPアドレス空間の中でランダムなIPアドレスにスキャンすることで、外部のネットワークに感染拡大を試みます(49行目)。 次に、プライベートIPアドレスやホストが属するIPアドレスレンジにスキャンすることで、内部のネットワークに感染拡大を試みます(55・63行目)。 これに加えて、55行目には4種類のIPアドレスレンジがスキャン対象として記載されており、攻撃者が特に狙っているネットワークである可能性があります。 当該IPアドレスレンジはいずれも中国のIPアドレスレンジであることを確認しています。

Docker APIへのスキャン(/s3f815/d/d.sh)

Docker APIが動作している外部のホストに感染を広げるために、スキャンツールのmasscanを用いて2375/TCP・2376/TCPにスキャンを行います。 図-7にmasscanのコードを示します。

図-7 masscanで2375/TCP・2376/TCPにスキャンするコード

ここでは、dAPIpwn関数(5~17行目)を用いて2375/TCP・2376/TCPにスキャンを行います(26・27行目)。 dAPIpwn関数では、masscanでポートが開いていたホストに対して、/v1.16/versionのHTTPリクエストを送信します。 特定のレスポンスが確認できたホストに対して、外部からDockerのコンテナを起動し、コンテナ内でコマンド実行させることでマルウェア感染させます。 スキャンの対象は$x.$y.0.0/16で、$xには1から233までの数字が入り、$yには0から255までの数字が入ります。 このため、ほぼ全てのIPアドレスレンジがスキャンの対象になっていることが分かります。

IIJマネージドファイアウォールサービスにおけるスキャンの観測

前項の調査結果から、当該マルウェアに感染したホストのユーザがrootである場合は、6379/TCP・2375/TCP・2376/TCPに対してスキャンを行うことが分かりました。 スキャン対象にはほぼ全てのIPアドレスレンジが含まれており、IIJマネージドファイアウォールサービスでもスキャンを観測しています。 以下の表に2020年(1月~12月)、2021年(1月~12月)、及び2022年(1月~5月)のIIJマネージドファイアウォールサービスで観測したTCPポートへのスキャン通信回数のトップ10を示します。

順位 2020年(1月~12月) 2021年(1月~12月) 2022年(1月~5月)
1 23/TCP 23/TCP 23/TCP
2 445/TCP 22/TCP 22/TCP
3 80/TCP 80/TCP 80/TCP
4 8080/TCP 8080/TCP 2375/TCP
5 22/TCP 443/TCP 443/TCP
6 81/TCP 6379/TCP 8080/TCP
7 3389/TCP 445/TCP 5555/TCP
8 1433/TCP 81/TCP 2376/TCP
9 5555/TCP 2375/TCP 6379/TCP
10 8545/TCP 3389/TCP 3389/TCP

「Internet Infrastructure Review(IIR)Vol.54」のSOCレポートで紹介したように、2021年に6379/TCP・2375/TCPへのスキャンの増加を観測しています。 これにより6379/TCPは13位(2020年)から6位(2021年)に上昇し、2375/TCPは39位(2020年)から9位(2021年)に上昇していました。 スキャンは2022年以降も継続して観測しており、2022年の5月時点では、6379/TCPは9位、2375/TCPは4位にランクインしています。 また、これまでトップ10にランクインしていなかった2376/TCPが8位にランクインしています。 6379/TCP・2375/TCP・2376/TCPのいずれのポートでも、2022年以降では1月に最も多くスキャンを観測しています。 2月以降は減少傾向ですが、本記事の執筆時点においても多くのスキャンを観測しています。

また、マルウェアの調査結果(図-5)から、6379/TCPへのpnscanを用いたスキャンでは特定の97種類のIPアドレスレンジ(以降「pnscan対象レンジ」と表記)に対して特に多くスキャンすることが分かりました。 このため、宛先IPアドレスがpnscan対象レンジに含まれているかどうかでスキャンの観測数が変わる可能性があります。 以下の表に2022年5月のIIJマネージドファイアウォールサービスで観測したpnscan対象レンジでのスキャン数とpnscan対象レンジ外でのスキャン数を示します。 IIJマネージドファイアウォールサービスでは、pnscan対象レンジに含まれるホストの数とpnscan対象レンジに含まれないホストの数が異なるため、表のスキャン数の値は1ホストあたりの数に変換して記載しています。 また、対象ポートは当該マルウェアがスキャンするポート(6379/TCP・2375/TCP・2376/TCP)と2022年1月~5月の上位3ポート(23/TCP・22/TCP・80/TCP)としています。

ポート pnscan対象レンジでのスキャン数 pnscan対象レンジ外でのスキャン数
6379/TCP 6,396 389
2375/TCP 941 1,300
2376/TCP 806 1,114
23/TCP 10,966 15,114
22/TCP 4,142 4,473
80/TCP 2,159 2,303

表より、pnscan対象レンジに含まれているかどうかで6379/TCPのスキャン数が大きく異なることが確認できました。 反対に2375/TCPや2376/TCPなどのポートではスキャン数に2倍以上の大きな差はありませんでした。 このことから、前項のマルウェアのコードと実際のスキャンの観測傾向が一致していることが分かりました。

おわりに

本記事では、Redis・Docker APIを狙うマルウェアの調査結果を紹介し、スキャンの観測情報を紹介しました。 当該マルウェアのmasscanを用いたスキャンの対象にはほぼ全てのIPアドレスレンジが含まれており、執筆時点においても継続してスキャンを観測しています。 当該マルウェアに感染すると、マイニングツールのダウンロード・実行、外部へのスキャンが行われる恐れがあります。 そのため、RedisやDockerのサービスが意図せず外部に公開されていないか確認することをお勧めします。 サービスを外部に公開する場合には、外部からコマンドを実行されないようにACLや認証の設定をするなどの対策が必要です。