ここ1年で、Linuxサーバを標的にしたマルウェアが大きなニュースとなることが増えてきた。本記事では、LinuxとFreeBSDのサーバを標的とした、高度かつ多目的なあるマルウェアの動作について、調査報告を行う。当社ではこの動作の核となるマルウェアファミリーをGalacticMayhemと命名した。この名前は一部のC&CサーバのURLをもとにしている。Yandexの研究者チームによって報告されたものと同じマルウェアファミリーである。

概要

 サーバへのMayhemの感染は、PHPのドロッパースクリプトから始まる。このスクリプトの役割は、悪意のあるELF共有オブジェクトファイルをドロップし実行することだ。ドロップされたバイナリの名前の多くはlibworker.soだ。しかし我々の調査では、当該バイナリがatom-aggregator.soまたはrss-aggr.soとなっているような該当しないケースもあった。ドロッパースクリプトは常に32ビットと64ビットの両バージョンのマルウェアを含む。この2つは同一の機能と設定を持つ。

 ドロッパースクリプトはまず、実行中の/usr/bin/hostプロセスをすべてkillする。続いてホストが32ビットか64ビットか、またLinuxかFreeBSDかを判定する。スクリプトはさらにホストのアーキテクチャに合ったバイナリを選び、OSを考慮してELFヘッダを調整し、最後にバイナリをディスクに書き込む。ドロッパーはまた、1.shという名前のシェルスクリプトもディスクに書き込む。このシェルスクリプトは、クリーンアップおよびマルウェアを実行する役割を持っている。マルウェアの実行は、いわゆる「LD_PRELOAD」テクニックを使って実現する。ドロップされたバイナリへのパスを環境変数「LD_PRELOAD」に設定するのだ。次に、実行ファイル/usr/bin/hostを実行する。最終的に/usr/bin/hostによって呼び出されるexitファンクションをフックすることで、OSのローダーは悪意のあるバイナリをロードするようになっている。/usr/bin/hostがいったんexitを呼び出すと、実行が悪意のあるバイナリへと移る。

 我々の調査では、これまでのところ47通りの異なるMayhemのサンプルが明らかになった。こうしたサンプル群のうち最初期のものは少なくとも半年は前のもので、最新のものは1週間以内の可能性がある。サンプルの分析から、Mayhemは開発の最中に3段階の主要なイテレーションを経てきたことは明らかだ。イテレーションごとにマルウェアは次第に複雑さと洗練度を増してきた。加えて、より細かいインクリメンタルな更新が観測されている。これはマルウェアファミリーMayhemが活発に開発中であることを示す。以降の記事では、Mayhemの最新かつもっとも機能が豊富なイテレーションに焦点を合わせる。

 マルウェアMayhemは、高度にモジュール化した設計になっている。Mayhemは1つのメインコンポーネントと複数の任意に読み込まれるモジュールから構成される。メインコンポーネントは、モジュールのロードおよびアンロードや実行はもちろん、C&Cサーバとの通信も担っている。また、モジュール自身やモジュールが使用する他のファイルを格納するために、暗号化した隠しファイルシステムを用いている。このファイルシステムはディスク上に保存される。マルウェアの設定データの1つがそのファイル名を指定している。大半のケースではファイルの名前は.sd0となっている。しかしながら、当社が最近観測したところでは、マルウェアの作者はファイル名を.cachesに変更している。おそらく、隠しファイルシステムのファイル名が複数の情報源により公表され、感染したシステムを検索するために利用されるようになったことに対応したのだろう。重ねて言うが、当該マルウェアが活発に開発中なのは明らかだ。注目すべきは、隠しファイルシステムのファイルサイズもマルウェアの設定データで指定されており、我々が観測したすべてのケースでちょうど12MBになっている点だ。

 マルウェアMayhemは、特別に作られたHTTP postリクエストを用いてC&Cサーバと通信する。このリクエストのヘッダは非常に独特で、「Host」「Pragma」「Content-Length」という特定の3つのフィールドしか含まれていない。この中の「Pragma」フィールドの値は常に「1337」である。加えて、HTTPのバージョンは常に1.0を指定している。マルウェアからC&Cサーバへのリクエストの例を以下に挙げる。

