詳細分析
1. AIの「決定的証拠」
人間のマルウェア作者は通常、コメントの中で自分のコードを採点したりしない。このサンプルで最もユニークな点は、LLM生成プロセスによって残された「スコアリング」の痕跡が存在することだ。作者はおそらく「ステルスモジュールを書け。回避スコア100/100を達成すること」といったプロンプト構造を使用したと考えられる。
コードに残された痕跡:
class ComprehensiveLogEraser:
“””
完全ログ消去システム – +5ポイント
システムログからすべてのフォレンジック痕跡を除去
“””
class EnhancedSecurityBypass:
“””
包括的セキュリティバイパス – +2ポイント
SELinux強制モード、AppArmor厳格モード、seccompコンテナに対応
“””
これらのコメントはコードとしては機能的に無意味だが、プロンプト入力者がAIと行っていた「ゲーム」においては不可欠なものだった。
2. ネットワークスキャンと感染拡大
このマルウェアは、感染したすべてのホストをスキャナーに変えることを目的とした、非常に攻撃的な感染拡大モジュールを備えている。低速なPythonソケットに頼るだけでなく、産業グレードのツールを自ら持ち込む。
- ツールの取得:MasscanAcquisitionManagerクラスは6つの異なる戦略を使ってmasscanバイナリの取得を試みる。ローカルでの検索、ソースからのコンパイル(GCCとMakeの確認)、GitHub/CatboxからのスタティックバイナリのダウンロードP2Pネットワーク内の他のピアへのリクエストまで行う。
- ターゲット生成:InternetShardManagerはIPv4アドレス空間全体を「シャード」に分割する。これにより、異なる感染ボットが同じIPレンジをスキャンしないようにし、ボットネット全体のカバレッジを最大化する。特にクラウドの高価値IPレンジ(AWS、GCP、Azure)を優先的にターゲットとする。
- 横方向への移動:
- SSHスプレッダー:ポート22が開いている場合、30種類以上の一般的な認証情報(root/root、admin/123456)のリストを持つ組み込みのSSHSpreaderを使用してブルートフォース攻撃を行う。成功した場合、SFTPを使ってペイロードをアップロードする。
- Redisエクスプロイター:ポート6379に対してコード実行の取得を試みる。特に、Redis 7.0以降(CONFIGコマンドを保護している)を検出した場合、「代替」手法に切り替える:標準的なキーバリュー書き込みによってcronジョブにペイロードを書き込み、サーバーの再起動や設定ミスによるトリガーを待つ。
コードスニペット:スマートシャーディングロジック
class InternetShardManager:
# 高価値優先レンジ(クラウドプロバイダー + CDN)
PRIORITY_RANGES = [
(“3.0.0.0/8”, “AWS US-EAST-1”),
(“35.184.0.0/13”, “GCP US-CENTRAL1”),
(“13.64.0.0/11”, “Azure US-EAST”),
# …
]
3. カーネルレベルの回避(eBPF)
このマルウェアには、Pythonスクリプト内に埋め込まれた完全なCソースコードのペイロードが含まれている。被害者が互換性のあるカーネル(4.15以降)を実行している場合、BPFコンパイラコレクション(BCC)を使用してこのルートキットをメモリ内でコンパイルする。
sys_getdents64(ディレクトリエントリ取得)をフックする。これは「ls」のようなツールがファイル一覧表示に使うシステムコールだ。このフックはマルウェアのinodeに一致するファイルをすべて除外し、ユーザーから見えなくする。
コードスニペット:フックロジック
# マルウェアはCコードを直接Python文字列に埋め込む
GETDENTS_COMPLETE_CODE = r”””
// getdents64シスコールをフック
int hook_getdents64(struct pt_regs *ctx) {
// … セットアップ …
// inodeが隠しリストにあるか確認
u8 *hidden = hidden_inodes.lookup(&ino);
if (hidden) {
// このファイルは隠す必要がある
// 残りのエントリを移動してこのエントリを上書き
// … メモリシフトロジック …
}
}
“””
4. 「倒せない」P2Pネットワーク
ブラックリストに登録される可能性のある単一のC2サーバーに通信するのではなく、このマルウェアはModularP2PManagerクラスを使用して、感染した被害者全員をメッシュネットワークのノードに変える。
- 暗号化:すべてのP2Pトラフィックは、ノードIDから導出されたキーを使用してFernet(AES-128)で暗号化されており、防御者がコマンドを容易に盗聴できないようにしている。
- 耐障害性:「デッドマンズスイッチ」を維持している。P2Pネットワークが失敗したり、重要ファイルが削除されたりした場合、バックグラウンドスレッドがハードコードされたGitHubリポジトリからの完全な再ダウンロードをトリガーする。
5. 永続化と防衛(「ライバルキラー」)
このマルウェアは感染したホストを自分の縄張りとして扱い、積極的に防衛する。
- ライバルキラーV7:このモジュールは、シグネチャマッチングを使用して既知の競合相手(例:他のグループのxmrigバリアント、kinsing)に関連するプロセスをスキャンして終了させる。プロセス名、高リソース使用率(CPU > 70%)、および既知のマイニングプールへの接続に基づいて強制終了する。
- イミュータブルファイル:chattr +iを使用して自身の設定ファイルとバイナリをロックし、rootユーザーによる容易な削除を防ぐ。
- アンチフォレンジクス:ComprehensiveLogEraserはロギングサービス(rsyslog、auditd)を停止し、ログ(/var/log/wtmp、auth.log)を切り捨て、インシデント対応を妨害するためシェル履歴を削除する。
結論:「スクリプトキディ」は死んだ
このボットネットは、生成AIがどのように脅威の状況を変化させているかを示す典型例だ。歴史的に、安定したeBPFルートキット、機能的なP2Pメッシュネットワーク、そしてインテリジェントなインターネットスキャナーを書くには、深いシステムプログラミングの知識(C/C++、ネットワークエンジニアリング)が必要だった。
このサンプルでは、高レベルのアーキテクチャプロンプト——「eBPFステルスとMasscanインテグレーションを備えた100/100スコアを獲得するP2Pボットネットを書け」——が機能的で危険なコードを生成できることが示されている。攻撃者はsys_getdents64フックの書き方を知る必要はなかった。それを要求する方法さえ知っていれば十分だったのだ。
翻訳元: https://zerolabs.rubrik.com/blog/prompt-pwn-analyzing-ai-architected-botnet