脆弱性

最新のAI/MLフォーマットとライブラリによるリモート コード実行

Clock Icon 2 分で読めます

エグゼクティブ サマリー

弊社は、Apple、Salesforce、NVIDIAがGitHubリポジトリで公開している3つのオープンソースの人工知能/機械学習(AI/ML)Pythonライブラリの脆弱性を特定しました。これらのライブラリの脆弱なバージョンでは、悪意のあるメタデータを含むモデル ファイルを読み込むと、リモート コード実行(RCE)が可能になる恐れがあります。

該当するライブラリは、以下のとおりです。

  • NeMo: NVIDIAが研究目的で開発したPyTorchベースのフレームワークで、多様なAI/MLモデルや複雑なシステムの開発に向けて設計
  • Uni2TS: SalesforceのMorai(膨大なデータセットからトレンドを予測する時系列分析の基盤モデル)で使用されている、研究目的で作成されたPyTorchライブラリ
  • FlexTok: Appleおよびスイス連邦工科大学のVisual Intelligence and Learning Lab の研究者が作成した、Pythonベースの研究用フレームワークです。エンコード/デコード機能を扱うことで、AI/MLモデルによる画像処理を可能に

これらのライブラリは、HuggingFace上の人気モデルで使用されており、合計で数千万回ダウンロードされています。

脆弱性の原因は、複雑なモデルやパイプラインの設定にメタデータを用いるライブラリにあり、共通して利用されているサードパーティ ライブラリが、そのメタデータを使用してクラスをインスタンス化しています。脆弱なバージョンでは、与えられたデータがそのままコードとして実行されてしまいます。その結果、攻撃者はモデルのメタデータに任意のコードを埋め込めるようになり、脆弱なライブラリが改ざんされたモデルを読み込んだ時点で、自動的に実行される恐れがあります。

2025年12月時点で、これらの脆弱性が利用された悪意のある事例は、実環境では確認されていません。パロアルトネットワークスは、公開前に緩和対策の実装または問題解決の機会を確保できるよう、2025年4月に影響を受けるすべてのベンダーへ通知しました。

  • NVIDIAは、深刻度「高(High)」のCVE-2025-23304を発行し、NeMoバージョン2.3.2で修正をリリース
  • FlexTokを開発した研究者たちは、2025年6月にコードを更新して問題を解決
  • Salesforceは、深刻度「高(High)」のCVE-2026-22584を発行し、2025年7月31日に修正プログラムを展開

これらの脆弱性は、Prisma AIRSによって発見されました。Prisma AIRSは、これらの脆弱性を利用するモデルを特定し、ペイロードを抽出できます。

さらに、パロアルトネットワークスのお客様は、次の製品・サービスにより、上記の脅威に対する保護を強化できます。

Unit 42の関連トピック Python,、LLMs機械学習

AI/MLモデル フォーマット

AI/MLのトレーニングおよび推論パイプラインは、学習済みのウェイトやアーキテクチャ定義など、複雑な内部状態を保存することに依存しています。これらの内部状態はモデル アーティファクトとして保存され、作成者と消費者の間で共有される必要があります。ライブラリは、これらのアーティファクトをシリアライズする組み込みメカニズムを提供しています。

AI/ML向けのPythonライブラリは長年、Python標準ライブラリのpickleモジュールの機能に依存して、Pythonオブジェクトをファイルへ保存、ファイルから読み込みしてきました。pickleは、オブジェクトを再構築する簡単なプログラムを生成してシリアライズし、読み込み時にそのプログラムが実行されます。そのため、pickleモジュールはファイルの読み込み時にコードを実行してしまい、使用時には重大なセキュリティ リスクが伴います。

PyTorchライブラリのファイル フォーマットは、.pickleファイルをコンテナ形式に埋め込む仕組みです。scikit-learnのような他のライブラリも、.pickleやpickleに使われる別拡張子(.joblibなど)を使用します。多くのAI/ML主要ライブラリは、こうしたリスクを明確に文書化しており、デフォルトで予期せぬコード実行を防ぐために成熟した緩和策を提供しています。

新しいモデル フォーマットにおけるセキュリティ問題

これらpickleベースのフォーマットが抱えるセキュリティの問題に対処するため、より新しいフォーマットが開発されてきました。こうした「安全な」フォーマットは、モデルの重みのみをシリアライズ対象としたり、JSONのようなフォーマットを使ってパイプラインをコードではなくデータとして表現することで、安全性を高めています。例えば、HuggingFaceのセーフセンサーフォーマットでは、モデルの重みと、モデルのメタデータを格納する単一のJSONオブジェクトのみを保存できます。

