サイバー犯罪者は、企業の採用担当者を装って標的の人物に接近し、偽の採用オファーなどを通じて関心を引こうとしています。新しい仕事の機会に心を奪われていると、防御のための警戒心が疎かになり、攻撃を受けやすくなります。2024年初頭以来、ESETの研究者は、北朝鮮とつながりのある悪意のある一連の活動を観察していますが、攻撃者はヘッドハンターを装い、標的の人物にソフトウェア開発プロジェクトの試験を課し、その過程で情報窃盗型マルウェアに感染させています。ESETは、この攻撃をDeceptiveDevelopment(欺瞞的な開発)と命名しました。

DeceptiveDevelopmentのオペレーターは、偽の採用面接プロセスの一環として、標的に既存のプロジェクトに機能を追加するなどのコーディングテストを依頼しています。タスクに必要なファイルは通常、GitHubなどのプラットフォームのプライベートリポジトリにホストされています。残念ながら、職を真剣に求めているユーザーがアクセスするこれらのファイルはトロイの木馬に感染しています。プロジェクトをダウンロードして実行すると、被害者のコンピュータはこの攻撃の第1段階のマルウェアである「BeaverTail」に感染します。

DeceptiveDevelopmentは、2023年にPhylumUnit 42によって初めて公開され、すでに「Contagious Interview」と「DEV#POPPER」という名前でその活動の一部が報告されています。ESETは、DeceptiveDevelopmentが使用する2つのマルウェア系統である「InvisibleFerret」と前述の「BeaverTail」の新バージョンを含む、この攻撃とオペレーターの初期アクセス方法、ネットワークインフラ、ツールセットについて詳細に分析しました。

本ブログの要点:

  • DeceptiveDevelopmentは、求職サイトやフリーランスの仕事を探したり依頼したりするためのオンラインプラットフォームで、スピアフィッシングを行っています。フリーランスのソフトウェア開発者を標的にしており、暗号通貨ウォレットやブラウザやパスワードマネージャーからログイン情報を窃取することを目的としています。
  • 少なくとも2023年11月から活動しており、BeaverTail(情報窃取型マルウェア、ダウンローダー)とInvisibleFerret(情報窃取型マルウェア、RAT)という2つのマルウェア系統を主に使用しています。
  • DeceptiveDevelopmentの戦術、技術、手順(TTP)は、北朝鮮とつながりのある過去のいくつかの作戦と類似しています。

ESETが、このDeceptiveDevelopmentキャンペーンを最初に観測したのは2024年初めでした。その際、GitHubにホストされていたプロジェクトがトロイの木馬に感染していることを発見しました。長いコメントを追加し、コメントの最後に悪意のあるコードを隠し、ユーザーがその部分を見えないようにする手法が利用されていました。これらのプロジェクトでは、BeaverTailとInvisibleFerretマルウェアが配信されていました。2つのマルウェア系統の分析に加えて、ESETはキャンペーンの背後にあるC&Cインフラの調査も開始しました。2024年の初め以来、ESETはこの攻撃グループと、現在進行中の攻撃に使用されている戦略とツールの進化を追跡してきました。このブログでは、このキャンペーンのTTPと使用されているマルウェアについて説明します。

DECEPTIVEDEVELOPMENTのプロフィール

DeceptiveDevelopmentは、北朝鮮が関与している攻撃グループです。現在のところ、既知のサイバー攻撃グループとの関連は明確になっていません。DeceptiveDevelopmentのオペレーターは、Windows、Linux、macOSのソフトウェア開発者を標的にしています。この攻撃グループは、主に金銭的な利益を得るために暗号通貨を窃取していますが、二次的な目的としてサイバースパイを行っている可能性があります。

標的の人物に接近するため、これらのオペレーターはSNSで偽のリクルーターになりすまします。これは、「DreamJob作戦」(こちらのWeLiveSecurityのブログを参照)で説明しているLazarusグループが取り入れている手法と似ています。しかし、「DreamJob作戦」では防衛産業や航空宇宙技術に関連するエンジニアを標的にしていたのに対し、「DeceptiveDevelopment」はフリーランスのソフトウェア開発者、特に多くの場合、暗号通貨関連のプロジェクトに関わる開発者を標的にしています。DeceptiveDevelopmentは、被害者のコンピュータを侵害するために、偽の採用面接プロセスの一環として、トロイの木馬に感染したコードベースを提供し、バックドアを展開します。

標的となった国や人物

このDeceptiveDevelopmentキャンペーンの主な標的は、主に暗号通貨や分散型金融(DeFi)プロジェクトに携わるソフトウェア開発者です。攻撃者は、地理的な場所に基づいて標的を定めているわけではなく、できるだけ多くの被害者を感染させることで、資金や情報を窃取する確率を高めようとしています。

ESETは、Windows、Linux、macOSの3つの主要なオペレーティングシステムを使用している世界中の数百人の被害者を確認しています。フリーランスとしてのキャリアをスタートさせたばかりの若手開発者から、暗号通貨やDeFiの分野で豊富な経験を積んだプロフェッショナルまで、標的となった人物は多岐にわたります。ESETは、攻撃者と被害者間の会話が英語でのみ行われていることを観察していますが、攻撃者が英語を母国語としない被害者とコミュニケーションをとるために翻訳ツールを使用している可能性もあります。犠牲者の世界的な分布を示すマップを図1に示します。

攻撃の帰属

ESETは、以下に示すいくつかの要素から、DeceptiveDevelopmentが北朝鮮とつながりのある攻撃グループであると確信しています。

  • ESETは、攻撃者が管理するGitHubアカウントと、北朝鮮のIT労働者よって使用される偽の履歴書が含まれたアカウントとの間に関連があることを確認しました。これらの労働者は、身元を偽って外国企業の仕事に応募し、得た給与を北朝鮮政権の資金として提供しています。ESETが観察したつながりは、GitHubプロフィール間での相互フォローでした。一方のプロフィールはDeceptiveDevelopmentに関連し、もう一方のプロフィールには北朝鮮のIT労働者の活動に関連する偽の履歴書やその他の資料が含まれていました。同様の関連性はUnit 42も観察しています。残念ながら、すべての証拠を記録する前にGitHubのページは削除されました。
  • TTP(偽のリクルーターの使用、トロイの木馬が仕込まれた採用試験の課題、面接で使用されるソフトウェア)は、他の北朝鮮とつながりのある活動(Moonstone Sleet、LazarusのDreamJobとDangerousPasswordキャンペーン)と共通しています。

