fbpx

脅威:GitHub、DockerHub、Travis CI、Circle CIを悪用した大規模なクリプトマイニングキャンペーン #aqua #セキュリティ #マルウェア

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

本ブログは「Aqua Security」社の技術ブログで2020年9月11日に公開された「 Threat Alert: Massive Cryptomining Campaign Abusing GitHub, Docker Hub, Travis CI & Circle CI 」の日本語翻訳です。

脅威:GitHub、DockerHub、Travis CI、Circle CIを悪用した大規模なクリプトマイニングキャンペーン

Aqua の セキュリティチーム Nautilus は、暗号通貨のマイニングを可能にするためにリソースを乗っ取ることを目的とした興味深いキャンペーンを検知しました。これは Docker Hub、GitHub、Travis CI、Circle CI を含む複数のSaaS ソフトウェア開発環境に焦点を当て、自動化されたビルドプロセスを悪用します。

幸いなことに、私たちは研究活動の一環として Aqua Dynamic Threat Analysis (DTA)を使用して Docker Hub 上のイメージをスキャンすることがあり、このキャンペーンが最初に開始されてから数時間以内に検出し、調査できました。その後影響を受けたサービスプロバイダには、我々の調査チームから、この攻撃の詳細な内容について通知されました。

「Blitz」キャンペーン

このキャンペーンの基盤として、11人の GitHub ユーザが51の GitHub プロジェクトを作成し、人気のあるソフトウェアプロジェクト(nginx、okular、openssh、openvpn、seahorse、nautilus、zookeeperなど)を装っていました。さらに、人気のあるソフトウェアの名前を使って56個の Docker Hub アカウントを作成しました。これらはすべて、わずか数時間の間に行われました。ビルドプロセスの間に、これらのコンテナイメージは単一の GitHub リポジトリからクリプトマイナーをダウンロードするように仕組まれていました。56個の Docker Hub イメージはすべて、作成後数時間以内に検出されました。これらの発見に基づき、Aqua のセキュリティチーム Nautilus の研究者が点と点を結びつけ、攻撃のキルチェーン全体を明らかにしました。

すべてのイメージは、同じバイナリファイルをダウンロードするように設定されていました。このファイル「GCC」は VirusTotal によって悪意のあるファイルとしてマークされています。

攻撃者は PUA をコンパイラシステムに偽装するため、バイナリに「GCC」という名前をつけています(The GNU Compiler Collection(GCC)は、Linux カーネルを含む Linux に関連するほとんどのプロジェクトにとって重要なコンポーネントであるコンパイラシステムです)。

マイニング攻撃の新しい手法

興味深いことに、攻撃者はGitHub、Docker Hub、Travis CI、Circle CI の基本的なサービスを悪用しています。いままでコンテナのランタイム環境を悪用することを目的にパブリックイメージを利用する他のコンテナサプライチェーン攻撃を見てきましたが、今回の新しいキャンペーンではビルドプロセスのインフラそのものが悪用されています。

イメージはこれらのサービスプロバイダの環境上に構築され、そのリソースをハイジャックして暗号通貨をマイニングするというものです。Dockerfile の洗練されたビルドの仕組みは以下のようになっています。

  • Ubuntu のベースイメージが設定されています。
  • 作業ディレクトリとして /workdir を定義しています。
  • curl のインストールが確認できます。
  • curl を使って、設定ファイルと同様に GitHub からバイナリ GCC ファイル(PUA)をダウンロードします。
  • 作業ディレクトリに `docker.sh` というファイルをコピーして実行します。`docker.sh` の内容は以下です。
    • バイナリの GCC(クリプトマイナー)を設定ファイルとともに実行されます。
    • マイナーが GitHub を実行している間に、リポジトリのクローンを作成します。
    • 2つのファイルがランダムに選択され、その内容が差し替えられます。
    • ランダムなコミットメッセージが送信されます。
    • リポジトリが GitHub にプッシュされます。
  • PUA ファイルを削除します。
  • CMD に `git` というファイルが設定されています。

イメージを pull して実行すると、CMD が bash コマンドで JSON ファイルを実行するように指示しているので失敗します。

これらのプロジェクトやコンテナイメージが作成されてから、それぞれが数千回のコード変更をコミットしています。各コミットは上記のサービスの全てによるビルド処理を実行しており、各ビルドではクリプトマイナーが実行されています。このキャンペーンでは3日間 GitHub で 233,000 以上のコミットが、Docker Hub で 58,000 以上のビルドが蓄積され、約30,000 の Monero マイニングセッションが行われました。現在のところ、Docker Hub は自動ビルドを2時間に制限していますが、攻撃者がこの機能を悪用するには十分な時間が残されています。

攻撃者がこの機能をできる限り悪用しようとしている可能性があります。このキャンペーンは、罪のないエンドユーザ(開発者含む)を攻撃するために簡単に変更できます。もし攻撃者がマイニングを実行するために CMD を変更した場合、このキャンペーンはこれらのイメージをダウンロードした人をターゲットにできます。

まとめ

この攻撃手法は、攻撃者の創造性が進化していることを示す一つの例です。彼らは悪用可能なクラウドのコンピューティングリソースをどこでも手に入れようと、執拗に追求しています。これは本番環境同様にクラウド上の開発者環境も攻撃を受けやすいということを思い起こさせます。なぜなら開発環境は本番環境と比較して同じセキュリティレベルが施されていることが少ないからです。

このような環境では、常に厳格なアクセス制御、認証、最小特権の実施だけでなく、データ盗難やリソースの乱用を防ぐために、アウトバウンドネットワーク接続の継続的な監視と制限を行うことをお勧めします。

