GCP - Artifact Registry Privesc

Support HackTricks

Artifact Registry

Для отримання додаткової інформації про Artifact Registry перегляньте:

GCP - Artifact Registry Enum

artifactregistry.repositories.uploadArtifacts

З цим дозволом зловмисник може завантажувати нові версії артефактів з шкідливим кодом, такими як 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>

Було перевірено, що можливо завантажити новий шкідливий docker образ з таким же ім'ям та тегом, як і той, що вже присутній, тому старий втратить тег і наступного разу, коли цей образ з цим тегом буде завантажено, буде завантажено шкідливий.

Завантажити бібліотеку Python

Почніть з створення бібліотеки для завантаження (якщо ви можете завантажити останню версію з реєстру, ви можете уникнути цього кроку):

  1. Налаштуйте структуру вашого проекту:

  • Створіть новий каталог для вашої бібліотеки, наприклад, hello_world_library.

  • Всередині цього каталогу створіть ще один каталог з ім'ям вашого пакету, наприклад, hello_world.

  • Всередині каталогу вашого пакету створіть файл __init__.py. Цей файл може бути порожнім або містити ініціалізації для вашого пакету.

mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
  1. Напишіть код вашої бібліотеки:

  • Всередині каталогу hello_world створіть новий файл Python для вашого модуля, наприклад, greet.py.

  • Напишіть вашу функцію "Hello, World!":

# hello_world/greet.py
def say_hello():
return "Hello, World!"
  1. Створіть файл setup.py:

  • У корені вашого каталогу hello_world_library створіть файл setup.py.

  • Цей файл містить метадані про вашу бібліотеку та вказує Python, як її встановити.

# setup.py
from setuptools import setup, find_packages

setup(
name='hello_world',
version='0.1',
packages=find_packages(),
install_requires=[
# Будь-які залежності, які потрібні вашій бібліотеці
],
)

Тепер давайте завантажимо бібліотеку:

  1. Скомпілюйте ваш пакет:

  • З кореня вашого каталогу hello_world_library виконайте:

python3 setup.py sdist bdist_wheel
  1. Налаштуйте автентифікацію для twine (використовується для завантаження вашого пакету):

  • Переконайтеся, що у вас встановлено twine (pip install twine).

  • Використовуйте gcloud для налаштування облікових даних:

```sh
twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
```
  1. Очистіть збірку

rm -rf dist build hello_world.egg-info

Неможливо завантажити бібліотеку python з тією ж версією, що вже присутня, але можливо завантажити більші версії (або додати додатковий .0 в кінці версії, якщо це працює - не в python, проте), або видалити останню версію та завантажити нову з (необхідний artifactregistry.versions.delete):

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

artifactregistry.repositories.downloadArtifacts

З цією дозволом ви можете завантажувати артефакти та шукати чутливу інформацію і вразливості.

Завантажте 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>

Завантажте бібліотеку 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
  • Що станеться, якщо віддалені та стандартні реєстри змішані в віртуальному, і пакет існує в обох? Перегляньте цю сторінку:

GCP - Artifact Registry Persistence

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

Видалити артефакти з реєстру, такі як docker-образи:

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

artifactregistry.repositories.delete

Видалити повний репозиторій (навіть якщо він має вміст):

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

artifactregistry.repositories.setIamPolicy

Зловмисник з цим дозволом може надати собі дозволи для виконання деяких з раніше згаданих атак на репозиторії.

Пивот до інших сервісів через читання та запис в Artifact Registry

  • Cloud Functions

Коли створюється Cloud Function, новий docker-образ завантажується в Artifact Registry проекту. Я намагався змінити образ на новий, а також видалити поточний образ (і образ cache), але нічого не змінилося, Cloud Function продовжує працювати. Тому, можливо, можливо зловживати атакою Race Condition як з бакетом, щоб змінити docker-контейнер, який буде запущено, але просто зміна збереженого образу не може скомпрометувати Cloud Function.

  • App Engine

Хоча App Engine створює docker-образи всередині Artifact Registry. Було протестовано, що навіть якщо ви зміните образ всередині цього сервісу і видалите екземпляр App Engine (щоб був розгорнутий новий), виконуваний код не змінюється. Можливо, що виконання атаки Race Condition, як з бакетами, може дозволити перезаписати виконуваний код, але це не було протестовано.

Support HackTricks

Last updated