Azure SDKのパストラバーサル脆弱性対応:Artifact ToolのZipSlip修正で確認すべき点

Azure SDKのパストラバーサル脆弱性対応でまず確認すべきことは、Azure SDK for Pythonのうち、Azure Machine Learning向けパッケージ azure-ai-ml を使っているか、そしてArtifact ToolのZIP展開処理を含むバージョンやコミットを利用しているかです。

2026年5月5日に公開されたGitHub PRでは、Artifact ToolのZIPアーカイブを展開する前に、ZIP内の各ファイルパスが展開先ディレクトリの外へ出ないかを検証する変更が追加されています。これはZipSlipとも呼ばれるパストラバーサル対策で、悪意あるZIPに含まれる ../ や絶対パスによって、意図しない場所へファイルを書き込まれるリスクを下げるための修正です。(GitHub)

ただし、本件は「Azure SDK全体が同じ影響を受ける」と読むべきではありません。PR上の変更箇所は sdk/ml/azure-ai-ml/azure/ai/ml/_utils/_artifact_utils.py であり、主に azure-ai-ml を使う開発者、MLOps担当者、CI/CD環境の管理者が優先して確認すべき内容です。(GitHub)

目次

Azure SDKのArtifact Tool ZIP展開修正で何が変わったのか

今回の変更は、Artifact ToolのZIPファイルを展開する内部処理に、展開先ディレクトリから外へ出ないことを確認する検証を追加するものです。

PRの内容では、_artifact_utils.py の _redirect_artifacts_tool_path() において、ZIPファイルを extractall() で展開する前に、ZIP内の各メンバーの解決済みパスをチェックするようになっています。展開先の一時ディレクトリを resolve() で正規化し、各ZIPメンバーのパスも同様に解決したうえで、展開先配下に収まらない場合は RuntimeError を発生させる流れです。(GitHub)

確認項目変更前の考え方変更後の考え方
ZIP展開前のパス検証明示的なメンバー単位の検証なし各ZIPメンバーの解決済みパスを確認
危険なパス../ や絶対パスが含まれるZIPで展開先外へ出る可能性展開先外へ出るパスを拒否
展開先ディレクトリ一時ディレクトリを作成して展開一時ディレクトリを Path として扱い、解決済みパスを利用
異常時の挙動不正なZIPでも展開処理に進む可能性パストラバーサルを検出すると例外で停止
環境変数Artifact Toolの上書きパスを設定解決済みの安全な展開先パスを設定

PRでは、通常のネストされたディレクトリを含むZIPは展開できる一方、../../、subdir/../../escaped.txt、絶対パスを含むエントリは拒否されることが確認されています。(GitHub)

なぜZipSlip対策が重要なのか

ZipSlipは、ZIPやtarなどのアーカイブ内に ../ のような相対パスを含め、展開処理時に意図したディレクトリの外へファイルを書き込ませる攻撃手法です。MITREのCWE-23では、Zip Slipを「ファイルアーカイブ内のパストラバーサルを利用して、期待された展開先ディレクトリの外にファイルを書き込ませる攻撃」と説明しています。([CWE][3])

パストラバーサルはCWE-22にも分類されます。CWE-22は、制限された親ディレクトリ配下にあるはずのパスが、適切に無害化されないことで外部の場所へ解決されてしまう弱点です。結果として、ファイルの作成、上書き、読み取り、場合によっては不正なコード実行につながる可能性があります。([CWE][4])

今回のケースで重要なのは、単に「ZIPファイルを扱っているから危険」という話ではありません。問題の本質は、信頼境界の外から取得したアーカイブを展開するときに、アーカイブ内のファイル名をそのまま信用してはいけないという点です。

たとえば、次のようなZIPエントリが含まれていた場合、展開先が /tmp/artifact-tool のつもりでも、処理の実装によっては別の場所へ書き込まれる可能性があります。

../../malicious.txt
subdir/../../escaped.txt
/absolute/path/file.txt

安全な実装では、これらを「展開先ディレクトリから外へ出るパス」として拒否します。今回のAzure SDK for Pythonの修正も、この考え方に沿ったものです。

影響を受ける可能性が高いユーザー