古いフォーマット側でも、pickleモジュールへの依存からの脱却がすすんでいます。例えばPyTorchは、デフォルトでは、モデルの重みのみを読み込みます。pickleの読み込みが有効な場合、PyTorchは事前に定義された許可リストにある関数のみを実行し、任意コードの実行を防ぐよう設計されています。

ただし、これらの新しいフォーマットやアップデートにより、パイプラインをコードとしてシリアライズする能力は取り除かれても、これらのモデルを扱うアプリケーションやライブラリが従来型の脆弱性に対して無敵になるわけではありません。JFrogのセキュリティ研究者は、XSSやパス トラバーサルなど既知のテクニックを用いて、これらフォーマットを利用するアプリケーションの脆弱性を特定しています。

テクニカル分析

新しいフォーマットでは、モデルの状態や設定をコードとして保存する機能が削除されましたが、研究者の中では、まだその情報をシリアライズするというユース ケースが残っています。これらのライブラリは大規模で、クラス設定が複雑になりやすいため、多くのライブラリはサードパーティ製のツールを用いてこれを実現しています。

Hydraは、Metaが保存するPythonライブラリで、モデルの状態や設定情報をシリアライズするために広く使われているツールです。

弊社では、HuggingFace上のモデルで使用されている3つのオープンソースAI/ML Pythonライブラリが、Hydraを用いてモデルのメタデータからこれらの設定を読み込む際、任意のコード実行を許可する方法になっていることを確認しました。

  • NeMo: NVIDIAが研究目的で開発した、多様なAI/MLモデルや複雑なシステムの開発を目的としたPyTorchベースのフレームワーク
  • Uni2TS: SalesforceのMoraiが研究目的で作成した、膨大なデータセットからトレンドを予測する時系列分析の基盤モデルであるPyTorchライブラリ
  • FlexTok: Appleおよびスイス連邦工科大学のVisual Intelligence and Learning Lab の研究者が作成した、Pythonベースの研究用フレームワーク。エンコード/デコード機能を扱うことで、AI/MLモデルによる画像処理が可能に

Hydra

弊社が特定した脆弱性はいずれもhydra.utils.instantiate()関数を利用していました。この関数は「インターフェースの異なる実装をインスタンス化する」ことを意図しています

Hydra APIは、インスタンス化するためのインターフェースを記述した設定オブジェクト(Pythonの辞書やOmegaConf objectなど)を引数として受け取り、加えて、インターフェースに渡される任意の *args および **kwargsパラメータを受け取ります。この設定には、インスタンス化するクラスまたはcallableを指定する_target_値と、_target_に渡される引数を定義する任意の_args_値が想定されます。

弊社が確認したいずれのケースでも、hydra.utils.instantiate()は、メタデータに格納された単純な引数でライブラリ クラスのインスタンスをインスタンス化するためにのみ使用されています。図1は、NeMoがinstantiate()関数に渡すメタデータの例です。

機械学習モデルの設定パラメータを含むコンピュータ コードのスクリーンショット。
図1.NeMoファイルのメタデータ。

これらのライブラリが見落としていると思われる点は、instantiate()はインスタンス化するクラス名だけを受け取るわけではなく、任意の呼び出し可能な名前も受け取り、それに引数を渡してしまいます。

この仕組みを悪用すれば、攻撃者はeval()os.system()のようなPythonの組み込み関数を使って、より容易にRCEを達成できます。弊社がこれらの脆弱性を検証するために使用したすべての概念実証では、呼び出し可能なものとして、builtins.exec()を用い、Pythonを含む文字列を引数として使用するペイロードを採用しました。

これらの問題が最初に特定されて以来、Hydraは更新され、「instantiate()関数を使用する際にRCEが発生する可能性がある」という警告がドキュメントに追加されたほか、簡単なブロックリスト機能も導入されました。このメカニズムは、_target_の値を、実行前に、builtins.exec()のような危険な関数のリストと比較することによって機能します。

このメカニズムは、インポートされる前にインポート対象との完全一致するかどうかで判定するため、Python標準ライブラリ(例: enum.bltns.eval)や対象アプリ(例:nemo.core.classes.common.os.system)からの暗黙のインポートを利用することで容易に回避できます。ただし、Hydraのドキュメントでは、このメカニズムは万全なものではなく、悪意のあるコードの実行を防ぐ手段としてこれのみに依存すべきではないと明記されています。2026年1月現在、このブロックリストのメカニズムはHydraのリリース版ではまだ利用できません。

