動かして理解する。AI駆動型マルウェアとは ― デモ用PoCによる挙動検証 ―

この記事は、NTT docomo Business Advent Calendar 2025 18日目の記事です。

みなさんこんにちは、イノベーションセンターの田口です。 普段はOffensive Securityプロジェクトのメンバーとして攻撃技術の調査・検証に取り組んでいます。

私たちのチームでは定期的に技術LTと称して、各メンバーが自由に技術的知見を共有する時間を設けています。 この記事では、私が技術LTの場で発表したAI駆動型マルウェア1の動作デモと、発表後のチーム内議論の様子について紹介します。

この記事では、AI駆動型マルウェアの概念を理解するために、実害のないデモ用PoCを作成してその挙動を確認しています。 また、PoC悪用の可能性を考慮して検証の中で作成したコードやプロンプトの全体公開は控えさせていただきます。

Offensive Securityプロジェクトについて

Offensive Securityプロジェクトでは、攻撃者視点のセキュリティ(Offensive Security)を専門とするチームとして、攻撃技術の調査・開発・検証に取り組んでいます。 攻撃者に先んじて新たな攻撃技術を検証することで、将来の脅威を見越した防御の強化につなげています。

主な業務内容として、NTTドコモビジネスの WideAngleプロフェッショナルサービス における攻撃技術の検証支援や、最先端の攻撃技術に関する応用的な研究開発を行っており、 成果のカンファレンス発表など対外的な活動にも積極的に取り組んでいます。

AI駆動型マルウェアとは

AI駆動型マルウェアとは、大規模言語モデル(LLM)やAIエージェントの能力を攻撃プロセスの一部に利用するマルウェアの総称です。 2025年7月に「LAMEHUG2」、8月に「PromptLock3」と呼ばれるマルウェアが観測されました。

攻撃者によるAI利用の事例は以前からありますが、これらのマルウェアは新しいアプローチでAI利用がされており話題になりました。 特徴はマルウェア内に外部のAIと通信して悪性コードを生成させる手法、いわゆるバイブコーディング4の手法がマルウェアの機能に組み込まれていることです。

従来のマルウェアは攻撃者が事前に用意した静的な悪性プログラムを実行しますが、AI駆動型マルウェアはプロンプトに従いAIが環境に応じて必要なプログラムを動的に生成・実行します。

AI駆動型マルウェアの動作デモ

AI駆動型マルウェアの実装・挙動の理解促進を目的としてデモ用のPoCを作成しました。 このデモでは、PoCの実行によりターゲットフォルダ(sandbox)をzipファイルへ圧縮する動作を示します。

下記はPoC動作中のコンソールを表示したバージョンです。

動作デモの解説

上記のデモは、以下のような順で動作しています。 動画内ではVBScript、batファイルを実行していますがプログラム本体はsrcフォルダ内のPythonコードです。

  1. (ユーザ操作)PoCを実行する。
  2. インターネット上のLLMとの通信を開始する。
  3. LLMからのレスポンスを基に新たにプログラム generated_recon.py を作成する。
  4. generated_recon.py を実行する。
  5. sandboxフォルダをzipに圧縮して、distフォルダへ出力する。

上記動作における2 ~ 4の流れがAI駆動型マルウェアの特徴的な動作になります。

今回の動作デモではsandboxフォルダを対象としたzipへの圧縮までを実装していますが、 実際の攻撃では圧縮対象範囲の拡大や圧縮ファイルの外部送信といった機能が追加で作成されると考えられます。

LAMEHUGの事例では、コンピュータ内における広範な情報収集とSFTPおよびHTTPを利用したデータの外部送信をしたと報告されています。

検証を通して作成されたgenerated_recon.pyの一例を下記に示します。 これらのコードはPoC内のプロンプトに応じてLLMが動的生成したコードです。 同じ機能を持ちますが、見かけ上は異なるコードとして生成される場合があります。

import os
from pathlib import Path
from zipfile import ZipFile, ZIP_DEFLATED
from datetime import datetime

