GCP - Artifact Registry Privesc

Support HackTricks

Artifact Registry

Para mais informações sobre o Artifact Registry, confira:

artifactregistry.repositories.uploadArtifacts

Com essa permissão, um atacante poderia fazer upload de novas versões dos artefatos com código malicioso, como imagens 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>

Foi verificado que é possível fazer o upload de uma nova imagem docker maliciosa com o mesmo nome e tag da que já está presente, então a antiga perderá a tag e na próxima vez que essa imagem com essa tag for baixada, a maliciosa será baixada.

Fazer upload de uma biblioteca Python

Comece criando a biblioteca para fazer o upload (se você puder baixar a versão mais recente do registro, pode evitar esta etapa):

  1. Configure a estrutura do seu projeto:

  • Crie um novo diretório para sua biblioteca, por exemplo, hello_world_library.

  • Dentro deste diretório, crie outro diretório com o nome do seu pacote, por exemplo, hello_world.

  • Dentro do diretório do seu pacote, crie um arquivo __init__.py. Este arquivo pode estar vazio ou pode conter inicializações para seu pacote.

mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
  1. Escreva o código da sua biblioteca:

  • Dentro do diretório hello_world, crie um novo arquivo Python para seu módulo, por exemplo, greet.py.

  • Escreva sua função "Hello, World!":

# hello_world/greet.py
def say_hello():
return "Hello, World!"
  1. Crie um arquivo setup.py:

  • Na raiz do seu diretório hello_world_library, crie um arquivo setup.py.

  • Este arquivo contém metadados sobre sua biblioteca e informa ao Python como instalá-la.

# setup.py
from setuptools import setup, find_packages

setup(
name='hello_world',
version='0.1',
packages=find_packages(),
install_requires=[
# Quaisquer dependências que sua biblioteca precisa
],
)

Agora, vamos fazer o upload da biblioteca:

  1. Construa seu pacote:

  • Da raiz do seu diretório hello_world_library, execute:

python3 setup.py sdist bdist_wheel
  1. Configure a autenticação para twine (usado para fazer o upload do seu pacote):

  • Certifique-se de que você tem twine instalado (pip install twine).

  • Use gcloud para configurar as credenciais:

```sh
twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
```
  1. Limpar a construção

rm -rf dist build hello_world.egg-info

Não é possível fazer upload de uma biblioteca python com a mesma versão que a já presente, mas é possível fazer upload de versões maiores (ou adicionar um extra .0 no final da versão se isso funcionar -não em python, no entanto-), ou deletar a última versão e fazer upload de uma nova com (necessário artifactregistry.versions.delete):

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

artifactregistry.repositories.downloadArtifacts

Com esta permissão, você pode baixar artefatos e procurar por informações sensíveis e vulnerabilidades.

Baixar uma imagem 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>

Baixe uma biblioteca 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
  • O que acontece se um registro remoto e um registro padrão forem misturados em um virtual e um pacote existir em ambos? Confira esta página:

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

Excluir artefatos do registro, como imagens docker:

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

artifactregistry.repositories.delete

Excluir um repositório completo (mesmo que tenha conteúdo):

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

artifactregistry.repositories.setIamPolicy

Um atacante com essa permissão poderia se conceder permissões para realizar alguns dos ataques de repositório mencionados anteriormente.

Mudança para outros Serviços através da Leitura e Escrita do Artifact Registry

  • Cloud Functions

Quando uma Cloud Function é criada, uma nova imagem docker é enviada para o Artifact Registry do projeto. Tentei modificar a imagem por uma nova, e até mesmo deletar a imagem atual (e a imagem cache), e nada mudou, a função em nuvem continuou funcionando. Portanto, talvez possa ser possível abusar de um ataque de Condição de Corrida como com o bucket para mudar o contêiner docker que será executado, mas apenas modificar a imagem armazenada não é possível comprometer a Cloud Function.

  • App Engine

Embora o App Engine crie imagens docker dentro do Artifact Registry. Foi testado que mesmo se você modificar a imagem dentro deste serviço e remover a instância do App Engine (para que uma nova seja implantada), o código executado não muda. Pode ser possível que realizando um ataque de Condição de Corrida como com os buckets, pode ser possível sobrescrever o código executado, mas isso não foi testado.

Support HackTricks

Last updated