今回のPRから読み取れる影響範囲は、Azure SDK for Python全体ではなく、azure-ai-ml 配下のArtifact Tool関連処理です。Microsoft Learnでは、azure-ai-ml はAzure Machine Learning Python SDK v2のクライアントライブラリであり、ジョブ、パイプライン、コンポーネント、モデル、データストアなどの管理に使われると説明されています。(Microsoft Learn)

対象者・環境対応優先度理由
azure-ai-ml を使ってAzure Machine Learningのジョブやパイプラインを実行している高変更対象のパッケージ配下に該当するため
CI/CDでAzure ML SDKを使い、モデル登録・ジョブ投入・アセット操作を自動化している高自動実行環境では異常なZIP展開の影響が見えにくい
GitHubのAzure SDK for Pythonリポジトリから直接ビルドしている高PRのマージ状況や取り込みコミットの確認が必要
社内で azure-ai-ml をvendoring、fork、カスタムビルドしている高公式リリースを待たず、手元のコード差分確認が必要
Azure Storage、Azure Key Vaultなど、ML以外のAzure SDKだけを使っている低〜中PR上の変更箇所からは直接影響が読み取りにくいが、依存関係確認は有用
Azure PortalだけでAzure Machine Learningを操作している低SDK内部のArtifact Tool展開処理を直接使っていない可能性が高い

注意したいのは、azure-ai-ml をアプリケーション本体で使っていなくても、運用スクリプト、GitHub Actions、Azure Pipelines、社内のMLOpsツールで利用しているケースです。特にMLOpsでは、開発者のローカル環境ではなくCI/CD上でSDKが使われることが多いため、requirements.txt、pyproject.toml、poetry.lock、pip freeze の結果を確認してください。

現時点で断定してはいけないこと

本件を調査するときは、セキュリティ対応として重要な情報と、まだ確認できない情報を分けて扱う必要があります。

PRページでは、2026年5月5日時点で「Fix path traversal vulnerability in artifact tool zip extraction」というPRが作成され、1コミットで +14 -4 の変更が加えられていることが確認できます。一方で、PR画面上では Open と表示されており、少なくともPRページの情報だけでは、正式リリース済みのパッケージバージョンやCVE番号までは確認できません。(GitHub)

判断してよいことまだ断定しないこと
azure-ai-ml 配下のArtifact Tool ZIP展開処理にパストラバーサル対策が追加されたすべてのAzure SDK利用者が同じ影響を受ける
../、ネストされたトラバーサル、絶対パスを含むZIPエントリが拒否対象になった特定のPyPIバージョンに必ず修正が入っている
異常なZIPでは例外により展開が止まる可能性がある既に悪用が確認されている
CI/CDやMLOps環境で依存関係の確認が必要Azure Portal側の設定変更で解決できる

セキュリティ記事や社内通知を書く場合も、「修正済みバージョンは○○です」と断定する前に、公式のリリースノート、PyPI、GitHubのマージ状況を確認するべきです。

利用中の環境で確認すべきポイント

まずは、対象パッケージを使っているかを確認します。Python環境で次のコマンドを実行してください。

python -m pip show azure-ai-ml

azure-ai-ml が表示されない場合、少なくともそのPython環境では該当パッケージを直接インストールしていません。ただし、CI/CDや別の仮想環境、Dockerイメージ内で使われている可能性があるため、実際にジョブを実行している環境でも確認してください。

インストール済みの場合は、該当モジュールの場所を確認します。

python - <<'PY'
import inspect
from azure.ai.ml._utils import _artifact_utils

print(inspect.getfile(_artifact_utils))
PY

次に、手元のコードにZIPメンバー単位の検証が入っているかを簡易確認します。

python - <<'PY'
import inspect
from azure.ai.ml._utils import _artifact_utils

src = inspect.getsource(_artifact_utils)
checks = [
    "namelist()" in src,
    "resolve()" in src,
    "path traversal" in src.lower(),
    "extractall" in src,
]

print({
    "has_zip_member_iteration": checks[0],
    "has_resolved_path_check": checks[1],
    "mentions_path_traversal": checks[2],
    "uses_extractall": checks[3],
})
PY

この確認はあくまで簡易チェックです。True が出ても完全な安全性を保証するものではありません。最終的には、利用中のパッケージバージョン、公式リリースノート、該当PRのマージ状況、実際のソースコード差分を照合してください。

CI/CD環境での確認手順