GitHubのプロフィールの関連性に加え、DeceptiveDevelopmentが使用しているマルウェアはかなり単純なものです。これは、Mandiantによる報告と一致しており、北朝鮮のこれらのIT労働者の仕事は通常、品質が低いことが指摘されています。

ESETがDeceptiveDevelopmentの活動を監視しているときに、このサイバー攻撃者が細部への注意が不十分であることを示す多くのケースを目にしました。例えば、開発メモを削除していなかったり、開発やテストに使用したローカルIPアドレスをコメントアウトしていなかったりしています。また、C&Cアドレスを変更した後に難読化していない検体も見られました。この検体については、図2を参照してください。さらに、このマルウェアは無料で利用できる難読化ツールを使っており、そのリンクがコードのコメントに残されていることもありました。

技術的な分析

初期アクセス

リクルーターになりすますために、攻撃者は既存の人物のプロフィールをコピーしたり、新しい人物像(ペルソナ)を構築したりしています。そして、求職サイトやフリーランスのためのプラットフォームで潜在的な被害者に直接アプローチすることも、偽の求人情報を掲載することもあります。当初、このサイバー攻撃者はまったく新しいプロフィールを使用しており、LinkedInから悪意のあるGitHubプロジェクトへのリンクを攻撃対象の人物に送信していただけでした。その後、信頼性を高めるために、多くのフォロワーやつながりのあるように見えるプロフィールを使い始め、より多くの求職サイトやコードホスティングサイトへと手を広げています。これらのプロフィールの一部は攻撃者自身によって設定されていますが、他のプロフィールはプラットフォーム上の実際の人物のプロフィールが攻撃者によって改ざんされた可能性もあります。

これらのやり取りが行われるプラットフォームの中には、一般的な求人サイトもあれば、暗号通貨やブロックチェーンプロジェクトに特化したものもあります。後者のプラットフォームは攻撃者の目的により合っています。攻撃に使用されているプラットフォームを以下に示します。

  • LinkedIn
  • Upwork
  • Freelancer.com
  • We Work Remotely
  • Moonlight
  • Crypto Jobs List

最も多く観察されているセキュリティ侵害の手口は、偽のリクルーターが被害者に採用試験と称して、トロイの木馬が仕込まれたプロジェクトに参加させたり、「リクルーター」のためにバグ修正を手伝わせ、その報酬として金銭を提供したりするものです。

被害者は、サイトからファイルを直接転送するか、あるいはGitHub、GitLab、Bitbucketのようなリポジトリへのリンクから、プロジェクトファイルを受け取ります。被害者は、ファイルをダウンロードし、機能を追加したりバグを修正したりして、リクルーターに報告するよう求められます。さらに、プロジェクトをテストするためにビルドして実行するよう指示されますが、この時に最初のセキュリティ侵害が発生します。通常、使用されるリポジトリは非公開であるため、被害者は最初にアクセスを許可するためにアカウントIDやメールアドレスを提供するように求められます。これは、セキュリティ研究者に悪意のある活動を検出されないようにするためだと考えられます。

それにもかかわらず、これらのリポジトリが公開されているケースが多く見受けられました。これらは主に被害者がタスクを完了した後、自分のリポジトリにアップロードしたものであることが分かりました。図3は、GitHubでホストされているトロイの木馬が仕込まれたプロジェクトの例を示しています。ESETは、観測されたすべての悪意のあるコードを、影響を受けているサービスを提供している企業に報告しています。

トロイの木馬が仕込まれたプロジェクトは、以下の4つのカテゴリのいずれかに分類されます。

  • 採用のための課題
  • 暗号通貨プロジェクト
  • ゲーム(通常、ブロックチェーン機能を使用するゲーム)
  • ブロックチェーン/暗号通貨機能があるギャンブルやカジノ

これらのリポジトリは、既存のオープンソースプロジェクトやデモの複製であることが多く、悪意のあるコードを追加したりREADMEファイルを変更したりする以外には、ほとんど変更が加えられていません。悪意のあるプロジェクト名と、プロジェクトを運用している攻撃者が管理するアカウント名(確認できたもの)の一部を、表1に示します。

プロジェクト作成者プロジェクト作成者
Website-TestHiring-Main-Supportcasino-template-paidbmstore
guru-challengeChiliz-Gurucasino-democasinogamedev
baseswap_ver_4artemreinvpointfreebling-v3
metaverse-backendmetaverse-ritechBlockchain-gameN/A
lisk-parknetworkMariaMar18093DWorld-tectera-betaN/A

表1. 観測されたプロジェクト名とリポジトリ/コミット作成者

また、表2に示すように、攻撃者が既存のプロジェクトや企業になりすますために、似たような名前を使用したり、LLC、Ag、Inc(法人の種類を示す略語)を名前に付け加えたりする手法も確認されています。

プロジェクト作成者
プロジェクト作成者
Lumanagi-DexLUMANAGI-LLC
DARKROOM-NFTDarkRoomAg
DarkRoomWonderKiln-Inc

表2. 観察された正当なプロジェクトになりすますプロジェクト名およびリポジトリ/コミット作成者

この攻撃者は悪意のあるコードを隠蔽するために巧妙な手口を使用しています。通常、開発者に与えられたタスクとは関係のないバックエンドコードの無害なコンポーネントに悪意のあるコードを配置したり、長いコメントの後ろの1行としてコードを追加したりする方法が使用されています。この方法では、悪意のあるコードが画面外に移動され、被害者がスクロールしない限り、またはコードエディタの自動折り返し機能が有効でない限り、隠れたままになります。GitHubのコードエディタでは自動折り返しが有効になっていないため、図4に示すように、リポジトリ内のコードを見ても悪意のあるコードを簡単に見つけることはできません。

