GCP - Artifact Registry Privesc

Supporta HackTricks

Artifact Registry

Per ulteriori informazioni su Artifact Registry controlla:

GCP - Artifact Registry Enum

artifactregistry.repositories.uploadArtifacts

Con questo permesso un attaccante potrebbe caricare nuove versioni degli artefatti con codice malevolo come immagini Docker:

# Configure docker to use gcloud to authenticate with Artifact Registry
gcloud auth configure-docker <location>-docker.pkg.dev

# tag the image to upload it
docker tag <local-img-name>:<local-tag> <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>

# Upload it
docker push <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>

È stato verificato che è possibile caricare una nuova immagine docker malevola con lo stesso nome e tag di quella già presente, quindi il vecchio perderà il tag e la prossima volta che quell'immagine con quel tag verrà scaricata, quella malevola verrà scaricata.

Carica una libreria Python

Inizia creando la libreria da caricare (se puoi scaricare l'ultima versione dal registro puoi evitare questo passaggio):

  1. Imposta la struttura del tuo progetto:

  • Crea una nuova directory per la tua libreria, ad esempio, hello_world_library.

  • All'interno di questa directory, crea un'altra directory con il nome del tuo pacchetto, ad esempio, hello_world.

  • All'interno della directory del tuo pacchetto, crea un file __init__.py. Questo file può essere vuoto o può contenere inizializzazioni per il tuo pacchetto.

mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
  1. Scrivi il codice della tua libreria:

  • All'interno della directory hello_world, crea un nuovo file Python per il tuo modulo, ad esempio, greet.py.

  • Scrivi la tua funzione "Hello, World!":

# hello_world/greet.py
def say_hello():
return "Hello, World!"
  1. Crea un file setup.py:

  • Nella radice della tua directory hello_world_library, crea un file setup.py.

  • Questo file contiene metadati sulla tua libreria e dice a Python come installarla.

# setup.py
from setuptools import setup, find_packages

setup(
name='hello_world',
version='0.1',
packages=find_packages(),
install_requires=[
# Qualsiasi dipendenza di cui ha bisogno la tua libreria
],
)

Ora, carichiamo la libreria:

  1. Costruisci il tuo pacchetto:

  • Dalla radice della tua directory hello_world_library, esegui:

python3 setup.py sdist bdist_wheel
  1. Configura l'autenticazione per twine (usato per caricare il tuo pacchetto):

  • Assicurati di avere twine installato (pip install twine).

  • Usa gcloud per configurare le credenziali:

```sh
twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
```
  1. Pulisci la build

rm -rf dist build hello_world.egg-info

Non è possibile caricare una libreria python con la stessa versione di quella già presente, ma è possibile caricare versioni superiori (o aggiungere un ulteriore .0 alla fine della versione se funziona - non in python però -), o eliminare l'ultima versione e caricarne una nuova con (necessario artifactregistry.versions.delete):

gcloud artifacts versions delete <version> --repository=<repo-name> --location=<location> --package=<lib-name>

artifactregistry.repositories.downloadArtifacts

Con questo permesso puoi scaricare artefatti e cercare informazioni sensibili e vulnerabilità.

Scarica un'immagine Docker:

# Configure docker to use gcloud to authenticate with Artifact Registry
gcloud auth configure-docker <location>-docker.pkg.dev

# Dowload image
docker pull <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>

Scarica una python libreria:

pip install <lib-name> --index-url "https://oauth2accesstoken:$(gcloud auth print-access-token)@<location>-python.pkg.dev/<project-id>/<repo-name>/simple/" --trusted-host <location>-python.pkg.dev --no-cache-dir
  • Cosa succede se un registro remoto e un registro standard sono mescolati in uno virtuale e un pacchetto esiste in entrambi? Controlla questa pagina:

GCP - Artifact Registry Persistence

artifactregistry.tags.delete, artifactregistry.versions.delete, artifactregistry.packages.delete, (artifactregistry.repositories.get, artifactregistry.tags.get, artifactregistry.tags.list)

Elimina artefatti dal registro, come immagini docker:

# Delete a docker image
gcloud artifacts docker images delete <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>

artifactregistry.repositories.delete

Elimina un intero repository (anche se ha contenuto):

gcloud artifacts repositories delete <repo-name> --location=<location>

artifactregistry.repositories.setIamPolicy

Un attaccante con questo permesso potrebbe concedersi i permessi per eseguire alcuni degli attacchi ai repository menzionati in precedenza.

Pivoting to other Services through Artifact Registry Read & Write

  • Cloud Functions

Quando viene creata una Cloud Function, una nuova immagine docker viene inviata all'Artifact Registry del progetto. Ho provato a modificare l'immagine con una nuova e persino a eliminare l'immagine attuale (e l'immagine cache), ma nulla è cambiato, la cloud function continua a funzionare. Pertanto, potrebbe essere possibile abusare di un attacco di Race Condition come con il bucket per cambiare il contenitore docker che verrà eseguito, ma modificare semplicemente l'immagine memorizzata non è possibile compromettere la Cloud Function.

  • App Engine

Anche se App Engine crea immagini docker all'interno dell'Artifact Registry. È stato testato che anche se modifichi l'immagine all'interno di questo servizio e rimuovi l'istanza di App Engine (quindi ne viene distribuita una nuova), il codice eseguito non cambia. Potrebbe essere possibile che eseguendo un attacco di Race Condition come con i bucket, potrebbe essere possibile sovrascrivere il codice eseguito, ma questo non è stato testato.

Support HackTricks

Last updated