MLOpsやAzure Machine Learningの運用環境では、開発者PCよりもCI/CDの確認が重要です。特に、モデルの登録、データアセットの作成、ジョブ送信、パイプライン実行を自動化している環境では、SDKがバックグラウンドでArtifact Toolを扱う可能性があります。

手順確認内容具体例
依存関係の棚卸しazure-ai-ml の有無とバージョンpip freeze, pip show azure-ai-ml
ロックファイル確認古いバージョンに固定されていないかrequirements.txt, poetry.lock, uv.lock
Dockerイメージ確認ビルド済みイメージ内のSDK状態docker run --rm image python -m pip show azure-ai-ml
環境変数確認Artifact Toolの上書きパスが設定されていないかAZURE_DEVOPS_EXT_ARTIFACTTOOL_OVERRIDE_PATH
ログ確認Artifact Toolダウンロードや展開時の異常CIログ、Azure Pipelinesログ、GitHub Actionsログ
ソース確認_artifact_utils.py に安全な展開処理が入っているかinspect.getfile() でパスを特定

環境変数の確認は次のように行えます。

printenv | grep AZURE_DEVOPS_EXT_ARTIFACTTOOL_OVERRIDE_PATH

この環境変数が明示的に設定されている場合、SDKの標準処理ではなく、特定のArtifact Toolパスを使う構成になっている可能性があります。社内で独自に配置したツールを参照している場合は、その配布元、更新手順、アクセス権、改ざん検知の有無も確認してください。

移行・更新時に注意すべきこと

正式に修正を含むバージョンが利用可能になった場合、基本方針は azure-ai-ml を更新することです。ただし、セキュリティ対応では「上げれば終わり」ではなく、実行環境ごとに反映状況を確認する必要があります。

python -m pip install --upgrade azure-ai-ml

更新後は、次の確認を行います。

python -m pip show azure-ai-ml
python -m pip check

pip check では依存関係の不整合を確認できます。Azure SDK系パッケージは複数のAzureライブラリや認証ライブラリと一緒に使われることが多いため、更新によって依存関係の競合が起きていないかを確認してください。

ロックファイルを使っている場合

Poetry、uv、pip-toolsなどで依存関係を固定している場合、単に pip install --upgrade を実行しても、本番やCI/CDには反映されません。ロックファイルを更新し、レビュー対象に含めてください。

# pip-toolsの例
pip-compile --upgrade-package azure-ai-ml

# Poetryの例
poetry update azure-ai-ml

# uvの例
uv lock --upgrade-package azure-ai-ml

更新後は、CI/CDで実際に使われる環境と同じ条件でテストします。ローカルだけで確認しても、Dockerイメージやビルドキャッシュに古いパッケージが残ることがあります。

例外発生を「不具合」として握りつぶさない

今回の変更では、危険なZIPエントリを検出した場合に展開を止める挙動になります。つまり、これまで通っていた処理が、更新後に例外で止まる可能性があります。

このとき、例外を単に握りつぶして再実行するのは避けてください。パストラバーサル検出は、セキュリティ上の異常を示すシグナルです。CI/CDログに次の観点で記録を残すと、原因調査がしやすくなります。

  • 使用している azure-ai-ml のバージョン
  • Artifact Toolを取得したURLや取得元の種類
  • 例外発生時のジョブ名、パイプライン名、実行者
  • 対象のワークスペース、リソースグループ
  • 直前に変更した依存関係、ネットワーク設定、プロキシ設定

自社コードにも同じ観点を入れる

今回のAzure SDKの変更は、SDK利用者だけでなく、社内ツールを作っている開発者にも参考になります。ZIPやtarを展開する処理では、展開先ディレクトリを決めるだけでは不十分です。展開される各ファイルの最終的なパスが、必ず展開先配下に収まるかを確認する必要があります。

PythonでZIPを安全に展開する場合の基本形は次のようになります。

from pathlib import Path
import zipfile

def safe_extract_zip(zip_path: str, dest_dir: str) -> None:
    dest = Path(dest_dir).resolve()

    with zipfile.ZipFile(zip_path) as zf:
        for info in zf.infolist():
            target = (dest / info.filename).resolve()

            try:
                target.relative_to(dest)
            except ValueError as exc:
                raise ValueError(f"Unsafe zip entry: {info.filename}") from exc

        zf.extractall(dest)

このコードでは、各エントリの展開先パスを resolve() で正規化し、relative_to() で展開先ディレクトリ配下にあるかを確認しています。実務では、さらに次の対策も検討してください。

