「GhostCode」、Microsoftのデバイスコードを悪用してM365トークンを窃取し不正デバイスを登録

eSentireの脅威対応チーム(TRU)は、Microsoftの OAuth 2.0 デバイス認可グラントフローを悪用し、M365アカウントを乗っ取る未確認のデバイスコードフィッシングキット「GhostCode」を発見しました。このキットはプライマリリフレッシュトークン(PRT)を発行し、被害者がMFAを完了してからわずか約78秒で不正なデバイスを密かに登録します。

このキャンペーンは2026年8月下旬に初めて観測されたもので、マルウェアではなくソーシャルエンジニアリングから始まります。

攻撃者はBJ’s Wholesale Clubの調達担当者を装い、標的企業のSalesforceお問い合わせフォームから、登録されて15日しか経っていない偽装ドメイン「bjssourcing[.]com」を使い、当たり障りのない問い合わせを送信しました。

TRUは2026年8月に登録された同種の偽装ドメインを30件以上確認しており、流通業者や製造業者、倉庫業者を標的とするより広範なBEC(ビジネスメール詐欺)型キャンペーンであることがうかがえます。

営業チームが返信すると、攻撃者は「秘密保持契約(NDA)」を口実に、パスワード保護されたHTMLファイル(「3arhCt9c0p.html」)へのWeTransferリンクを送りつけました。このファイルは「FlipBook」形式の文書ビューアーを装っています。

この誘導ファイルには3層の回避策が組み込まれています。1つ目は、ファイルサイズを水増しして類似性ハッシュによる検出を無効化する無意味なパディングデータです。2つ目は、1文字ごとにHTMLコメントを挿入し、正規表現やNLPベースのフィッシング分類器を欺く手法です。3つ目は、AES-256-GCMで暗号化されたリダイレクトURLで、その復号鍵は攻撃者が指定したパスワードからクライアント側でPBKDF2-HMAC-SHA256を用いて生成されるため、被害者がパスワードを入力するまで送信先がサンドボックスやDNSログから隠されます。

eSentireが公開した脅威調査によると、復号後のリダイレクトはJavaScriptによるボット判定チャレンジと、「bot」「curl」「python」といった文字列を拒否するユーザーエージェントのブロックリストを備えたCloudflare Turnstileゲートを通過した後、あるカイロプラクティック医院の侵害されたサブドメイン上でホストされているAI生成のデバイスコードフィッシングページへとたどり着きます。

このキットのバックエンドはMicrosoftの認証ブローカーアプリ(クライアントID: 29d9ed98-a469-4536-ade2-f981bc1d605e)になりすまし、login.microsoftonline.comにデバイスコードを要求します。そして取得したuser_codeをフィッシングページに埋め込み、被害者がそれをMicrosoftの正規のサインインポータルに入力するよう仕向けます。

重要な点として、このキットはジオロケーションAPIにも問い合わせを行い、被害者の所在国に一致するFlashProxy[.]ioの住宅用プロキシ経由でトラフィックをルーティングすることで、条件付きアクセスの「不可能な移動」チェックを無効化しています。

被害者がサインインとMFAを完了すると、そのわずか5秒後にはトークンの悪用が始まります。そして78秒以内に、攻撃者は3台のAzure ADデバイスを登録し、うち1台をIntuneに登録した上で、M365テナント全体に対しSSOと同等のアクセス権を最長14日間付与するプライマリリフレッシュトークンを取得しました。

すべてのリクエストは英国の住宅用IPアドレスを次々と切り替えながら送信され、その中の1つのドイツのIPアドレスはASN 12586(GHOSTnet GmbH)に紐づいていました。このキットの名称は、この事業者名と難読化されたHTMLコードにちなんで付けられています。

TRUは、窃取されたトークンがMFAクレームをそのまま引き継ぐため、MFAはこの攻撃に対して何の防御にもならないと指摘しています。さらに、登録されたIntuneデバイスはトークンが失効した後も存続し続けます。

推奨される対策としては、必要不可欠なアカウントを除くすべてのアカウントについて、条件付きアクセスでデバイスコード認証を無効化すること、MDMベースのデバイスコンプライアンスを強制すること、そして単一のサインインセッションから短時間で複数デバイスが登録される挙動とpython-requestsのユーザーエージェントの組み合わせを監視することが挙げられます。

eSentireは、デバイスコードによるサインインとその後10分以内に発生するpython-requestsの活動を結びつけるKQLハンティングクエリを公開しており、防御側が同様の侵入を検知する手助けとなることを目指しています。

翻訳元: https://cyberpress.org/ghostcode-m365-device-code/

本記事は cyberpress.org の記事を翻訳・要約したものです。