def main():
    # 1. Set base_dir to "sandbox" under this script's directory
    base_dir = Path(__file__).parent / "sandbox"
    if not base_dir.is_dir():
        print(f"'sandbox' directory not found at {base_dir}")
        return

    # 2. Recursively find all files in sandbox
    file_list = []
    for root, dirs, files in os.walk(base_dir):
        for file in files:
            abs_path = Path(root) / file
            rel_path = abs_path.relative_to(base_dir)
            file_list.append((abs_path, rel_path))

    # 3. Prepare output ZIP path
    dist_dir = Path(__file__).parent / "dist"
    dist_dir.mkdir(exist_ok=True)
    timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
    zip_name = f"sandbox_snapshot_{timestamp}.zip"
    zip_path = dist_dir / zip_name

    # 4. Write files into ZIP file with paths relative to sandbox
    with ZipFile(zip_path, "w", ZIP_DEFLATED) as zipf:
        for abs_path, rel_path in file_list:
            zipf.write(abs_path, arcname=str(rel_path))

    # 5. Optional: Append to log
    log_path = Path(__file__).parent / "recon_log.txt"
    with open(log_path, "a", encoding="utf-8") as logf:
        logf.write(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] Zipped {len(file_list)} files from sandbox to {zip_name}\n")

if __name__ == "__main__":
    main()

今回のPoCでは実験中の想定外の動作を防ぐために、下記のような安全面を考慮した関数を実装しています。

def basic_safety_check(code: str) -> None:
    """
    デモ用の簡易チェック(Windows でも共通で危険そうなものをざっくり禁止)
    """
    forbidden_keywords = [
        # 削除系
        "os.remove",
        "shutil.rmtree",
        "os.rmdir",
        "unlink(",
        # ネットワーク系
        "socket.",
        "requests.",
        "httpx.",
        "urllib.",
        "ftplib.",
        # 環境・プロセス系
        "os.environ",
        "subprocess.Popen",
        "subprocess.call",
        "subprocess.run(",
        # Windows レジストリ
        "winreg",
        # 何でも実行系
        "eval(",
        "exec(",
    ]

    for kw in forbidden_keywords:
        if kw in code:
            raise RuntimeError(f"安全のため禁止キーワードが検出されました: {kw}")

チーム内での議論

技術LTの質疑応答時間で出た発言について、いくつか抜粋して紹介します。

どれくらい複雑な機能を動的生成できるのか?

  • 私: どれくらい複雑な攻撃コードを動的生成できるかはLLMの性能に依存している。 AI駆動型マルウェアの事例に限らず、今後どれくらい攻撃コード生成の能力をAIが備えるかは注視していきたい。
  • メンバーA: デモプログラムや観測された検体では、ファイル列挙や外部通信などの簡易な機能のみを実装させているが、 アンチウイルスやEDRの検知回避などの、より攻撃者が実現したい高度な機能を動的に生成させることが現段階でできるのか、 あるいは将来的にできるようになるのかといった観点で追加調査するのも良さそう。

攻撃者視点のメリットはなに?

  • 私: ランダム性のある攻撃コードを動的に生成するという挙動はシグネチャ型検知を回避しやすいというメリットがありそう。 高度なコーディング能力を持たない攻撃者でも扱えるというメリットもあるかも。
  • メンバーB: 事例やデモプログラムで生成させてる機能は簡易なもの(悪性とは言い切れない)なので、 本格的な悪性コードを動的生成させるような実装になったとき、検知回避の観点でどれくらい通用するのか気になる。
  • メンバーC: シグネチャ型検知を回避する方法は他にもあると思うので、わざわざAIに動的生成させるというのは回りくどいやり方な気がする。 そういう意味ではコーディング能力を持たずとも自然言語でコード生成できる点のほうが現状はメリットとして強そう。
  • 私: 従来のペイロードを攻撃者基盤からダウンロードしてくる手法とAIで動的に生成する手法とで、 実際にステルス性の違いがあるのかという観点で調査するのも価値がありそう。

攻撃ベクトル発展の可能性について

  • メンバーB: AI駆動型マルウェアが流行ってくると意図せず公開されたAIサービスの悪用や、 流出したAIサービスのAPIキーを悪用することで攻撃者の痕跡を隠すケースが出てくる気がする。
  • 私: 同じようなことが気になっていて、今後エンタープライズ向けのCopilot系サービスが普及した世界になったとき、 企業環境内のモデルを悪用したAI駆動型マルウェアとかが登場してくる可能性があるのではと思った。 (参考: 業務で進むLLM活用、その裏に潜む脅威とは?Microsoft 365 Copilotを介した攻撃検証(インターン体験記)

おわりに

この記事では、AI駆動型マルウェアの概要説明およびデモ用PoCを発表した技術LTの内容について紹介しました。

今後もAIが普及・進化した世界で起こり得る脅威について調査を続けていき、得られた技術的知見については共有していきたいと思います。

明日は鈴ヶ嶺の記事です!お楽しみに!

参考