Indications of Compromise (IOCs):

11 GitHub users

https://github.com/alisa-smirnova
https://github.com/amelia-popa
https://github.com/evgeny-vinogradov
https://github.com/matias-garcia-projectmanager
https://github.com/olafur-berndsen
https://github.com/oliver-ward
https://github.com/rawiri-martin
https://github.com/sophie-zhang-accountant
https://github.com/tom-muller
https://github.com/william-jonsson
https://github.com/markel-sanz

56 Docker Hub accounts

hub.docker.com/r/digitaltelegramdesktopi/telegram-desktop/builds
hub.docker.com/r/gnatlinki/gnat/builds
hub.docker.com/r/nginxclearr/nginx/builds
hub.docker.com/r/waylandfreex/wayland/builds
hub.docker.com/r/majawozniakx/babl/builds
hub.docker.com/r/dovecotbugfixb/dovecot/builds
hub.docker.com/r/okularrustz/okular/builds
hub.docker.com/r/zookeeperprimaryr/zookeeper/builds
hub.docker.com/r/kristiandimitrovz/mc/builds
hub.docker.com/r/bugfixxena/xen/builds
hub.docker.com/r/fontforgeshv/fontforge/builds
hub.docker.com/r/ameliapopaf/mosquitto/builds
hub.docker.com/r/x64stracea/strace/builds
hub.docker.com/r/cupsforka/cups/builds
hub.docker.com/r/oliverwardi/ghc/builds
hub.docker.com/r/advsqlitebrowserz/sqlitebrowser/builds
hub.docker.com/r/sqlitemuxv/sqlite/builds
hub.docker.com/r/lincgdbr/cgdb/builds
hub.docker.com/r/gegltrued/gegl/builds
hub.docker.com/r/packseahorseb/seahorse/builds
hub.docker.com/r/comgitta/git/builds
hub.docker.com/r/bugfixedpostgresqlcommx/postgresql-common/builds
hub.docker.com/r/jetgnatz/gnat/builds
hub.docker.com/r/vimsilveri/vim/builds
hub.docker.com/r/geglrusti/gegl/builds
hub.docker.com/r/licbashf/bash/builds
hub.docker.com/r/shellpopplerf/poppler/builds
hub.docker.com/r/sqlitebrowseradvf/sqlitebrowser/builds
hub.docker.com/r/evinceprimer/evince/builds
hub.docker.com/r/x86binwalkr/binwalk/builds
hub.docker.com/r/advancedgnomecolormanb/gnome-color-manager/builds
hub.docker.com/r/evgenyvinogradovb/systemd/builds
hub.docker.com/r/musladvancedr/musl/builds
hub.docker.com/r/okularprimaryr/okular/builds
hub.docker.com/r/olafurberndsenr/openssh/builds
hub.docker.com/r/rawirimartinv/evince/builds
hub.docker.com/r/portablepulseaudioa/pulseaudio/builds
hub.docker.com/r/tommullern/libjpeg-turbo/builds
hub.docker.com/r/forkedcupsn/cups/builds
hub.docker.com/r/freemusln/musl/builds
hub.docker.com/r/largemcn/mc/builds
hub.docker.com/r/shsyslogngn/syslog-ng/builds
hub.docker.com/r/muxsyslogngb/syslog-ng/builds
hub.docker.com/r/binwalkforkedf/binwalk/builds
hub.docker.com/r/flosscairov/cairo/builds
hub.docker.com/r/rcnautilusa/nautilus/builds
hub.docker.com/r/zookeeperx64b/zookeeper/builds
hub.docker.com/r/cmpeogp/eog/builds
hub.docker.com/r/fontforgecommonr/fontforge/builds
hub.docker.com/r/matiasgarciab/seahorse/builds
hub.docker.com/r/sophiezhanga/cairo/builds
hub.docker.com/r/openvpnlinkp/openvpn/builds
hub.docker.com/r/bablx8664l/babl/builds
hub.docker.com/r/cmddbusl/dbus/builds
hub.docker.com/r/ffmpeglicl/ffmpeg/builds
hub.docker.com/r/licgittl/git/builds

51 GitHub repositories

https://github.com/goldendict-lib/goldendict
https://github.com/int-mpv/mpv
https://github.com/large-mc/mc
https://github.com/lic-bash/bash
https://github.com/lin-cgdb/cgdb
https://github.com/musl-advanced/musl
https://github.com/mux-syslog-ng/syslog-ng
https://github.com/nginx-beautiful/nginx
https://github.com/nginx-clear/nginx
https://github.com/okular-primary/okular
https://github.com/openvpn-link/openvpn
https://github.com/pack-seahorse/seahorse
https://github.com/portable-pulseaudio/pulseaudio
https://github.com/rc-nautilus/nautilus
https://github.com/sh-syslog-ng/syslog-ng
https://github.com/shell-poppler/poppler
https://github.com/sqlite-mux/sqlite
https://github.com/sqlitebrowser-adv/sqlitebrowser
https://github.com/vim-silver/vim
https://github.com/wayland-adv/wayland
https://github.com/x86-binwalk/binwalk
https://github.com/zookeeper-x64/zookeeper
https://github.com/licgitt/git
https://github.com/alisa-smirnova/cgdb
https://github.com/amelia-popa/mosquitto
https://github.com/evgeny-vinogradov/systemd
https://github.com/matias-garcia-projectmanager/seahorse
https://github.com/olafur-berndsen/openssh
https://github.com/oliver-ward/ghc
https://github.com/rawiri-martin/evince
https://github.com/william-jonsson/eog

New call-to-action
新規CTA