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
(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-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 镜像:
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 继续工作。因此,可能 可以利用竞争条件攻击 ,就像使用存储桶一样,来更改将要运行的 docker 容器,但 仅仅修改存储的镜像无法破坏 Cloud Function 。
尽管 App Engine 在 Artifact Registry 中创建 docker 镜像。测试表明,即使您在此服务中修改镜像 并删除 App Engine 实例(以便部署一个新的实例),执行的代码不会改变 。
可能通过执行 类似于存储桶的竞争条件攻击,可能会覆盖执行的代码 ,但这尚未测试。