Artifact Registry
Artifact Registryに関する詳細情報は、以下を確認してください:
GCP - Artifact Registry Enum artifactregistry.repositories.uploadArtifacts
この権限を持つ攻撃者は、Dockerイメージのような悪意のあるコードを含むアーティファクトの新しいバージョンをアップロードすることができます:
Copy # Configure docker to use gcloud to authenticate with Artifact Registry
gcloud auth configure-docker < locatio n > -docker.pkg.dev
# tag the image to upload it
docker tag < local-img-nam e > : < local-ta g > < locatio n > -docker.pkg.dev/ < proj-nam e > / < repo-nam e > / < img-nam e > : < ta g >
# Upload it
docker push < locatio n > -docker.pkg.dev/ < proj-nam e > / < repo-nam e > / < img-nam e > : < ta g >
同じ名前とタグの新しい悪意のあるdocker イメージをアップロードすることが可能であることが確認されました 。そのため、古いものはタグを失い 、次回そのタグのイメージがダウンロードされると悪意のあるものが ダウンロードされます。
Pythonライブラリをアップロードするアップロードするライブラリを作成することから始めます (レジストリから最新バージョンをダウンロードできる場合は、このステップを省略できます):
ライブラリ用の新しいディレクトリを作成します。例:hello_world_library
。
このディレクトリ内に、パッケージ名のディレクトリを作成します。例:hello_world
。
パッケージディレクトリ内に__init__.py
ファイルを作成します。このファイルは空でも、パッケージの初期化を含むこともできます。
Copy mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
hello_world
ディレクトリ内に、モジュール用の新しいPythonファイルを作成します。例:greet.py
。
Copy # hello_world/greet.py
def say_hello ():
return "Hello, World!"
hello_world_library
ディレクトリのルートにsetup.py
ファイルを作成します。
このファイルにはライブラリに関するメタデータが含まれ、Pythonにインストール方法を指示します。
Copy # setup.py
from setuptools import setup , find_packages
setup (
name = 'hello_world' ,
version = '0.1' ,
packages = find_packages (),
install_requires = [
# ライブラリに必要な依存関係
],
)
さあ、ライブラリをアップロードしましょう:
hello_world_library
ディレクトリのルートから、次のコマンドを実行します:
Copy python3 setup.py sdist bdist_wheel
twineの認証を設定します (パッケージをアップロードするために使用):
twine
がインストールされていることを確認します(pip install twine
)。
Copy ```sh
twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
```
Copy rm -rf dist build hello_world.egg-info
同じバージョンのpythonライブラリをアップロードすることはできませんが、より大きなバージョン をアップロードすることは可能です(または、バージョンの最後に**.0
を追加することも可能です -ただしpythonではありません-)、または 最後のバージョンを削除して新しいものをアップロードすることもできます**(必要なartifactregistry.versions.delete
):
Copy gcloud artifacts versions delete < versio n > --repository= < repo-name > --location= < location > --package= < lib-name >
artifactregistry.repositories.downloadArtifacts
この権限を使用すると、アーティファクトをダウンロード し、機密情報 や脆弱性 を検索できます。
Docker イメージをダウンロード:
Copy # Configure docker to use gcloud to authenticate with Artifact Registry
gcloud auth configure-docker < locatio n > -docker.pkg.dev
# Dowload image
docker pull < locatio n > -docker.pkg.dev/ < proj-nam e > / < repo-nam e > / < img-nam e > : < ta g >
ダウンロードする python ライブラリ:
Copy pip install < lib-nam e > --index-url "https://oauth2accesstoken:$( gcloud auth print-access-token )@<location>-python.pkg.dev/<project-id>/<repo-name>/simple/" --trusted-host < locatio n > -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 イメージ:
Copy # Delete a docker image
gcloud artifacts docker images delete < locatio n > -docker.pkg.dev/ < proj-nam e > / < repo-nam e > / < img-nam e > : < ta g >
artifactregistry.repositories.delete
コンテンツがあっても、完全なリポジトリを削除します:
Copy gcloud artifacts repositories delete <repo-name> --location=<location>
artifactregistry.repositories.setIamPolicy
この権限を持つ攻撃者は、前述のリポジトリ攻撃を実行するための権限を自分に与えることができます。
Artifact Registryの読み書きを通じた他のサービスへのピボット
Cloud Functionが作成されると、新しいdockerイメージがプロジェクトのArtifact Registryにプッシュされます。私は新しいイメージでイメージを変更しようとしましたが、現在のイメージ(およびcache
イメージ)を削除しても何も変わらず、Cloud Functionは動作し続けました。したがって、バケットと同様にレースコンディション攻撃を悪用することが可能かもしれません が、保存されたイメージを変更するだけではCloud Functionを妥協することはできません 。
App EngineはArtifact Registry内にdockerイメージを作成しますが、このサービス内でイメージを変更しても 、App Engineインスタンスを削除(新しいものがデプロイされる)しても、実行されるコードは変更されません 。
バケットと同様にレースコンディション攻撃を実行することで、実行されるコードを上書きすることが可能かもしれませんが 、これはテストされていません。