CircleCI Security
Last updated
Last updated
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
CircleCI는 코드로 무엇을 하고 언제 할지를 정의하는 템플릿을 설정할 수 있는 지속적 통합 플랫폼입니다. 이렇게 하면 예를 들어 레포 마스터 브랜치에서 직접 테스트 또는 배포를 자동화할 수 있습니다.
CircleCI는 로그인하는 계정과 관련된 github 및 bitbucket의 권한을 상속합니다. 내 테스트에서 확인한 바에 따르면, github의 레포에 대한 쓰기 권한이 있는 한, CircleCI에서 프로젝트 설정을 관리할 수 있습니다(새 ssh 키 설정, 프로젝트 api 키 가져오기, 새로운 CircleCI 구성으로 새로운 브랜치 만들기 등).
그러나 레포를 CircleCI 프로젝트로 변환하려면 레포 관리자여야 합니다.
문서에 따르면, 워크플로 내에서 환경 변수에 값을 로드하는 다양한 방법이 있습니다.
CircleCI에서 실행되는 모든 컨테이너는 항상 문서에 정의된 특정 환경 변수인 CIRCLE_PR_USERNAME
, CIRCLE_PROJECT_REPONAME
또는 CIRCLE_USERNAME
을 가집니다.
명령 내에서 일반 텍스트로 선언할 수 있습니다:
실행 환경 내에서 명확한 텍스트로 선언할 수 있습니다:
당신은 build-job 환경 내에서 명확한 텍스트로 그것들을 선언할 수 있습니다:
당신은 컨테이너의 환경 안에 평문으로 그것들을 선언할 수 있습니다:
이것은 프로젝트(모든 브랜치에서)만 접근할 수 있는 비밀입니다. 다음 링크에서 선언된 내용을 확인할 수 있습니다: 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로 난독화하면 워크플로우 웹 로그 콘솔에서 비밀을 유출할 수 있습니다:
만약 웹 콘솔에 접근할 수 없지만 레포에 접근할 수 있고 CircleCI가 사용된다는 것을 안다면, 매 분마다 트리거되는 워크플로우를 생성하고 비밀을 외부 주소로 유출하는 것을 할 수 있습니다:
컨텍스트 이름을 지정해야 합니다 (이것은 프로젝트 비밀도 추출합니다):
만약 웹 콘솔에 접근할 수 없지만 레포에 접근할 수 있고 CircleCI가 사용되고 있다는 것을 안다면, 매 분마다 트리거되는 워크플로우를 수정하여 비밀을 외부 주소로 유출할 수 있습니다:
저는 새로운 .circleci/config.yml
을 레포에 생성하는 것만으로는 circleci 빌드를 트리거할 수 없습니다. circleci 콘솔에서 프로젝트로 활성화해야 합니다.
CircleCI는 당신의 빌드를 그들의 머신에서 실행하거나 당신의 머신에서 실행할 수 있는 옵션을 제공합니다. 기본적으로 그들의 머신은 GCP에 위치하고 있으며, 처음에는 관련된 정보를 찾을 수 없습니다. 그러나 피해자가 자신의 머신(잠재적으로 클라우드 환경)에서 작업을 실행하고 있다면, 흥미로운 정보가 있는 클라우드 메타데이터 엔드포인트를 찾을 수 있습니다.
이전 예제에서는 모든 것이 도커 컨테이너 내에서 실행되었지만, VM 머신을 실행하도록 요청할 수도 있습니다(다른 클라우드 권한이 있을 수 있습니다):
또는 원격 도커 서비스에 접근할 수 있는 도커 컨테이너:
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 소유자인 경우 검증되지 않은 오브를 허용하고 작업에서 백도어로 구성할 수 있습니다.
일부 작업에서 명령 주입 취약점을 찾아 비밀의 값을 수정하여 명령을 주입할 수 있습니다.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)