ESETが確認したもう1つの侵害方法は、偽のリクルーターが被害者を、オンライン会議プラットフォームを使用する採用面接に招待し、必要な会議ソフトウェアをダウンロードできるWebサイトへのリンクを提供するものです。図5に示すように、このWebサイトは通常、既存の会議プラットフォームのWebサイトを複製したものであり、ダウンロードされたソフトウェアには第一段階のマルウェアが含まれています。

ツールセット

DeceptiveDevelopmentは、主に2つのマルウェア系統をその活動に使用しています。これらのマルウェアは2段階で配信されます。最初のステージであるBeaverTailには、JavaScript版とネイティブ版(Qtプラットフォームを使用してC++で記述)があり、被害者にプロジェクトの一部として、あるいは採用試験や、MiroTalkFreeConferenceなどのトロイの木馬が仕込まれたリモート会議ソフトウェア内に偽装されて配信されます。

BeaverTailは、ブラウザのデータベースから保存されているログイン情報を抽出する簡易なログイン情報の収集ツールとして機能します。また、第二段階のマルウェアである「InvisibleFerret」をダウンロードする役割も果たします。InvisibleFerretは、スパイウェアとバックドアコンポーネントを含むPythonベースのモジュール型のマルウェアで、侵害後の活動のために、正規のリモート管理および監視ソフトウェアであるAnyDeskをダウンロードすることもできます。図6に、最初の侵害からデータの送信、AnyDeskの展開までの全体的な侵害チェーンを示します。

BeaverTailとInvisibleFerretの両方は、Unit 42およびGroup-IBObjective-Seeが既に報告しています。Zscalerも同時に調査を行っており、その調査結果をESETも確認することができました。ESETの分析には、これまで報告されていない詳細な内容が含まれており、この悪意のある活動を包括的に把握することができます。

 

BeaverTail

BeaverTailは、DeceptiveDevelopmentによって使用されている情報窃取型マルウェアおよびダウンローダーです。2つの異なるバージョンが存在し、1つはJavaScriptで記述され、簡単に難読化された状態でトロイの木馬化されたプロジェクトに直接組み込まれています。もう1つのバージョンはQtプラットフォームを使用して構築されたネイティブバージョンで、会議ソフトウェアのように偽装されています。後者のバージョンは、Objective-Seeによって最初に報告されています。どちらのバージョンも、機能において強い共通点があります。

このマルウェアはWindows、Linux、macOSのシステムを標的とし、保存されたログイン情報と暗号通貨ウォレットのデータを収集することを目的としています。

最初にC&CのIPアドレスとポート情報を取得します。使用されるIPアドレスはさまざまですが、使用されるポートは通常1224または1244のいずれかであることから、悪意のあるネットワークアクティビティを容易に特定することができます。JavaScriptバージョンでは、IPアドレスとポートはbase64エンコードで難読化され、3つの部分に分割されて順番が入れ替えられ、自動的に復号されるのを防ぎます。他の文字列もbase64でエンコードされています。多くの場合、単純な復号を妨害するために、結果の文字列の前にダミーの文字が1つ追加されています。ネイティブバージョンは、IP、ポート、その他の文字列がすべて平文で保存されています。難読化されたJavaScriptコードを図7に、難読化を解除したコードを図8に示します。

次にBeaverTailは、Google Chrome、Microsoft Edge、Opera、およびBraveブラウザにインストールされているブラウザ拡張機能を検索し、Chrome WebストアまたはMicrosoft Edgeアドオンからハードコードされたリストの拡張機能名に一致するものがあるかどうかをチェックします。括弧内に記載されたブラウザは拡張機能のソースを示しています。なお、OperaとBraveもChromiumベースであるため、Chrome Webストアの拡張機能を使用しています。

  • nkbihfbeogaeaoehlefnkodbefgpgknn – MetaMask(Chrome)
  • ejbalbakoplchlghecdalmeeeajnimhm – MetaMask(Edge)
  • fhbohimaelbohpjbbldcngcnapndodjp – BNB Chain Wallet(Chrome)
  • hnfanknocfeofbddgcijnmhnfnkdnaad – Coinbase Wallet(Chrome)
  • ibnejdfjmmkpcnlpebklmnkoeoihofec – TronLink(Chrome)
  • bfnaelmomeimhlpmgjnjophhpkkoljpa – Phantom(Chrome)
  • fnjhmkhhmkbjkkabndcnnogagogbneec – Ronin Wallet(Chrome)
  • aeachknmefphepccionboohckonoeemg – Coin98 Wallet(Chrome)
  • hifafgmccdpekplomjjkcfgodnhcellj – Crypto.com Wallet(Chrome)

これらの拡張機能が見つかった場合、そのディレクトリからいずれかの.ldbおよび.logファイルが収集され、外部に送信されます。

これらのファイルに加えて、マルウェアはユーザーのホームディレクトリにある.config/solana/id.jsonに保存されたSolanaキーを含むファイルも窃取しようとします。BeaverTailは次に、/Library/Keychains/login.keychain(macOS)または/.local/share/keyrings/(Linux)に保存されたログイン情報を探します。ログイン情報が存在する場合、/.mozilla/firefox/にあるFirefoxログインデータベースkey3.db、key4.db、logins.jsonもこの時に送信されます。

BeaverTailの各検体には、識別のために使用される被害者IDが含まれています。これらのIDは、すべてのダウンロードとアップロードで識別子として侵害チェーン全体で使用されます。これらのIDは各被害者に固有であり、窃取した情報を被害者の公開プロフィールに結びつけるために使用されている可能性があります。