対策理由
アーカイブ内の総サイズを制限するZIP爆弾によるディスク枯渇を防ぐ
ファイル数を制限する大量ファイルによる処理遅延を防ぐ
シンボリックリンクを拒否または厳格に検証するリンク経由の展開先外アクセスを防ぐ
実行権限付きファイルを制限する展開後の不正実行リスクを下げる
展開先を専用の一時ディレクトリに限定する既存ファイルの上書きを防ぐ
展開後に必要なファイルだけを移動する不要なファイルの混入を防ぐ

特にCI/CDでは、展開処理がビルド、テスト、デプロイの前段に置かれることがあります。ここで任意ファイルの書き込みが可能になると、設定ファイル、スクリプト、依存パッケージ、認証関連ファイルが改ざんされるリスクがあります。

よくある誤解と判断基準

「Azure SDKを使っているなら全員すぐ対応が必要」は正確ではない

今回のPRで確認できる変更箇所は azure-ai-ml 配下です。Azure Storage、Azure Key Vault、Azure Cosmos DBなど、別のAzure SDKを使っているだけの環境まで同じ影響があるとは断定できません。

ただし、社内プロジェクトでは「アプリケーション本体はStorage SDKだけだが、CI/CDではAzure ML SDKを使っている」という構成もあります。アプリの依存関係だけでなく、運用スクリプトやビルドイメージも確認してください。

「ZIPを扱っていないから関係ない」とは限らない

自分でZIPをアップロードしていなくても、SDK内部でツールの取得や展開が行われる場合があります。今回のPRも、Artifact ToolのZIPアーカイブ展開処理が対象です。extractall() をアプリケーションコードで直接呼んでいないからといって、必ず無関係とは言えません。

「最新版にすれば必ず解決」はリリース確認が必要

PRが作成された段階と、PyPIやCondaに修正済みパッケージが公開される段階は別です。実際に修正済みかどうかは、公式リリースノート、パッケージバージョン、インストール済みコードを照合して判断してください。

「例外が出たから古い挙動に戻す」は危険

更新後にArtifact Toolの展開で例外が出る場合、それは不正または想定外のZIPエントリが検出された可能性があります。業務影響を避けるために古いバージョンへ戻す場合でも、原因が安全に説明できるまで一時対応として扱い、恒久対応にはしないでください。

セキュリティ担当者が確認すべきチェックリスト

本件を社内で扱う場合は、次の順に確認すると抜け漏れを減らせます。

チェック確認内容完了基準
対象環境の特定azure-ai-ml を使うローカル、CI/CD、Docker、運用スクリプトを洗い出す対象環境一覧がある
バージョン確認各環境で pip show azure-ai-ml を実行する実行環境ごとのバージョンが分かる
コード確認_artifact_utils.py にパス検証があるか確認するZIPメンバー単位の検証有無が分かる
リリース確認公式リリースノートやPRのマージ状況を確認する修正済みバージョンを根拠付きで判断できる
更新計画ロックファイル、Dockerイメージ、CI/CDキャッシュを更新する本番相当環境で反映済み
監視例外、Artifact Tool取得失敗、不審なファイル作成を確認するログ確認手順がある
社内展開MLOps担当、開発者、基盤チームへ共有する対象者が次の作業を理解している

まず取るべき行動

今回のAzure SDKのパストラバーサル脆弱性対応では、過度に不安を広げるよりも、対象を絞って確認することが重要です。

最初に、azure-ai-ml を使っている環境を洗い出してください。次に、利用中のパッケージバージョンと _artifact_utils.py の実装を確認します。そのうえで、該当PRが正式にマージされ、修正済みリリースが公開されているかを確認し、CI/CDやDockerイメージまで含めて更新します。

特にMLOps環境では、SDKがアプリケーション本体ではなくビルドや運用の裏側で使われていることがあります。requirements.txt だけでなく、パイプライン定義、コンテナイメージ、社内スクリプトまで含めて確認するのが、今回のようなSDK内部修正に対する実務的な対応です。

[3]: https://cwe.mitre.org/data/definitions/23.html “CWE –

CWE-23: Relative Path Traversal (4.20)
"

[4]: https://cwe.mitre.org/data/definitions/22.html “CWE –

CWE-22: Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') (4.20)
"

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次