ForceMemがGitHubアカウントをハイジャック、Pythonリポジトリにバックドア

ForceMemoは、GitHubアカウントをハイジャックし、WebUIで正当に見える強制プッシュコミットを通じてPythonリポジトリにサイレントにバックドアを仕込む、活発なソフトウェアサプライチェーン攻撃キャンペーンです。

GlassWormの盗まれたトークンエコシステムを基に構築され、Solanaブロックチェーンをレジリエント・コマンド・アンド・コントロール(C2)チャネルとして使用しており、検出と排除を大幅に困難にしています。

攻撃者は、Djangoアプリ、機械学習研究リポジトリ、Streamlitダッシュボード、Flask API、およびGitHubインストールパッケージなど、インストール時または実行時にsetup.py、main.py、またはapp.pyが実行される幅広いPythonプロジェクトを対象としています。

StepSecurityの脅威インテリジェンスチームは、進行中の運用としてForceMemoを追跡しており、数百のGitHubアカウントを侵害し、数百のリポジトリに同一のPythonマルウェアを注入しており、最も古い既知の注入は2026年3月8日です。

侵害されたリポジトリから直接pip installを実行したり、コードをクローンして実行したりするすべての開発者は、透過的に悪意のあるペイロードをトリガーします。

確認された1つのケースでは、amirasaran/django-restful-adminのsetup.pyファイルが、正当なインストーラロジック後に難読化されたコードを追加することで修正されたため、CI/CDのpython setup.py installでもマルウェアを起動するのに十分です。

マーカー変数lzcdrtfxyqiplpdのGitHubコード検索は現在数百の結果を返しており、キャンペーンが進行中に影響を受けたプロジェクトを列挙する実用的な方法を防御者に提供します。

GlassWorm経由のアカウント乗っ取り

ForceMemoはGitHub自体を悪用しません。代わりに、悪意のあるVS CodeおよびCursorエクステンションを通じてGlassWormマルウェアによって収集された盗まれた開発者認証情報を悪用します。

Image

GlassWormの後期段階は、git credentialヘルパー、エディタストレージ、~/.git-credentials、およびGITHUB_TOKEN環境変数内でGitHubトークンを検索し、それらを検証して攻撃者制御のインフラストラクチャに流出させます。

GitHubアカウントが乗っ取られると、そのID下のすべてのリポジトリが侵害される傾向があり、リポジトリごとのターゲティングではなくアカウント全体の侵害を示します。

StepSecurityは、BierOne、wecode-bootcamp-korea、HydroRoll-Teamなどのアカウントを強調しており、それぞれが同じ方法でバックドアされた6つのリポジトリを持ち、手動攻撃ではなく自動化ツールであることを確認しています。

Redditの被害者は、ほぼすべてのリポジトリ全体でコミットしている「null」ユーザーを報告し、最終的に侵害をローグCursorエクステンションとGlassWorm感染モデルに遡りました。

ForceMemoの特徴的な特性は、明らかに悪意のあるコミットまたはプルリクエストではなく、git履歴の書き換えを使用することです。

before SHA(260ca635)はPR #16からの正当なマージコミットです。after SHA(17849e1b)は、setup.pyにマルウェアが追加された攻撃者のリベースコミットです。

攻撃者が侵害されたアカウント自身の認証情報を使用するため、プッシュはリポジトリ所有者から来たように見えます。

Image

各ターゲットについて、攻撃者はデフォルトブランチから最後の正当なコミットを取り、キーファイルに難読化されたPythonスタブを追加しながらローカルでリベースし、修正されたコミットを同じブランチに強制プッシュします。

元のコミットメッセージ、著者、および著者日付は保持されるため、GitHubのUIには異常は表示されません。コミッター日付とメール(リテラル文字列nullに設定されることが多い)のみが、書き換えが数日または数年後に発生したことを示しています。

amirasaran/django-restful-adminでは、GitHubのEvents APIが2026年3月10日のPushEventを示しており、デフォルトブランチのbefore SHAはクリーンなPRマージで、after SHAはリベースされた悪意のあるコミット—信頼されたコードをサイレントに置き換えた単一の強制プッシュです。

amirasaran/request_validatorおよびBierOne/relation-vqaなどの他の注目プロジェクト全体に同様の複数年のギャップが現れ、長年安定していたコードの遡及的な改ざんを明確に示しています。

Solanaバックアップされたc2およびNode.jsペイロード

注入されたPythonスタブは、層状のbase64デコード、zlibデコンプレッション、値134でキーされたXOR暗号化を使用して強く難読化され、ランダム化された変数名と大きなbase64ブロブを含む固定マーカー変数lzcdrtfxyqiplpdがあります。

難読化解除は、ロシアのロケーション情報システムでの実行をスキップするロシア語のコメントとロジックを明らかにし、東欧のサイバー犯罪ツールキットの見覚えのあるパターンです。

通常のC2ドメインに到達する代わりに、マルウェアは最大9つの異なるRPCエンドポイント経由で特定のSolanaウォレット(BjVeAjPrSKFiingBn4vZvghsGj9KCE8AJVtbc9S8o8SC)をクエリし、トランザクションメモに埋め込まれたJSON指示を読んで現在のペイロードURLを取得します。

強化されたGitHub Actions環境で実行されると、侵害されたsetup.pyはSolana RPCエンドポイントへのDNS検索を素早く実行し、ブロックチェーンからペイロードURLを取得し、nodejs.orgからNode.js v22.9.0をダウンロードし、暗号化されたJavaScriptペイロードを取得しました。これは復号化され、バンドルされたNode.jsバイナリ経由で実行されます。

最終段階はHTTPヘッダーで配信されるキーでAES暗号化されていますが、オンチェーン構成、CIS除外ロジック、およびNode.jsへの焦点は、ブラウザエクステンション、クッキー、SSHキーを対象とする暗号ウォレットと認証情報スティーラーを強く示唆しています。

オンチェーン分析は、ForceMemoで使用されるSolanaウォレットが2025年11月27日から活動しており、約50のメモ保有トランザクションと、ロシアのネットワークでホストされているノードを含む少なくとも6つの回転ペイロードサーバーIPがあることを示しています。

これはVS CodeおよびOpenVSXエクステンションに対するGlassWormキャンペーンに以前属性付けされた同じウォレットであり、Aikido Securityは目に見えないUnicodeの難読化を使用しているがSolana C2インフラストラクチャが同じGlassWormに侵害された151以上のGitHubリポジトリを別途報告しています。

Image

重複は、ForceMemoが新しいグループではなく、IDEエクステンションから大規模なGitHubアカウント乗っ取りに拡大しているため、GlassWormアクターが運用する新しい配信ベクトルであることを示しています。

ForceMemoの波はまだ進行中であるため、StepSecurityは、GitHubから直接Pythonパッケージをインストールするすべてのチームが、デフォルトブランチが元のメンテナーから最後に知られているコミットと一致することを確認し、説明のない著者コミッター日付のギャップおよびnullコミッターメタデータに密接に注意を払うことをお勧めします。

防御者は、lzcdrtfxyqiplpdのGitHubコード検索を監視に追加し、予期せずSolana RPCに接触したりNode.jsをダウンロードしたりするCI/CDジョブを精査し、Harden-Runnerなどの出力監視ソリューションを展開してビルドスクリプトから異常なネットワークアクティビティを表示する必要があります。

翻訳元: https://gbhackers.com/forcememo-hijacks-github/

ソース: gbhackers.com