Packet capture of malware communicating with C&C

 以上のように、実際のリクエストのボディは、コマンドやメッセージを指定する1行以上の行から構成される。これらの行は常にメッセージの種別を示す単一の文字で始まっており、カンマ区切りのパラメータのリストが続く。メッセージの種別により、ファイルの送受信、ジョブの開始や終了、モジュールのロードや更新、C&Cサーバへのマルウェアの状況の通知といったことを可能にする。

 感染と設定が終わると、マルウェアは設定データ内にハードコーディングされているC&Cサーバに対し、リクエストを送信しようと試みる。このリクエストには、マルウェアが動作しているホストのシステムや環境についての情報が含まれている。マルウェアはC&Cサーバから条件を満たすリプライをひとたび受け取ると、現在のステータスを報告するC&Cサーバに対し、定期的にリクエストを送信するように戻る。もしそのC&Cサーバが現在これといったアクティビティに参加していない場合、スリープして後でpingするような指示をマルウェアに応答する。

 C&Cサーバは、新たなジョブをマルウェアに応答することもある。今回のケースでは、C&Cサーバは最初にマルウェアに対しロードするモジュールを指示する。同様に、ロードするモジュールのためのルールファイルやパスワードリストのような、追加のファイルも任意に指示する。この場合、マルウェアはまずは隠しファイルシステムを検索して、指定されたモジュールを探す。見つかったら、モジュールのCRC-32チェックサムをC&Cサーバに返す。次にC&Cサーバは、見つかったモジュールが最新版かどうか、あるいはマルウェアはC&Cサーバ上の新たなバージョンを要求すべきなのかをマルウェアに通知する。見つかったモジュールが古いバージョンであったり、モジュールが見つからなかった場合、マルウェアはC&Cサーバにモジュールを要求する。モジュールはHTTPレスポンス中にbase64エンコードされたデータとして返される。

 モジュールを取得したら、マルウェアのメインコンポーネントはモジュールを読み込み、エントリーポイントファンクションを呼び出す。このエントリーポイントファンクションはさらに設定を行い、おそらく隠しファイルシステムやC&Cサーバにある追加のファイルを要求する。また、このファンクションは特定の状況下でメインコンポーネントによって呼び出される1~4つのコールバックファンクションを登録する。これこそ、モジュールの主機能が実行される仕組みだ。

 モジュールの読み込みが成功した後、C&Cサーバはメインコンポーネントに対し新たなジョブを開始するように指示することがある。このジョブの結果、メインコンポーネントはオペレーターが指定した数のスレッドを作成する。各スレッドは、それぞれ読み込まれたモジュールの機能を実行する。最後にC&Cサーバはマルウェアに対し、実行するモジュールへの引数になる文字列を送信し始める。こうした引数の文字列の内容はロードしたモジュールによって異なるが、通常は少なくとも悪意のあるアクティビティの標的となるドメインやURLが含まれる。

モジュール群

 当社の研究の最中に、現実の環境で、マルウェアMayhemによって使用される11個の異なるモジュールに遭遇した。これらの大半において、複数の異なるバージョンを観測した。これは明らかに、モジュールもまた活発に開発中であることを示している。

 遭遇したモジュールは以下の通り。


  • bruteforce.so - WordPressとJoomlaのサイトのログイン情報を総当たりで見つけるために使用する
  • bruteforceng.so - 上と同様だが、HTTPSと正規表現をサポートしており、高度な設定ができる
  • cmsurls.so - WordPressのログインページを特定するために使用する
  • crawler.so - WordPressとJoomlaのサイトを見つけるためWebサイトをクロールするのに使用する
  • crawlerng.so - 上記の改良バージョン。HTTPSと正規表現をサポートし、任意の正規表現にマッチするWebページを発見できる
  • crawlerip.so - 上記と同様だが、ドメインの代わりに標的のIPアドレスリストを受け取る
  • ftpbrute.so - FTPサーバのログイン情報を総当たりで見つけるために使用する
  • rfiscan.so - RFIの脆弱性を持つWebサイトの検索に使用する
  • wpenum.so - WordPressのサイトのユーザを列挙するために使用する
  • opendns.so - 公開されている再帰的なDNSリゾルバを検索するために使用する
  • heartbleed.so - Heartbleedという脆弱性(CVE-2014-0160)を露呈しているサーバを特定するために使用する


 このポストでは個々のモジュールについて非常に詳細なところまで掘り下げることはしないが、分かったことのうち興味深いものを一部挙げる。

bruteforce.so

 bruteforce.soモジュールは、現在飛び抜けて活発に使用されているモジュールである(これについては後ほど詳細に述べる)。機能面では非常にシンプルだ。WordPressまたはJoomlaのサイトのログインページを指し示す標的となるURL、ユーザ名を並べたファイル、パスワードを並べたファイルを取得する。続いて、ユーザ名とパスワードの可能な組み合わせをすべて用いてログインを試みる。