収集されたデータは、コンピュータのホスト名と現在のタイムスタンプとともに、C&Cサーバーの「/uploads」APIエンドポイントにアップロードされます。次に、スタンドアロンのPython環境がp2.zipというアーカイブでダウンロードされ、C&Cサーバー上でホストされ、次の段階のマルウェアを実行します。最後に、次の段階でC&Cサーバー(APIエンドポイント「/client/」)から.nplという名前でユーザーのホームディレクトリにダウンロードされ、ダウンロードされたPython環境を使用して実行されます。

ESETは2024年8月に、JavaScriptで記述されたBeaverTailの新しいバージョンを確認しました。このバージョンは、トロイの木馬が仕込まれたプロジェクトに配置されたコードがローダーとしてのみ機能し、リモートサーバーから実際のペイロードコードをダウンロードして実行します。また、異なる難読化手法が使用されており、以下の4つの新しい暗号通貨ウォレットの拡張機能が標的リストに追加されています。

  • • jblndlipeogpafnldhgmapagcccfchpi – Kaia Wallet(Chrome)
  • • acmacodkjbdgmoleebolmdjonilkdbch – Rabby Wallet(Chrome)
  • • dlcobpjiigpikoobohmabehhmhfoodbb – Argent X - Starknet Wallet(Chrome)
  • • aholpfdialjgjfhomihkjbmgjidlcdno – Exodus Web3 Wallet(Chrome)

Webサイトipcheck[.]cloudを調査したところ、ホームページが悪意のあるWebサイトmirotalk[.]netのミラーであり、リモート会議ソフトウェアとして偽装されたネイティブなBeaverTailマルウェアを提供しているが分かりました。このことから、新しいJavaScriptとBeaverTailのネイティブバージョンが直接関連していると考えられます。

InvisibleFerret

InvisibleFerretは、情報窃取とリモートから攻撃する機能を備えたモジュール型のマルウェアであり、Pythonで記述されています。メイン(.nplファイル)、ペイロード(pay)、ブラウザ(bow)、AnyDesk(adc)の4つのモジュールで構成されています。このマルウェアは、侵害チェーンの最後に展開されるAnyDeskクライアントを除けば、常駐化のためのメカニズムがありません。AnyDeskを介して常駐すると、攻撃者はInvisibleFerretを自由に実行できます。

注意が必要なのは、このマルウェアのバックドア機能のほとんどが、コマンドの送信や流出させるデータ、攻撃を拡大する方法の決定など、オペレーターが手動で、またはスクリプトによって制御する必要があるという点です。ESETは観察したInvisibleFerretの全バージョンのバックドアコンポーネントはオペレーターのコマンドによって起動されています。オペレーターによって実行されない唯一の機能は、初期のフィンガープリントの作成であり、これは自動的に行われます。

メインモジュール

メインモジュールは、元々はmainという名前でしたが、現在は.nplファイルになっており、BeaverTailがコマンドアンドコントロールサーバーからダウンロードし、ホームディレクトリに保存します。このモジュールは、個々のペイロードモジュールをダウンロードして実行します。図9に示すように、すべてのモジュールには、XORで暗号化されBase64でエンコードされたペイロードが含まれており、その前にXORキーを表す4バイトがあります。その後にexecを介してそれを復号し実行するコードが続きます。各モジュールにはsType変数が含まれます。この変数には、現在の被害者IDが含まれます。このIDは、ダウンロードリクエストで指定されたIDのコピーです。スクリプトファイルのダウンロードリクエストが行われると、このIDがsTypeの値としてC&CサーバーのAPIによって最終的なスクリプトファイルに配置されます。

このモジュールには、base64でエンコードされ、ハードコードされたC&Cアドレスが含まれています。このアドレスは簡単に復号できないように半分に分割されて入れ替えられています。ESETが観察した多くのケースで、このアドレスは先のBeaverTailの検体で使用されたアドレスと同一でした。メインモジュールは、ペイロードモジュールを/payload/<campaign_ID>からユーザーのホームディレクトリの.n2/payにダウンロードして実行します。その後、macOSで実行されている場合(platform.system関数への呼び出しがDarwinを返すかどうかで判断)、終了します。macOS以外のオペレーティングシステムでは、ブラウザモジュールを/brow/<campaign_ID>からユーザーのホームディレクトリの.n2/bowにダウンロードし、別のPythonインスタンスで実行します。

ペイロードモジュール

payモジュールは2つの部分で構成されています。1つは情報を収集し、もう1つはバックドアとして機能します。最初の部分には、通常、ハードコーディングされたC&C URL(以前に使用されたものと類似)が含まれており、次の情報を収集します。

  • ユーザーのUUID
  • OSのタイプ
  • PCの名前
  • ユーザー名
  • システムのバージョン(リリース)
  • ローカルIPアドレス
  • 公開IPアドレスおよびhttp://ip-api.com/jsonから解析される地理情報(地域名、国名、市名、郵便番号、ISP、緯度、経度)

図10に示すこれらの情報は、HTTP POSTを使用して「/keys」APIエンドポイントにアップロードされます。

2番目の部分はTCPバックドア、TCPリバースシェルとして機能し、C&Cサーバーからリモートコマンドを受信し、ソケット接続を介して通信します。通常、1245ポートが使用されますが、80ポート、2245ポート、3001ポート、5000ポートも使用されていることが観測されています。この部分にハードコードされるC&C IPアドレスが、過去のアドレスとは異なる場合がありますが、これは最初の展開と、最終的なネットワークアクティビティを分離するためである可能性が高いと考えられます。

2番目のペイロードは、実行されている環境がWindowsかどうかを確認します。Windowsである場合、図11に示すように、pyWinHookを使用して実装されるキーロガーと、pyperclipを使用してクリップボードスティーラーを有効にします。これらのマルウェアは、すべてのキー入力とクリップボードの変更をグローバルバッファに収集して保存し、スクリプト自体が実行されている限り、専用スレッドで動作します。

その後、表3に示す8つのコマンドから構成されるバックドア機能を実行します。

IDコマンド関数説明
1ssh_cmd侵害の痕跡を削除します。
  • delete引数のみをサポートします。
  • 操作を終了し、侵害の痕跡を削除します。
