どうも、katです!
今回ですが、タイトルの通り、私の契約しているVPS(Ubuntu)のサーバーの1つが、勝手に仮想通貨マイニングに使われていたので、その時のことについて書いていこうと思います!
いつ起きた?
正確に、いつからウイルスが入ったかは定かではありませんが、数日前(2022年7月)、今回のサーバーにログインして、プログラミングなどをしていた際に、急に動作が重くなったので、おかしいと思い、Conoha VPS(このサーバーの契約元)のコントロールパネルにログインして状況を確認して見たところ、ここ最近CPUが100%状態に・・・
そしてこのグラフから、異常な状態になったのが6月の後半ということがわかりました。
ちょうどその頃からこのサーバーにsupabaseというRDB(postgresql)の使えるサービスと、Next.jsというサーバーサードJavascryptのフレームワークを入れて、色々と触り始めた頃だったので、その辺りが怪しいと思いました。
原因は?
まずは原因を調べるべく、topコマンドでプロセスの状況を確認したところ、以下のような表示となりました。
見てわかる通り、kthreaddkというプロセスがCPUとメモリを大量に使っていることがわかります。
恐ろしい・・・
私はこの時、何のプロセスか分からずにググって見たところ、どうやら仮想通貨マイニングのプロセスのようだとわかってきました。
もちろん私はそのようなサービスをこのサーバーでは使っていなかったので、勝手に仕込まれた可能性が高くなりました。
そこでまずはこのプロセスを停止させることにしました。
下記コマンドで停止させたところ・・・
# kill -9 2527440
なんと、またすぐに別のPIDでプロセスが立ち上がってしまいました。。(キャプチャ撮り忘れました)
そこで下記のコマンドでプロセスの中身を確認しました。(2528758の部分はPID)
# ls -al /proc/2528758/
その結果、下記のような表示となりました。
ありました!
exe -> '/var/lib/postgresql/data/base/uw4s7c/kthreaddk (deleted)'
となっている部分ですね。
実行パスにpostgresqlと入っているので、postgresqlに関係していることがなんとなくわかりますね。
ちなみにサーバーにはこのパスは存在せず、しばらく悩んだのですが、前述したsupabaseというRDB(postgresql)サービスは、docker上で動いていることを思い出し、そのdockerの中にこのパスが存在していたようです(確認する前に解決したので実際にあったかは不明)。
解決した方法
それでは解決した方法について書いていきます。
そこまで難しいことはしていないです。
該当サービス停止
まずは、postgresqlが動いているsupabaseサービスを停止しました。
# supabase stop
純粋な(supabase上ではない)postgresqlや、postgresql以外に以外に寄生している場合も、同様に該当のサービスを停止すると良いかと思います。
ルート以外のユーザー作成
これは私のサーバーがセキュリティ皆無で、rootユーザーしか存在しなかったために行ったことなので、既にユーザーが存在していればやらなくて良いかと思います。
まずは下記コマンドでユーザーを作成
# adduser ユーザー名
パスワードを聞かれるので、Enterでスキップせずにちゃんと設定します。
rootユーザーの代わりに使用するので、sudo権限をつけておきます。
# gpasswd -a ユーザー名 sudo
rootユーザーでログインできなくする
作成したユーザーに切り替えます。
# su ユーザー名
下記コマンドで、rootユーザーでのログインをできなくします。
# sudo passwd -l root
私の場合はここまでの作業を行い、再度該当サービス(私の場合はsupabase)を起動しても、再度発生することは無くなりました。
再度発生してしまったため、以下の公開鍵認証の設定と、/tmpのファイル削除を行いました。
公開鍵認証でのみログインできるようにする
ここでは長くなるので割愛しますが、秘密鍵、公開鍵を発行し、SSH認証(秘密鍵を持っている人しかログインできなくする)に切り替えました。
また、今まで行っていたパスワードログインはできなくしました。
/tmp配下のファイルを削除
関係あるかわかりませんが、/tmp配下に、見慣れないファイルがあったため、削除しました。
これで一旦様子を見ようと思います。
それでも発生する場合
私はやっていませんが、上記でも解決しない場合にできることとしては、下記があるかと思います。
実行ファイル削除
プロセスの中身確認時に表示されたパス(今回でいうと「/var/lib/postgresql/data/base/uw4s7c/kthreaddk」)のファイルが存在していれば削除した方が良いかと思います(私の場合は特に削除してないですが今は問題なく動いています)。
cronの確認と削除
こちらも私の環境では確認できませんでしたが、ググると結構このパターンが多いようでしたので、割と有効かと思います。
まず、cronの中身を確認します
# crontab -l
下記のような、見覚えのないcronが設定されていた場合は、その行を削除します。
* * * * * /run/c8aaf4bea
最後に
いかがだったでしょうか?
今回は、たまたま私の勉強用サーバーにマイニングスクリプトが仕込まれていたので、その時のことを記事にしてみました。
やはり勝手にサーバーが仮想通貨マイニングに使われているというのは嫌なものですね。
話では聞いたことがありましたが、まさか私のサーバーでそれが起きるとは思っていませんでした。
正直、今回の内容で完全に防げたわけではないと思いますが、今のところ再発していないため、最低限の対策になったのかもしれません。
また再度起きた場合は、さらにセキュリティを強化していこうと思います。
この記事が同じ症状になった方へのご参考になれば幸いです。
以上「サーバーがkthreaddkという仮想通貨マイニングウイルスに侵されていた」でした〜