bruteforceng.so

 このモジュールはbruteforce.soモジュールの進化したバージョンで、HTTPSと正規表現のサポートが加えられている。入力として、標的のURL、ユーザ名のファイル、パスワードのファイルを取得するのに加えて、ルールファイルも必要とする。ルールファイルは、標的のログインインターフェイスを指定するために使われる。したがって、このモジュールを使用すれば、どのWebベースのインターフェイスのログイン情報でも総当たりで見つけることができる。このモジュールは主にWordPressとJoomlaのサイトのログイン情報を総当たりするために使われているのを我々は観測してきた。しかし、たとえばcPanel Web Host Managerのサイトなど、他の種類のサイトに対しても使われていると信じるに足る理由がある。

 興味深いことには、bruteforce.soおよびbruteforceng.soの両モジュールの新バージョンを最近になって我々は発見した。古いバージョンでは、ユーザ名のファイル内の全ユーザ名をすべての標的に対して試していたが、新しいバージョンでは使用すべき1つのユーザ名をC&Cサーバが指定できるようになっている。C&Cサーバが標的のURLを指定するために使うコマンドの文字列は、「Q,target」(targetはURL)である。しかし新しいバージョンのコマンドは、「Q,target;username」という、より長いコマンド文字列をサポートしている。セミコロンと別のパラメータが追加されたことに注意してほしい。この追加されたパラメータはユーザ名を1つ指定でき、パスワードファイル内にあるすべてのパスワードと結びつけられる。しかしながら、ユーザ名の文字列が「no_matches」だったり、2番目のパラメータが指定されていない場合には、モジュールは独立したユーザ名のファイル内の全パスワードを試すという古い方法へフォールバックする。

crawlerng.so

 crawlerng.soはWebサイトをクロールするのに使われるモジュールだ。引数として、正規表現を含むファイルを取る。次に当該モジュールは、こうした正規表現にマッチするコンテンツを求めて、標的のドメインを検索する。これは主に、WordPressおよびJoomlaのログインページを特定するために使われているようだ。ただ、正規表現で指定するということから、モジュールは本質的に任意の種類のページを特定するように指示できる。例として、当社はPhpMyAdmin、DirectAdmin、Drupalのログインページを特定するために使われるcrawlerng.soモジュールを観測した。一部のケースでは、モジュールは特定のキーワード、たとえば薬局に関連するキーワードにマッチするコンテンツを提供するWebサイトを見つけるために使われていた。我々が観測したケースでは、マルウェアのオペレーターが工夫をこらし、crawlerng.soモジュールでローカルファイルインクルードの脆弱性を探すものさえあった。観測したルールセットでもっとも多かったのは、別のHTTP、HTTPS、FTPサイトへ移動するリンクも検索するようにモジュールに指示するものだ。このやり方で、モジュールが新しい標的を見つけてクロールを続けるようになる。

Screencapture of LFI rule file
ローカルファイルインクルードの脆弱性を探すために使われるルールの一部

opendns.so

 このモジュールは、DNS amp攻撃で使われ得る、公開されている再帰的なDNSリゾルバを検索するために使用される。引数としてIPアドレスレンジと、サイズのしきい値を取る。レンジ内の全IPを1つずつ繰り返し、53番ポートへの接続を試みる。53番ポートへの接続が成功すると、拡張的なDNSの「DNSSEC OK」ビットをセットして、「ripe.net」ドメインのANYレコードを問い合わせる再帰的なDNSリクエストを送信する。標的がオープンかつ再帰的なDNSリゾルバを起動していたら、大きなDNSの応答を返すことになる。リプライのサイズが、事前にセットしたサイズのしきい値と比較して大きかったら、C&CサーバにIPアドレスが報告される。

Packet capture of the DNS request
当該モジュールによって送信されるDNSリクエストのパケットキャプチャ

heartbleed.so

 このモジュールは標的のドメインがHeartbleed脆弱性に対して脆弱かどうかを特定しようとする。これは標的に初めて接続するときに行なわれ、TLSv1.1のClientHelloパケットを送信し、さらにペイロードサイズが64KB(0xFFFFバイト)だが実際のペイロードは3バイトのハートビートリクエストを送る。

TLSv1.1 ClientHello packet
Malicious heartbeat request
ClientHelloパケットのペイロード(上)と悪意あるハートビートリクエスト

 最後に、サーバのリプライのペイロードのサイズが確認される。これが3バイトよりも長いなら、サーバはおそらく脆弱で、そのことがC&Cサーバに報告される。

Code that checks the server reply
サーバの応答を確認するコード

