CircleCI Security
Informações Básicas
CircleCI é uma plataforma de Integração Contínua onde você pode definir modelos indicando o que deseja que seja feito com algum código e quando fazer. Dessa forma, você pode automatizar testes ou implantações diretamente a partir do branch master do seu repositório, por exemplo.
Permissões
CircleCI herda as permissões do github e bitbucket relacionadas à conta que faz login. Nos meus testes, verifiquei que, desde que você tenha permissões de escrita sobre o repositório no github, você poderá gerenciar as configurações do projeto no CircleCI (definir novas chaves ssh, obter chaves de api do projeto, criar novos branches com novas configurações do CircleCI...).
No entanto, você precisa ser um administrador do repositório para converter o repositório em um projeto do CircleCI.
Variáveis de Ambiente e Segredos
De acordo com a documentação, existem diferentes maneiras de carregar valores em variáveis de ambiente dentro de um fluxo de trabalho.
Variáveis de ambiente integradas
Cada contêiner executado pelo CircleCI sempre terá variáveis de ambiente específicas definidas na documentação como CIRCLE_PR_USERNAME
, CIRCLE_PROJECT_REPONAME
ou CIRCLE_USERNAME
.
Texto claro
Você pode declará-las em texto claro dentro de um comando:
Você pode declará-los em texto claro dentro do ambiente de execução:
Você pode declará-los em texto claro dentro do ambiente do build-job:
Você pode declará-los em texto claro dentro do ambiente de um contêiner:
Segredos do Projeto
Estes são segredos que só serão acessíveis pelo projeto (por qualquer ramo). Você pode vê-los declarados em https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables
A funcionalidade de "Importar Variáveis" permite importar variáveis de outros projetos para este.
Segredos de Contexto
Estes são segredos que são para toda a organização. Por padrão, qualquer repositório poderá acessar qualquer segredo armazenado aqui:
No entanto, observe que um grupo diferente (em vez de Todos os membros) pode ser selecionado para dar acesso apenas a pessoas específicas aos segredos. Atualmente, esta é uma das melhores maneiras de aumentar a segurança dos segredos, para não permitir que todos os acessem, mas apenas algumas pessoas.
Ataques
Buscar Segredos em Texto Claro
Se você tem acesso ao VCS (como github), verifique o arquivo .circleci/config.yml
de cada repositório em cada ramo e procure por potenciais segredos em texto claro armazenados lá.
Enumeração de Variáveis de Ambiente Secretas e de Contexto
Verificando o código, você pode encontrar todos os nomes de segredos que estão sendo usados em cada arquivo .circleci/config.yml
. Você também pode obter os nomes de contexto desses arquivos ou verificá-los no console web: https://app.circleci.com/settings/organization/github/<org_name>/contexts.
Exfiltrar Segredos do Projeto
Para exfiltrar TODOS os segredos do projeto e do contexto, você apenas precisa ter acesso de ESCRITA a apenas 1 repositório em toda a organização do github (e sua conta deve ter acesso aos contextos, mas por padrão todos podem acessar todos os contextos).
A funcionalidade de "Importar Variáveis" permite importar variáveis de outros projetos para este. Portanto, um atacante poderia importar todas as variáveis do projeto de todos os repositórios e então exfiltrar todos eles juntos.
Todos os segredos do projeto sempre são definidos no env dos jobs, então apenas chamando env e ofuscando em base64 irá exfiltrar os segredos no console de log web dos fluxos de trabalho:
Se você não tem acesso ao console web mas tem acesso ao repositório e sabe que o CircleCI está sendo usado, você pode simplesmente criar um fluxo de trabalho que é acionado a cada minuto e que extrai os segredos para um endereço externo:
Extrair Segredos de Contexto
Você precisa especificar o nome do contexto (isso também irá extrair os segredos do projeto):
Se você não tem acesso ao console web mas tem acesso ao repositório e sabe que o CircleCI está sendo usado, você pode simplesmente modificar um fluxo de trabalho que é acionado a cada minuto e que extrai os segredos para um endereço externo:
Apenas criar um novo .circleci/config.yml
em um repositório não é suficiente para acionar uma compilação no CircleCI. Você precisa habilitá-lo como um projeto no console do CircleCI.
Escape para a Nuvem
CircleCI oferece a opção de executar suas compilações em suas máquinas ou nas suas próprias. Por padrão, suas máquinas estão localizadas no GCP, e inicialmente você não conseguirá encontrar nada relevante. No entanto, se uma vítima estiver executando as tarefas em suas próprias máquinas (potencialmente, em um ambiente de nuvem), você pode encontrar um ponto de extremidade de metadados da nuvem com informações interessantes.
Observe que nos exemplos anteriores tudo foi executado dentro de um contêiner Docker, mas você também pode solicitar o lançamento de uma máquina VM (que pode ter permissões de nuvem diferentes):
Ou até mesmo um contêiner Docker com acesso a um serviço Docker remoto:
Persistência
É possível criar tokens de usuário no CircleCI para acessar os pontos de API com as permissões do usuário.
https://app.circleci.com/settings/user/tokens
É possível criar tokens de projetos para acessar o projeto com as permissões concedidas ao token.
https://app.circleci.com/settings/project/github/<org>/<repo>/api
É possível adicionar chaves SSH aos projetos.
https://app.circleci.com/settings/project/github/<org>/<repo>/ssh
É possível criar um trabalho cron em um branch oculto em um projeto inesperado que está vazando todas as variáveis de ambiente de contexto diariamente.
Ou até mesmo criar em um branch / modificar um trabalho conhecido que irá vazar todos os contextos e segredos dos projetos diariamente.
Se você é proprietário do GitHub, pode permitir orbs não verificados e configurar um em um trabalho como backdoor
Você pode encontrar uma vulnerabilidade de injeção de comando em alguma tarefa e injetar comandos via um segredo modificando seu valor
Last updated