当記事内には実際に攻撃者が利用したURLなどが無毒化した状態で記述されている。 もし開く場合は自己責任で。
時系列
- 2022/12/27 10:18: サーバが正常に起動していない現象を観測
- サーバ管理担当者がサーバを再起動
java.net.NoRouteToHostException: No route to host
エラーを観測- レンタルサーバ事業者にネットワーク設備の点検を依頼
- 2022/12/27 10:30: レンタルサーバ事業者から、障害が発生していない報告を受ける
- マルウェア検査アプリケーションでマルウェアを発見
- 2022/12/28 10:35: 障害の復旧作業に筆者が合流
- 2022/12/29 02:00: 当該障害がクリティカルなセキュリティ事故であることが判明
- 2022/12/30 10:56: 当該サーバが復活し、当初のエラーが出なくなっている可能性があることが発覚
これに伴い、VirusTotal, Any.Runの結果を記事内に追記 - 2022/12/31 02:00: 感染していた場合でも、エラー無しでサーバが正常に動作することが判明
はじめに
本記事ではプラグインファイル・Paperバイナリに対して感染したUpdater.class
について取り扱う。
それ以外の項目については、 こちらの記事(英語)が参考になると思われる。
また、実際に感染したサーバを実行した際の動作について Any.Run で実験を行っている。 そちらも見ていただけると、本記事と別途記述している2記事についてもよくご理解いただけるのではないかと思う。
エントリーポイントの汚染
複数のmain
メソッドにおいてUpdater.init()
を呼び出すコードが発見されている。
また、コードとして
public static void main (String[] arrstring) {
Updater.init();
String[] args;
}
のように変更されており、 引数が編集されていることで書き換え済みか認識しているのではないかと考察した。
また、CFRでの解析においてUpdater
クラスが認識出来ていなかったが、
おそらくUpdater.class
ファイルに不正な値を入力することで、
解析アプリケーションをまともに動かせなくする目的があったのではないかと考える。
Updater.init()
の挙動
リバースエンジニアリングした全文は こちら を参照していただきたい。
また、筆者が必要に応じてアノテーションを付けたファイルは こちら から利用できる。
前提バイナリのロード
Updater.class
では
最初にjava.io.tmpdir
内の
kernel-certs-debug4917.log
というファイルに対して
File
オブジェクトを生成する。
もし、すでにkernel-certs-debug4917.log
ファイルが存在しているのであれば、
当該ファイルをjava
もしくはjavaw.exe
で実行する。
拡張子は.log
であり、いかにも一般的なファイルに擬態させているが、中身はjar
ファイルである。
バイナリのダウンロード
もしkernel-certs-debug4917.log
が存在しない場合、次の動作が行われる。
- 初期値として
0Prpx2ekKWc=
をロード - リソース内の
/plugin-config.bin
からIJMZR7mQs8faH0sBuSYr8g==
をロード ttp:// files <dot> skyrage <dot> de/mvd
からjar
ファイルをを.log
として保存 (VirusTotal, 詳細記事)- 1もしくは2でロードした値を
-Dgnu
に代入し、ダウンロードしたバイナリを実行 ttp:// files <dot> skyrage <dot> de/update
からzip形式のファイルをダウンロード (VirusTotal, Any.Run, 詳細記事)- ダウンロードしたファイルを加工(詳細は割愛)
- ダウンロードしたファイルを実行
追跡
Whois
Whoisの最終変更は下記のとおりである。
Changed: 2021-07-12T21:50:02+02:00
また、ネームサーバはCloudflareの物が利用されていたようだ。
当該マルウェアについて本チームの考察
共同で研究を行った のふれむ氏 の調べたところによると、 当該マルウェアは2022年の8月ごろから発見されていると見て良いのではないかと思われる。
当チームが観測したバージョンは、
おそらく2022/12/27日時点でCloudflare側が規約違反もしくはFreeプランの制限超過で
Proxyを解除し、それによりCloudflare以外からの通信を拒否していたサーバにアクセスできなくなったことで
No route to host
がエラーとして出るようになり、発覚に至ったと考えられる。
また、今回感染したファイルは MCAntiMalware と Kasperskyのウイルス対策ソフトウェアで検出が可能だった ようである。
Pluginを導入する前に Virus Total などで検査するだけでも十分防げた可能性は高い。