現在の活動

 当社の調査により、マルウェアファミリーMayhemによって使われているC&Cドメインが19個明らかになった。そのうち7つは現在もアクティブである。現在の活動の大半はWordPressおよびJoomlaのログイン情報を総当たりで取得することに関連している。ただ、FTPのログイン情報も総当たりで見つけることや、同様にWordPressとJoomlaのログインページを検索しながらドメインをクロールすることも観測している。我々は別のモジュールがある時点で現実に使われた証拠も持っている。

 総当たりの活動を観測したためだが、これは非常に日和見的に見える。マルウェアのオペレーターはボリュームに焦点を合わせているようだ。共通かつ脆弱な認証情報を使っているサイトが十分に存在することをあてにしている。アクティブなC&Cサーバ群から標的になったURLを1週間分記録したところ、我々は35万超のユニークな標的を特定した。このサーバ群のなかの1台のC&Cサーバが、21万を超えるユニークな標的に関与していた。これはマルウェアの単一のインスタンスに与えられる標的に過ぎず、全体的な数はおそらくずっと大きいものになることに注目すべきだ。

 標的のドメインに関する分析に基づくと、マルウェアのオペレーターは誰かあるいは何かを特別に標的としているとは思えない。むしろ、単純に低い位置にあるWebの果実を探しているだけのように感じる。以下のような、標的のドメインの地理的な分布によって、これはさらに支持される。上位10か国に中国がいないのは注目に値するが、マルウェアのオペレーター側が意図的に選定したというより、例外的なものと思う。

Piechart showing geographic distribution of target domains

結論

 マルウェアのオペレーターはMayhemを主に偵察ツールとして使い、簡単に侵害できるサーバへアクセスできるようにして、後にもっと洗練された攻撃のベースとして使えるようにしていると、当社では考えている。たとえばオペレーターは、最初にWordPressのサイトを見つけるためにcrawlerng.soモジュールを用い、続いてwpenum.soモジュールを使ってこうしたサイトから潜在的な被害者のユーザ名を列挙しているかもしれない。ユーザ名のリストを持っていれば、オペレーターはこうしたサイトへのアクセスを得ようとしてbruteforce.soモジュールに取り掛かることができる。オペレーターがアクセスできるようになれば、サイトをMayhemで感染させてボットネットを拡大したり、あるいは他の操作を組み込むために利用することもできる。

 マルウェアファミリーMayhemは、LinuxおよびFreeBSDのサーバ上で動作する、高度で非常に汎用的な脅威である。明らかに活発に開発がなされており、オペレーターは研究者やサーバ管理者の尽力を盛んに無効にしようとしている。また感染するホストが、低速のADSLの背後にあるごく普通の家庭用PCではなく、大容量、広帯域のサーバであることを考慮すると、運用の規模も重要である。

サンプルのハッシュ

 バージョン1

  • 0f1c66c3bc54c45b1d492565970d51a3c83a582d
  • 5ddebe39bdd26cf2aee202bd91d826979595784a
  • 6c17115f8a68eb89650a4defd101663cacb997a1


 バージョン2

  • 7204fff9953d95e600eaa2c15e39cda460953496
  • 772eb8512d054355d675917aed30ceb41f45fba9


 バージョン3(最新)

  • 1bc66930597a169a240deed9c07fe01d1faec0ff
  • 4f48391fc98a493906c41da40fe708f39969d7b7
  • 6405e0093e5942eed98ec6bbcee917af2b9dbc45
  • 6992ed4a10da4f4b0eae066d07e45492f355f242
  • 71c603c3dbf2b283ab2ee2ae1f95dcaf335b3fce
  • 7b89f0615970d2a43b11fd7158ee36a5df93abc8
  • 90ffb5d131f6db224f41508db04dc0de7affda88
  • 9c7472b3774e0ec60d7b5a417e753882ab566f8d
  • a17cb6bbe3c8474c10fdbe8ddfb29efe9c5942c8
  • ab8f3e01451f31796f378b9581e629d0916ac5a5
  • c0b32efc8f7e1af66086b2adfff07e8cc5dd1a62
  • c5d3ea21967bbe6892ceb7f1c3f57d59576e8ee6
  • cb7a758fe2680a6082d14c8f9d93ab8c9d6d30b0
  • e7ff524f5ae35a16dcbbc8fcf078949fcf8d45b0
  • f73981df40e732a682b2d2ccdcb92b07185a9f47
  • fa2763b3bd5592976f259baf0ddb98c722c07656
  • fd8d1519078d263cce056f16b4929d62e0da992a


 当社ではこれらをBackdoor:Linux/GalacticMayhem.Aとして検知する。

 調査執筆:Artturi Lehtio(@lehtior2

筆者注記

 筆者はフィンランドのヘルシンキにあるアールト大学の、情報科学の学生である。今春、同大で提供され、エフセキュアが運営したマルウェア分析の講義に出席した後、幸運なことに同社の夏季インターンシップに参加した。1か月前、私は新たなタスク「Linuxマルウェアについて興味深く見える事項を見つけて、それについてブログの記事を書くことをゴールとする」を与えられた。この記事とそれを裏付ける調査は、Linuxマルウェアの謎めいた世界への私の冒険の結果である。