CircleCI Security
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:
Możesz je zadeklarować w czytelnym tekście wewnątrz środowiska uruchomieniowego:
Możesz je zadeklarować w czytelnym tekście wewnątrz środowiska build-job:
Możesz je zadeklarować w czystym tekście w środowisku kontenera:
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:
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:
Wyciek kontekstu sekretów
Musisz określić nazwę kontekstu (spowoduje to również wyciek sekretów projektu):
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:
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):
Lub nawet kontener Docker z dostępem do zdalnej usługi Docker:
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