NeMo

NVIDIAはNeMoライブラリを「スケーラブルでクラウドネイティブな生成AIフレームワーク」として、2019年から開発を続けていますNeMoは、.nemoおよび.qnemoという独自のファイル フォーマットを使用しています。これらは単なるTARファイルで、モデルのメタデータを格納するmodel_config.yamlファイルと、それぞれ.ptファイルまたは.safetensorsファイルが含まれています。

これらの.nemoモデル ファイルを読み込むための主なエントリ ポイントは、restore_from()from_pretrained()です。抽象化レイヤーはいくつか存在しますが、最終的には埋め込まれたmodel_config.yamlファイルから読み込まれたモデル設定の処理には、シリアライズされたミックスインが使用されます。図2は、hydra.utils.instantiate()の脆弱な呼び出し箇所を示しています。

設定に基づくインスタンス化を処理するためにPythonで記述された条件文を示す、Hydra APIのコードのスクリーンショット。
図2.NeMoのhydra.utils.instantiate()の呼び出し。

instantiate()に渡される前に、メタデータのサニタイズ処理は一切行われていません。この呼び出しは対象のモデルクラスが初期化がはじまる前に行われるため、図3に示すように、動作するペイロードを含むmodel_config.yamlファイルを容易に作成できます。

Pythonで記述された行を含む、テキスト エディタ上のコードのスクリーンショット。このコードには、「Hello world」を出力するprint文が含まれている。
図3. NeMoの脆弱性を誘発するメタデータの例。

NeMoはHuggingFaceとも統合されており、HuggingFace上でホストされているモデルの名前をfrom_pretrained()に渡すことができます。HuggingFace上のNeMoモデルの大半がこの方法で使用されています。HuggingFace上からモデルがダウンロードされると、同一のコード パスを辿ることになるため、この呼び出しも脆弱です。

2026年1月現在、HuggingFaceでは、さまざまな開発者により700以上のモデルが、NeMoフォーマットで提供されています。これらのモデルの多くはNVIDIAのparakeetのように、HuggingFaceで最も人気のあるモデルのひとつに含まれています。この脆弱性は少なくとも2020年から存在していたものと思われます。

NeMoが拡張しているPyTorchフォーマットは、埋め込まれた.pickleファイルによるコード実行をサポートしていますが、その点については明確に文書化されています。このPyTorchフォーマットは、デフォルトで任意の実行を無効にしており、.pickleファイルの読み込み時に使用可能なモジュールをリスト化するなど、いくつかの安全策が提供されています。NeMoでは、.nemoファイルに埋め込まれたPyTorchファイルに含まれる.pickleファイルを読み込むことができますが、PyTorchに組み込まれている許可リスト機能により、任意のコード実行は防げると考えられます。

NVIDIAはこの問題を認め、深刻度「高(High)」と評価したCVE(CVE-2025-23304)を公開し、NeMoバージョン2.3.2で修正をリリースしました。

この問題に対処するため、NeMoはsafe_instantiate関数を追加し、Hydra設定内の_target_値を実行前に検証するようにしました。この関数は、設定内の_target_値を再帰的に検出し、それぞれの値を検証するため、入れ子構造のオブジェクトを利用したRCEの悪用を防ぎます。新しいis_target_allowed関数は、まず各_target_の値を、NeMo、PyTorch、および関連ライブラリのパッケージ名を含むプレフィックスの許可リストと照合します。

このプレフィックス チェックだけでは、Hydraの新しいブロックリスト機能と同様、危険なモジュールの暗黙のインポートを防ぐには不十分です。しかし、NeMoは追加策として、Hydraを使用して各ターゲットを実際にインポートし、次の点をチェックします。

  • それは想定されたクラスのサブクラスであること
  • そのインポートされたモジュール名が、想定されるモジュールの許可リストに含まれていること

実際にインポートされた値をこれらの許可リストと照合することで、NeMoは想定されるターゲットのみが実行されるようにします。例えば、ターゲットとしてnemo.core.classes.common.os.systemは、posixモジュールに解決されますが、これは明らかにNeMoライブラリの一部ではありません。

Uni2TS

