GCP - Artifact Registry Privesc

HackTricksをサポートする

Artifact Registry

Artifact Registryに関する詳細情報は、以下を確認してください:

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
  • リモートと標準のレジストリが仮想レジストリで混在し、両方にパッケージが存在する場合はどうなりますか?このページを確認してください:

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は動作し続けました。したがって、バケットと同様にレースコンディション攻撃を悪用することが可能かもしれませんが、保存されたイメージを変更するだけではCloud Functionを妥協することはできません

  • App Engine

App EngineがArtifact Registry内にdockerイメージを作成するにもかかわらず、このサービス内でイメージを変更し、App Engineインスタンスを削除(新しいものがデプロイされる)しても、実行されるコードは変更されません。 バケットと同様にレースコンディション攻撃を実行することで、実行されるコードを上書きすることが可能かもしれませんが、これはテストされていません。

Support HackTricks

Last updated