# GCP - Artifact Registry Privesc

{{#include ../../../banners/hacktricks-training.md}}

## Artifact Registry

Za više informacija o Artifact Registry, pogledajte:

{{#ref}}
../gcp-services/gcp-artifact-registry-enum.md
{{#endref}}

### artifactregistry.repositories.uploadArtifacts

Sa ovom dozvolom, napadač bi mogao da otpremi nove verzije artefakata sa zloćudnim kodom poput Docker slika:
```bash
# 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>
```
> [!CAUTION]
> Provereno je da je **moguće otpremiti novu zlu docker** sliku sa istim imenom i oznakom kao ona koja već postoji, tako da će **stara izgubiti oznaku** i sledeći put kada se ta slika sa tom oznakom **preuzme, zla će biti preuzeta**.

<details>

<summary>Otpremi Python biblioteku</summary>

**Počnite tako što ćete kreirati biblioteku za otpremu** (ako možete preuzeti najnoviju verziju iz registra, možete izbeći ovaj korak):

1.  **Postavite strukturu vašeg projekta**:

- Kreirajte novi direktorijum za vašu biblioteku, npr., `hello_world_library`.
- Unutar ovog direktorijuma, kreirajte još jedan direktorijum sa imenom vašeg paketa, npr., `hello_world`.
- Unutar direktorijuma vašeg paketa, kreirajte `__init__.py` datoteku. Ova datoteka može biti prazna ili može sadržati inicijalizacije za vaš paket.

```bash
mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
```

2.  **Napišite kod vaše biblioteke**:

- Unutar direktorijuma `hello_world`, kreirajte novu Python datoteku za vaš modul, npr., `greet.py`.
- Napišite vašu funkciju "Hello, World!":

```python
# hello_world/greet.py
def say_hello():
return "Hello, World!"
```

3.  **Kreirajte `setup.py` datoteku**:

- U korenu vašeg direktorijuma `hello_world_library`, kreirajte `setup.py` datoteku.
- Ova datoteka sadrži metapodatke o vašoj biblioteci i govori Pythonu kako da je instalira.

```python
# setup.py
from setuptools import setup, find_packages

setup(
name='hello_world',
version='0.1',
packages=find_packages(),
install_requires=[
# Bilo koje zavisnosti koje vaša biblioteka treba
],
)
```

**Sada, hajde da otpremimo biblioteku:**

1.  **Izgradite vaš paket**:

- Iz korena vašeg direktorijuma `hello_world_library`, pokrenite:

```sh
python3 setup.py sdist bdist_wheel
```

2.  **Konfigurišite autentifikaciju za twine** (koristi se za otpremu vašeg paketa):
- Uverite se da imate `twine` instaliran (`pip install twine`).
- Koristite `gcloud` za konfiguraciju kredencijala:
````
```sh
twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
```
````
3. **Očistite gradnju**
```bash
rm -rf dist build hello_world.egg-info
```
</details>

> [!CAUTION]
> Nije moguće otpremiti python biblioteku sa istom verzijom kao što je već prisutna, ali je moguće otpremiti **veće verzije** (ili dodati dodatni **`.0` na kraju** verzije ako to funkcioniše - ne u pythonu), ili **obrisati poslednju verziju i otpremiti novu sa** (potrebno `artifactregistry.versions.delete)`**:**
>
> ```sh
> gcloud artifacts versions delete <version> --repository=<repo-name> --location=<location> --package=<lib-name>
> ```

### `artifactregistry.repositories.downloadArtifacts`

Sa ovom dozvolom možete **preuzeti artefakte** i tražiti **osetljive informacije** i **ranjivosti**.

Preuzmite **Docker** sliku:
```sh
# 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>
```
Preuzmite **python** biblioteku:
```bash
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
```
- Šta se dešava ako se udaljeni i standardni registri mešaju u virtuelnom i paket postoji u oba? Proverite ovu stranicu:

{{#ref}}
../gcp-persistence/gcp-artifact-registry-persistence.md
{{#endref}}

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

Obrišite artefakte iz registra, kao što su docker slike:
```bash
# Delete a docker image
gcloud artifacts docker images delete <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
```
### `artifactregistry.repositories.delete`

Obriši celu repozitoriju (čak i ako ima sadržaj):
```
gcloud artifacts repositories delete <repo-name> --location=<location>
```
### `artifactregistry.repositories.setIamPolicy`

Napadač sa ovom dozvolom mogao bi sebi dati dozvole da izvrši neke od prethodno pomenutih napada na repozitorijume.

### Prebacivanje na druge usluge putem Artifact Registry čitanja i pisanja

- **Cloud Functions**

Kada se kreira Cloud Function, nova docker slika se šalje u Artifact Registry projekta. Pokušao sam da modifikujem sliku novom, pa čak i da obrišem trenutnu sliku (i `cache` sliku) i ništa se nije promenilo, cloud funkcija nastavlja da radi. Stoga, možda bi **moglo biti moguće iskoristiti napad Race Condition** kao sa bucket-om da se promeni docker kontejner koji će se pokrenuti, ali **samo modifikovanjem sačuvane slike nije moguće kompromitovati Cloud Function**.

- **App Engine**

Iako App Engine kreira docker slike unutar Artifact Registry. Testirano je da **čak i ako modifikujete sliku unutar ove usluge** i uklonite App Engine instancu (tako da se nova implementira) **izvršeni kod se ne menja**.\
Možda bi bilo moguće da se izvrši **napad Race Condition kao sa bucket-ima da bi se prepisao izvršeni kod**, ali ovo nije testirano.

{{#include ../../../banners/hacktricks-training.md}}