2024年、SalesforceのAI研究チームは、『Unified Training of Universal Time Series Transformers』と題した論文を発表しました。それにはHuggingFaceで発表した一連のモデルが紹介されています。この研究およびこれらのモデルの使用は、Salesforceの論文に付随して公開されたuni2TSというオープンソースのPythonライブラリに依存しています。

uni2TSライブラリは、.safetensorsファイルのみを扱います。このファイルは、コード実行を許容するモデル フォーマットに代わる安全な選択肢として明示的に設計されています。また、safetensorsフォーマットは、モデルやパイプラインの設定情報を保存することを明示的にサポートしていません。

これらの設定情報のを保存しやすくするために、HuggingFaceのhuggingface_hubなどのライブラリは、モデルのリポジトリ内に保存されたconfig.jsonファイルを使用しています。HuggingFaceのコアMLライブラリのクラスを使うモデルの場合、JSONプリミティブ型に直接格納できるパラメータのみが用いられるため、この処理は安全に行われます。これらの値は、定義されたハードコード済みのクラス群に渡されます。

しかし、huggingface_hubはフレームワーク全体と統合可能なカスタム モデル クラスを作成するためのPyTorchModelHubMixinインターフェースを提供しています。このインターフェース機能の一部として、値はパッケージ化されたconfig.jsonファイルから読み込まれ、モデルクラスに渡されます。

このインターフェイスには、「coders」と呼ばれる関数を登録するための、あまり使われていない仕組みが備わっています。これらの関数は、特定の引数がクラスに渡される前にその処理を行います。uni2TSライブラリは、このメカニズムを使って図4に示すように、ターゲット クラスに渡される前にhydra.utils.instantiate()を呼び出し、特定の引数の設定をデコードします。

確率分布の出力をデコードする関数と、PyTorchを用いたクラス定義を含むPythonコードのスクリーンショット。
Figure 4. Call to hydra.utils.instantiate() in uni2TS.

このコードは、MoraiModule.from_pretrained()またはMoraiMoEModule.from_pretrained()を使って公開されているモデルのいずれかが読み込まれたときに実行されます。図5に示すように、uni2TSを使ってモデルとともにパッケージ化されたconfig.jsonファイルに我々のペイロードを追加することで、モデルの読み込み時にRCEを実現できます。

「Hello world」を表示するPythonのprint文を含むJSONスクリプトのスクリーンショット。
図5.uni2TSの脆弱性を誘発するconfig.jsonメタデータの例。

これらのライブラリを使用したSalesforceモデルは、Hugging Face上でこれまでに数十万回ダウンロードされています。これらのモデルのいくつかは、他のユーザーによって改変されたものがHuggingFace上で公開されています。これらのモデルが関与した悪意のある活動の証拠は、これまでのところ確認されていません。

Salesforceはこの問題を認め、深刻度「高(High)」と評価したCVE(CVE-2026-22584)を公開し、7月31日に修正プログラムをリリースしました。この修正では、許可リストと厳密な検証チェックが実装され、明示的に許可されたモジュールのみが実行できるようになりました。

ml-flextok

2025年初頭、Appleおよびスイス連邦工科大学のVisual Intelligence and Learning Lab(EPFL VILAB)は、研究を公開しml-flextokという補助的なPythonライブラリを導入しました。uni2TSと同様、ml-flextokはsafetensorsフォーマットのみで動作し、PyTorchModelHubMixinを拡張します。また、モデル リポジトリに含まれるconfig.jsonファイルからメタデータを読み込むこともできます。このライブラリは、.safetensorsファイルから直接設定データを読み込むことにも対応しており、その情報はファイルのメタデータ セクションにある__metadata__キーに格納されます。

safetensorsフォーマットは、メタデータを文字列キーと文字列の値を持つ辞書として表現し、一方でモデルの設定はパラメータのリストに依存するため、二次的なエンコードを使用する必要があります。Ml-flextokは、この二次的エンコードとしてPythonを活用し、Pythonの標準ライブラリに含まれるast.literal_eval()を使用してメタデータをデコードします。

文書化されているとおり、この関数は任意のコードを実行しませんが、メモリ枯渇やCPUの過剰消費、プロセスのクラッシュを引き起こす攻撃に対して脆弱です。メタデータがデコードされた後、ml-flextokはそれを直接hydra.utils.instantiate()に渡します。

モデルがHuggingFaceから読み込まれる場合、このメタデータはconfig.jsonから読み込まれ、複雑な構造をサポートしているため、二重エンコードは行われません。このJSONデータは辞書として読み込まれ、特定のセクションは直接instantiate()に渡されます。

