GCP - Artifact Registry Privesc

Wsparcie dla HackTricks

Rejestr Artefaktów

Aby uzyskać więcej informacji na temat Rejestru Artefaktów, sprawdź:

GCP - Artifact Registry Enum

artifactregistry.repositories.uploadArtifacts

Dzięki temu uprawnieniu atakujący mógłby przesyłać nowe wersje artefaktów z złośliwym kodem, takimi jak obrazy 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>

Sprawdzono, że możliwe jest przesłanie nowego złośliwego obrazu dockera o tej samej nazwie i tagu, co już obecny, więc stary straci tag i następnym razem, gdy obraz z tym tagiem zostanie pobrany, zostanie pobrany złośliwy.

Prześlij bibliotekę Pythona

Zacznij od stworzenia biblioteki do przesłania (jeśli możesz pobrać najnowszą wersję z rejestru, możesz pominąć ten krok):

  1. Ustaw strukturę swojego projektu:

  • Utwórz nowy katalog dla swojej biblioteki, np. hello_world_library.

  • Wewnątrz tego katalogu utwórz kolejny katalog z nazwą swojego pakietu, np. hello_world.

  • Wewnątrz katalogu swojego pakietu utwórz plik __init__.py. Ten plik może być pusty lub może zawierać inicjalizacje dla twojego pakietu.

mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
  1. Napisz kod swojej biblioteki:

  • Wewnątrz katalogu hello_world utwórz nowy plik Pythona dla swojego modułu, np. greet.py.

  • Napisz swoją funkcję "Hello, World!":

# hello_world/greet.py
def say_hello():
return "Hello, World!"
  1. Utwórz plik setup.py:

  • W katalogu głównym swojego katalogu hello_world_library utwórz plik setup.py.

  • Ten plik zawiera metadane o twojej bibliotece i informuje Pythona, jak ją zainstalować.

# setup.py
from setuptools import setup, find_packages

setup(
name='hello_world',
version='0.1',
packages=find_packages(),
install_requires=[
# Jakiekolwiek zależności, których potrzebuje twoja biblioteka
],
)

Teraz prześlij bibliotekę:

  1. Zbuduj swój pakiet:

  • Z katalogu głównego swojego katalogu hello_world_library uruchom:

python3 setup.py sdist bdist_wheel
  1. Skonfiguruj uwierzytelnianie dla twine (używane do przesyłania twojego pakietu):

  • Upewnij się, że masz zainstalowane twine (pip install twine).

  • Użyj gcloud, aby skonfigurować dane uwierzytelniające:

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

rm -rf dist build hello_world.egg-info

Nie można przesłać biblioteki Pythona o tej samej wersji, która już istnieje, ale można przesłać większe wersje (lub dodać dodatkowe .0 na końcu wersji, jeśli to działa - nie w Pythonie), lub usunąć ostatnią wersję i przesłać nową z (potrzebne artifactregistry.versions.delete):

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

artifactregistry.repositories.downloadArtifacts

Dzięki temu uprawnieniu możesz pobierać artefakty oraz wyszukiwać wrażliwe informacje i luki.

Pobierz obraz 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>

Pobierz bibliotekę python:

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
  • Co się stanie, jeśli zdalne i standardowe rejestry zostaną zmieszane w wirtualnym i pakiet istnieje w obu? Sprawdź tę stronę:

GCP - Artifact Registry Persistence

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

Usuń artefakty z rejestru, takie jak obrazy docker:

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

artifactregistry.repositories.delete

Usuń pełne repozytorium (nawet jeśli ma zawartość):

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

artifactregistry.repositories.setIamPolicy

Napastnik z tym uprawnieniem mógłby nadać sobie uprawnienia do przeprowadzenia niektórych z wcześniej wspomnianych ataków na repozytoria.

Przechodzenie do innych usług przez odczyt i zapis w Artifact Registry

  • Cloud Functions

Gdy tworzona jest funkcja chmurowa, nowy obraz docker jest przesyłany do Artifact Registry projektu. Próbowałem zmodyfikować obraz na nowy, a nawet usunąć bieżący obraz (i obraz cache), ale nic się nie zmieniło, funkcja chmurowa nadal działa. Dlatego może możliwe jest nadużycie ataku Race Condition jak w przypadku bucketu, aby zmienić kontener docker, który będzie uruchamiany, ale po prostu modyfikacja przechowywanego obrazu nie jest wystarczająca, aby skompromitować funkcję chmurową.

  • App Engine

Mimo że App Engine tworzy obrazy docker w Artifact Registry. Przetestowano, że nawet jeśli zmodyfikujesz obraz w tej usłudze i usuniesz instancję App Engine (aby wdrożona została nowa), wykonywany kod się nie zmienia. Możliwe, że przeprowadzenie ataku Race Condition jak w przypadku bucketów mogłoby umożliwić nadpisanie wykonywanego kodu, ale to nie zostało przetestowane.

Wsparcie dla HackTricks

Last updated