2ssh_objシェルコマンドを実行します。
  • 指定された引数を、Pythonのsubprocessモジュール経由でシステムシェルを使って実行し、コマンドによって生成されたすべての出力を返します。
3ssh_clipキーロガーやクリップボードスティーラーのデータを外部に送信します。
  • キーロガーとクリップボードスティーラーのバッファーコンテンツをC&Cサーバーに送信し、バッファーを消去します。
  • Windows以外のOSでは、キーロギング機能が有効になっていないため、空の応答が送信されます。
4ssh_runブラウザモジュールをインストールします。
  • ブラウザモジュールをユーザーのホームディレクトリの.n2/bowにダウンロードし、新しいPythonインスタンスで実行します(WindowsではCREATE_NO_WINDOWとCREATE_NEW_PROCESS_GROUPフラグを設定します)。
  • OS名とget browseをサーバーに返信します。
5ssh_uploadFTPを使用してファイルやディレクトリを外部に送信します。
  • サーバーアドレスと認証情報を引数で指定し、指定されたFTPサーバーにファイルをアップロードします。
  • sdira、sdir、sfile、sfinda、sfindr、sfindの6つのサブコマンドがあります。
    • sdira - argsで指定されるすべてのディレクトリをアップロードし、ex_dirsアレイの最初の5つの要素に一致するディレクトリはスキップします。アップロードが開始されると、>> upload all start:に続けてディレクトリ名をサーバーに送信し、ディレクトリの走査が完了すると‑counts:に続けてアップロードするファイル数を送信し、すべてのアップロードが完了するとuploaded successを送信します。
    • sdir - sdiraに似ていますが、ex_filesで除外されない拡張子があり、ex_dirsで除外されていないディレクトリに含まれる104,857,600バイト(100MB)未満のファイルのみを送信します。サーバーへの最初のメッセージは、> upload start:であり、その後にディレクトリ名が続きます。
    • sfile - sdirと似ていますが、単一のファイルを送信します。拡張子が.zip、.rar、.pdfの場合、またはex_filesリストにある場合、直接アップロードされます。これらのファイルは、アップロードから除外されるのではなく、暗号化から除外されます。これら以外のファイルは、アップロードの前にハードコードされたキーG01d*8@(を使用してXORで暗号化されます。
    • sfinda - 指定されたパターンに一致するファイルを、指定されたディレクトリとそのすべてのサブディレクトリ(ex_dirsリストにあるものを除く)で検索し、ex_filesリストとは一致しないファイルをアップロードします。起動時に、>ufind start:に続けて起動ディレクトリをサーバーに送信し、終了するとufind successを送信します。
    • sfindr - sfindaに似ていますが、再帰検索は行いません。指定したディレクトリのみを検索します。
    • sfind - sfindaに似ていますが、カレントディレクトリで検索を開始します。
6ssh_killChromeとBraveブラウザを終了します。
  • 図12に示すように、Windowsではtaskkillコマンド、その他のオペレーティングシステムではkillallコマンドを使用してブラウザを終了します。
  • Chrome & Browser are terminatedとサーバーに返信します。
7ssh_anyAnyDeskモジュールをインストールします。
  • このコマンドは、ssh_runコマンドと同じように動作し、ユーザーのホームディレクトリの.n2フォルダにAnyDeskモジュールをダウンロードして実行します。
  • OS名とget anydeskをサーバーに返信します。
8ssh_envFTPを使用して、ユーザーのホームディレクトリとマウントされたドライブからデータをアップロードします。
  • --- uenv startをサーバーに送信します。
  • 引数で指定されたサーバーアドレスと認証情報を使用して、FTP接続を確立します。
  • Windowsでは、DocumentsとDownloadsフォルダのディレクトリ構造と内容、およびDからIドライブの内容をアップロードします。
  • 他のオペレーティングシステムでは、ユーザーのhomeディレクトリ全体と、マウントされたすべてのドライブを含む/Volumesディレクトリをアップロードします。
  • 20,971,520バイト(20 MB)より小さいファイルのみをアップロードし、ex_dirリストに一致するディレクトリと、図13に示しているex_files、ex_files1、ex_files2リストと一致するファイルを除外します。
  • --- uenv successをサーバーに送信して終了します。

表3. InvisibleFerretに実装されているコマンド

各コマンドには、接頭辞ssh_が付けられて命名され、サーバーとの通信時に使用される数値が割り当てられます。受信した各コマンドに対して、新しいスレッドが生成され実行されます。そして、クライアントはすぐに次のコマンドの受信を待機し始めます。コマンドの実行が完了するたびに、コマンドへの返信は非同期で送信されます。双方向通信は、JSON形式で次の2つのフィールドを使用して、ソケットを通じて行われます。

  • command - 数値のコマンドIDを示します。
  • args - サーバーとクライアント間で送信される追加データが含まれます。

このスクリプトには、データを外部に送信する際にスキップする除外ファイル名やディレクトリ名(ソフトウェアプロジェクトやリポジトリのキャッシュディレクトリや一時ディレクトリなど)のリストや、送信する重要なファイル名前のパターン(環境ファイルや設定ファイル、secret、wallet、private、passwordなどの単語を含むドキュメント、スプレッドシート、その他のファイル)のリストも含まれています。

 

ブラウザモジュール

bowモジュールは、Webブラウザによって保存されたログインデータ、自動入力データ、および支払い情報を窃取する役割を果たします。標的となるブラウザは、Chrome、Brave、Opera、Yandex、Edgeで、すべてChromiumベースです。図13に示すように、3つの主要な各オペレーティングシステム(Windows、Linux、macOS)向けの複数のバージョンがあります。

ブラウザのローカルストレージフォルダを検索し(図14で例を参照)、ログインと支払い情報を含むデータベースを、Windowsでは%Temp%フォルダに、他のオペレーティングシステムでは/tmpフォルダに、次の2つのファイルとして保存します。

  • ユーザーのログイン情報を含むLoginData.db
  • 保存された支払い情報(クレジットカード情報)を含むwebdata.db

保存されたパスワードとクレジットカード番号は、AESを使って暗号化された形式で保存されているため、外部に送信する前に復号する必要があります。このために使用される暗号化キーは、使用しているオペレーティングシステムに基づいて取得されます。図15に示すように、WindowsではブラウザのLocal Stateファイルから抽出され、Linuxではsecretstorageパッケージから、macOSではセキュリティユーティリティから取得されます。

収集された情報(図16を参照)は、「/keys」APIエンドポイントへのHTTP POSTリクエストによってC&Cサーバーに送信されます。

AnyDeskモジュール

adcモジュールは、この侵害チェーンで特定された唯一の常駐化のメカニズムであり、ハードコードされたログイン認証情報を含む設定ファイルを使用して、被害者のコンピュータにAnyDeskへのアクセスを設定します。

Windowsでは、C:/Program Files (x86)/AnyDesk/AnyDesk.exeが存在するかどうかを確認します。存在しない場合、C&Cサーバー(http://&lt;C&C_IP>:<C&C_port>/anydesk.exe)からanydesk.exeをユーザーのホームディレクトリにダウンロードします。

次に、ハードコードされたパスワードハッシュ、パスワードソルト、トークンソルトの値を設定ファイルに入力して、攻撃者がアクセスできるようにAnyDeskを設定します。設定ファイルが存在しないか、攻撃者が指定したパスワードソルト値が含まれない場合、モジュールはハードコードされたログイン情報を追加するために、設定ファイルを修正しようとします。修正に失敗すると、ユーザーのホームディレクトリにconf.ps1という名前のPowerShellスクリプトを作成して起動しようとします。このスクリーンショットには、設定ファイルを変更するコードが含まれます(図17を参照)。

これらのアクションが完了すると、AnyDeskプロセスは強制終了され、新しい設定をロードするために再起動されます。最後に、adcモジュールは、os.remove関数を呼び出して、自身を削除しようとします。

 

InvisibleFerretのアップデート版

ESETはその後、少なくとも2024年8月以降から使用されている、大規模な変更が加えられたInvisibleFerretのアップデート版を発見しました。アップデート版は、個別のモジュールに分かれておらず、単一の大きなスクリプトファイルになっています(ただし、ブラウザモジュールとAnyDeskモジュールを選択的にインストールするバックドアコマンドはそのまま残っています)。また、macOSのサポートが強化されており、例えば、コンピュータのホスト名と一緒にユーザー名を収集するなど一部のコードも若干修正されています。

もう一つの変更は、sTypeに加え、gTypeという識別子が追加されたことです。これは、C&Cサーバーからモジュールをダウンロードする際に、sTypeに加えて、第二の被害者/キャンペーン識別子として機能します(例えば、<C&C_IP>:<port>/<module>/<sType>/<gType>)。ESETは、この識別子が外部に送信するデータにラベルを付けるために使用されているのをこれまで確認していません。

この新しいバージョンのInvisibleFerretは、追加のバックドアコマンドであるssh_zcpも実装しており、ブラウザ拡張機能やパスワードマネージャーからTelegramやFTP経由でデータを外部に送信することができます。

InvisibleFerretの新しいコマンドは、最初にChrome、Brave、Edgeブラウザ用の88個のブラウザ拡張機能を探します。これらの拡張機能が存在する場合は、そこからデータを収集し、システムの一時ディレクトリ内のステージングフォルダに保存します。拡張機能の詳細なリストは付録を参照してください。図18にデータを収集するコードを示します。

このコマンドは、ブラウザ拡張機能のデータに加えて、すべてのシステムでAtomicおよびExodusの暗号通貨ウォレットから情報を抽出できます。さらにWindowsでは1Password、Electrum、WinAuth、Proxifier4、Dashlaneからも情報を抽出できます。これらのデータ抽出を図19に示します。

抽出されたデータはアーカイブされ、ボットトークンとTelegram APIを使ってTelegramチャットにアップロードされ、FTPサーバーにもアップロードされます。アップロードが完了すると、InvisibleFerretはステージングフォルダとアーカイブの両方を削除します。

 

クリップボードスティーラーモジュール

2024年12月、ESETはmlipという名前のモジュールが追加された、別のバージョンのInvisibleFerretを発見しました。これは、C&Cエンドポイント/mclip/から.n2/mlipにダウンロードされます。このモジュールには、ペイロードモジュールの残りの部分から切り離されたキーロギング機能とクリップボードスティーラーの機能が含まれています。

このモジュールは、オペレーターの技術力が進展していることを示しており、このモジュールのキーロギングおよびクリップボードスティーラー機能は、chrome.exeとbrave.exeの2つのプロセスのみに限定されています。過去のバージョンのInvisibleFerretは、すべてのキー入力を記録していました。収集されたデータは新しいAPIエンドポイント「/api/clip」にアップロードされます。

 

ネットワークインフラストラクチャ

DeceptiveDevelopmentのネットワークインフラストラクチャは、商用ホスティングプロバイダーがホスティングする専用サーバーで構成されており、最も一般的に使用されているプロバイダーはRouterHosting(現在はCloudzy)、Stark Industries Solutions、Pier7ASNの3社です。サーバーAPIはNode.js内に記述されており、表4に示す9つのエンドポイントで構成されています。

APIエンドポイント説明
/pdownPython環境のダウンロード。
/uploadsBeaverTailデータアップロード。
/client/InvisibleFerretローダー。
/payload/InvisibleFerretペイロードモジュール。
/brow/InvisibleFerretブラウザモジュール。
/adc/InvisibleFerret AnyDeskモジュール。
/mclip/InvisibleFerretキーロガーモジュール。
/keysInvisibleFerretデータアップロード。
/api/clipInvisibleFerretキーロガーモジュールによるデータアップロード。

表4. DeceptiveDevelopmentのC&C APIエンドポイント

ESETが観測した多くのC&C通信は、HTTP経由の通信のために、1224または1244ポート(80または3000ポートが使用されるケースもあり)を介して行われています。そして、TCPソケット経由のバックドアのC&C通信には、1245(80、2245、3001、5000、または5001)が使用されています。クライアントからC&Cサーバーへの通信では、Python環境をダウンロードする場合を除いて、すべてキャンペーンIDが含まれます。InvisibleFerretのダウンロードでは、GETリクエストのURLの末尾にIDが追加されます。データを外部に送信するときに、typeフィールドのPOSTリクエストの一部としてIDが送信されます。ネットワークトラフィックを識別し、どの検体やキャンペーンに属するかを判断するためにキャンペーンIDが利用されています。

ESETが観察したキャンペーンID(sTypeとgTypeの値)は英数字であり、キャンペーンとは直接関連がないと考えられます。gTypeが導入される以前は、sTypeの値のいくつかは、5Team9や7tEaM;など、teamという単語のバリエーションと数字を含むbase64文字列でした。gTypeが導入された後、観測された両方の多くの値は、base64を使用しない純粋な数値になりました。

結論

DeceptiveDevelopmentグループは、北朝鮮とつながりのあるサイバー攻撃者が外貨を獲得するためにすでに使用しているさまざまな攻撃手法に追加されたものであり、窃取の対象を一般的な外貨から暗号通貨へ移行している現在の傾向が反映されています。ESETの調査によって、簡易なツールや手法から高度で高機能なマルウェアへと変化しており、被害者を誘引し、マルウェアを展開する手法も洗練されていることが明らかになりました。あらゆるオンライン求人検索やフリーランスプラットフォームが、偽のリクルーターによってマルウェアの配信に悪用されるリスクがあります。ESETは、このキャンペーンに関連する重大な活動を引き続き観察しており、DeceptiveDevelopmentが暗号通貨を利用するユーザーを標的にするための新たな手段を今後も模索することが予測されます。

IOC(セキュリティ侵害の痕跡)

IoC(セキュリティ侵害の痕跡)の詳細なリストと検体は、ESETのGitHubリポジトリに掲載されています。

 

ファイル

SHA-1ファイル名検出説明
48E75D6E2BDB2B00ECBF4801A98F96732E397858FCCCall.exeWin64/DeceptiveDevelopment.Aトロイの木馬が仕込まれた会議アプリ - ネイティブBeaverTail。
EC8B6A0A7A7407CA3CD18DE5F93489166996116Cpay.pyPython/DeceptiveDevelopment.BInvisibleFerretペイロードモジュール。
3F8EF8649E6B9162CFB0C739F01043A19E9538E7bow.pyPython/DeceptiveDevelopment.CInvisibleFerretブラウザモジュール。
F6517B68F8317504FDCD415653CF46530E19D94Apay_u2GgOA8.pyPython/DeceptiveDevelopment.BInvisibleFerretの新しいペイロードモジュール。
01C0D61BFB4C8269CA56E0F1F666CBF36ABE69ADsetupTest.jsJS/Spy.DeceptiveDevelopment.ABeaverTail。
2E3E1B95E22E4A8F4C75334BA5FC30D6A54C34C1tailwind.config.jsJS/Spy.DeceptiveDevelopment.ABeaverTail。
7C8724B75BF7A9B8F27F5E86AAC9445AAFCCB6ACconf.ps1PowerShell/DeceptiveDevelopment.AAnyDeskを設定するPowerShellスクリプト。
5F5D3A86437082FA512B5C93A6B4E39397E1ADC8adc.pyPython/DeceptiveDevelopment.AInvisibleFerret AnyDeskモジュール。
7C5B2CAFAEABBCEB9765D20C6A323A07FA928624bow.pyPython/DeceptiveDevelopment.AInvisibleFerretブラウザモジュール。
BA1A54F4FFA42765232BA094AAAFAEE5D3BB2B8Cpay.pyPython/DeceptiveDevelopment.AInvisibleFerretペイロードモジュール。

ネットワーク

IPドメインホスティングプロバイダー最初に確認された日付詳細
95.164.17[.]24N/ASTARK INDUSTRIES SOLUTIONS LTD2024年6月6日BeaverTail/InvisibleFerret C&C and staging server.
185.235.241[.]208 N/ASTARK INDUSTRIES SOLUTIONS LTD2021年4月12日 BeaverTail/InvisibleFerret C&C and staging server.
147.124.214[.]129 N/AMajestic Hosting Solutions, LLC2024年3月22日 BeaverTail/InvisibleFerret C&C and staging server.
23.106.253[.]194 N/ALEASEWEB SINGAPORE PTE. LTD.2024年5月28日 BeaverTail/InvisibleFerret C&C and staging server.
147.124.214[.]237 N/AMajestic Hosting Solutions, LLC2023年01月28日 BeaverTail/InvisibleFerret C&C and staging server.
67.203.7[.]171 N/AAmaze Internet Services2024年2月14日 BeaverTail/InvisibleFerret C&C and staging server.
45.61.131[.]218 N/ARouterHosting LLC2024年1月22日 BeaverTail/InvisibleFerret C&C and staging server.
135.125.248[.]56 N/AOVH SAS2023年6月30日 BeaverTail/InvisibleFerretのC&Cとステージングサーバー。

MITRE ATT&CKの技術

この表は、MITRE ATT&CKフレームワークのバージョン16を使用して作成されています。

手法ID名前説明
リソース開発T1583.003インフラストラクチャの取得:仮想プライベートサーバー この攻撃者は、C&Cやステージングサーバー用のインフラをレンタルしています。
T1587.001開発能力:マルウェア この攻撃者はBeaverTailとInvisibleFerretマルウェアを開発しています。
T1585.001アカウントの確立:ソーシャルメディアアカウント この攻撃者は偽のソーシャルメディアアカウントを作成し、リクルーターのように偽装しています。
T1608.001ステージングサーバーの能力マルウェアのアップロード InvisibleFerretモジュールはステージングサーバーにアップロードされ、そこから被害者のシステムにダウンロードされます。
初期アクセスT1566.003フィッシング:SNSによるスピアフィッシング 求人検索サイトやフリーランサープラットフォームを介してスピアフィッシングが実行されます。
実行T1059.006コマンドラインインターフェイス:PythonInvisibleFerretは、Pythonで記述されています。
T1059.007コマンドラインインターフェイス: JavaScript/JScriptBeaverTailにはJavaScriptで記述された亜種があります。
T1204.002ユーザーによる実行:悪意のあるファイル 最初の侵害は、被害者がBeaverTailマルウェアを含むトロイの木馬が仕込まれたプロジェクトを実行すると引き起こされます。
T1059.003コマンドラインインターフェイス:Windowsコマンドシェル InvisibleFerretのリモートシェル機能によって、Windowsコマンドシェルへのアクセスが可能になります。
常駐化T1133外部のリモートサービス AnyDeskリモートアクセスツールをインストールおよび設定することで攻撃者は常駐します。
防衛機能の回避T1140ファイルや情報の難読化解除と復号 BeaverTailのJavaScriptの亜種は、コードを難読化します。C&Cサーバーのアドレスやその他の設定データも暗号化/エンコードされます。
T1564.001アーチファクトの隠蔽:ファイルとディレクトリの隠蔽 InvisibleFerretのファイルは、hidden属性が付けられてディスクにドロップされます。
T1564.003アーチファクトの隠蔽:画面の隠蔽 InvisibleFerretは、画面を表示せずに新しいプロセスを作成します。
T1027.013ファイルや情報の難読化:暗号化/エンコードされたファイル InvisibleFerretのペイロードは暗号化されており、実行前に復号する必要があります。
認証情報へのアクセスT1555.001パスワードの保管場所からの認証情報の窃取:キーチェーン BeaverTailとInvisibleFerretの両方が、キーチェーンデータを外部に送信します。
T1555.003パスワードの保管場所からの認証情報の窃取:Webブラウザからの認証情報の窃取 InvisibleFerretは、Webブラウザに保存される認証情報を外部に送信します。
T1552.001保護されていない認証情報:ファイル内の認証情報 BeaverTailとInvisibleFerretの両方が、特定のファイルにあるプレーンテキストの認証情報/キーを外部に送信します。
探査T1010実行されているアプリケーションの検出 InvisibleFerretキーロガーは、現在アクティブなウィンドウの名前を収集します。
T1217ブラウザブックマークの検出 InvisibleFerretは、ブラウザに保存された認証情報やその他のデータを外部に送信します。
T1083ファイルおよびディレクトリの検出 InvisibleFerretバックドアは、ファイルシステムをブラウズし、ファイルを外部に送信できます。
T1082システム情報の検出 BeaverTailとInvisibleFerretの両方が、システム情報を収集します。
T1614システムの場所の検出 InvisibleFerretは、IPアドレスの位置を照会して、キャンペーンの地理情報を特定します。
T1016システムネットワーク構成の検出 InvisibleFerretは、プライベートIPアドレスやパブリックIPアドレスなどのネットワーク情報を収集します。
T1124システム時間の検出 InvisibleFerretは、システム時間を収集します。
ラテラルムーブメントT1021.001リモートサービス:RDP(リモートデスクトッププロトコル) InvisibleFerretは、AnyDeskを使用して常駐します。AnyDeskは攻撃者によるリモートアクセスを許可するために使用されます。
収集T1056.001入力情報の取得:キーロギング InvisibleFerretにはキーロガー機能が含まれます。
T1560.002収集したデータのアーカイブ:ライブラリ経由のアーカイブ InvisibleFerretを使用して外部に送信されるデータは、Pythonのパッケージであるpy7zrとpyzipperを使用してアーカイブされる場合があります。
T1119自動収集 BeaverTailとInvisibleFerretの両方が、一部のデータを自動的に外部に送信します。
T1005ローカルシステムのデータ BeaverTailもInvisibleFerretの両方が、ローカルシステムからデータを外部に送信します。
T1025リムーバブルメディアのデータ InvisibleFerretは、リムーバブルメディアをスキャンして、ファイルを外部に送信します。
T1074.001データの保存:ローカルデータの保存 InvisibleFerretは、認証情報を抽出する前に、ブラウザデータベースを一時フォルダにコピーします。ZIP/7zアーカイブを経由して送信する場合、ファイルはアップロードされる前にローカルで作成されます。
T1115クリップボードのデータ InvisibleFerretにはクリップボードスティーラー機能が含まれています。
C&C(コマンド&コントロール)T1071.001標準のアプリケーションレイヤープロトコル:Webプロトコル C&Cとの通信はHTTPを介して行われます。
T1071.002標準のアプリケーションレイヤープロトコル:ファイル転送プロトコル InvisibleFerretは、FTP経由でファイルを外部に送信します。
T1571非標準ポート BeaverTailとInvisibleFerretは、非標準ポート1224、1244、1245を使用します。
T1219リモートアクセスツール InvisibleFerretは、常駐のためのメカニズムとしてAnyDeskをインストールできます。
T1095アプリケーションレイヤープロトコル以外の手法: TCPはコマンドアンドコントロールサーバーとの通信に使用されます。
情報の外部への送信T1030データ転送サイズの制限 InvisibleFerretは、場合によって特定のファイルサイズ以下のファイルのみを外部に送信します。
T1041コマンドアンドコントロールサーバーのチャネルからのデータの流出 一部のデータはHTTP経由でC&Cサーバーに送信されます。
T1567.004Webサービスを介したデータの外部への流出:Webhookを介した外部への送信 TelegramのWebhook(InvisibleFerretのssh_zcpコマンド)を介して、ZIP/7zファイルが送信される場合があります。
影響T1657金融資産の窃取 このキャンペーンの目的は暗号通貨を窃取することであり、InvisibleFerretは保存されたクレジットカード情報を送信していることも確認されています。

付録

新しいInvisibleFerretが標的とするブラウザ拡張機能のリストを以下に示します。