どちらの場合も、ペイロードはinstantiate()引数と一致する名前で作成されます。ペイロードが.safetensorsファイルに直接追加されるか、パッケージ化されたconfig.jsonファイルに追加されるかによって、エンコードの方法や配置は若干異なりますが、ペイロード自体は単純です。図6は、.safetensorsファイルのメタデータに配置されたペイロードを示しています。

「payload」「target」「builtins」というテキストを含む、暗い背景に表示されたコードの行。
図6. uni2TSの脆弱性を誘発する.safetensorsメタデータの例。

2026年1月現在、HuggingFace上では、EPFL VILABが公開したモデル以外に、ml-flextokライブラリを使用したモデルは確認されておらず、これらのモデルは合計で数万回ダウンロードされています。

AppleとEPFL VILABは、YAMLを使用して設定を解析し、Hydraのinstantiate()に渡すクラス許可リストを追加することで、これらの問題を解決しました。また、ドキュメントを更新し、モデル ファイルに格納された文字列はコードとして実行され、信頼できるソースからのモデルだけが読み込まれるべきであることを明記しました。

結論

パロアルトネットワークスでは、これらの脆弱性を悪用した実環境で使われた攻撃のためのモデル ファイルを確認していません。しかし、攻撃者がこれらを悪用する機会は十分にあります。

開発者が、さまざまなファインチューニングや量子化を施した最先端のモデルのバリエーションを独自に作成するのが一般的であり、その多くは、高名な研究機関とは無関係の研究者によるものです。攻撃者は、既存の一般的なモデルに対して、実際の、あるいは主張上のメリットを付加した改変を行い、悪意のあるメタデータを追加するだけで済みます。

この件が明らかになるまでは、これらのライブラリが安全でない可能性や、信頼できるソースからのファイルのみを読み込むべきという兆候は見られませんでした。HuggingFaceは現在、他のケース(例えば.pickleファイルで参照されるAPI)のように、これらのファイルのメタデータの内容をユーザーが簡単にアクセスできるようにはしていません。また、safetensorsやNeMoフォーマットを使用したファイルが安全でない可能性があるとして、フラグを付けることも行っていません。

この分野における最新の進歩は、モデルの重みだけでなくコードを必要とすることが多いため、それをサポートするライブラリが急増しています。2025年10月時点で、弊社ではHuggingFace上のモデルで使用されている100以上のさまざまなPythonライブラリを確認しており、そのうち約 50 は何らかの形でHydraを利用していました。これらのフォーマットはそれ自体は安全である可能性がある一方で、それらを利用するコードには非常に広大なアタック サーフェスが存在します。

パロアルトネットワークスの保護と緩和策

パロアルトネットワークスのお客様は、以下の製品を通じて、上記の脅威に対する確実な保護を構築いただけます。

  • Prisma AIRSは、これらの脆弱性を利用したモデルを特定し、そのペイロードを抽出することができます。
  • Cortex CloudのVulnerability Managementは、クラウド仮想マシンおよびコンテナ環境のベース イメージを特定・管理します。これにより、脆弱性や設定ミスの特定およびアラート通知が可能となり、特定されたベースレベルのコンテナイメージに対する修復タスクが提供されます。Cortex Cloud Agentは、本記事で説明したランタイム操作も検出可能です。
  • Unit 42 AI Security Assessmentは、組織におけるAI導入リスクの低減、AIイノベーションの保護、AIガバナンスの強化を支援します。

情報漏えいの可能性がある場合、または緊急の案件がある場合は、Unit 42インシデント レスポンス チームまでご連絡ください。

  • 北米: フリーダイヤル: +1 (866) 486-4842 (866.4.UNIT42)
  • 英国: +44.20.3743.3660
  • ヨーロッパおよび中東: +31.20.299.3130
  • アジア: +65.6983.8730
  • 日本: +81.50.1790.0200
  • オーストラリア: +61.2.4062.7950
  • インド: 000 800 050 45107
  • 韓国: +82.080.467.8774

パロアルトネットワークスは、本調査結果をサイバー脅威アライアンス(CTA)のメンバーと共有しています。CTAの会員は、この情報を利用して、その顧客に対して迅速に保護を提供し、悪意のあるサイバー アクターを組織的に妨害しています。サイバー脅威アライアンスについて詳細をご確認ください。

その他の資料

Enlarged Image