CircleCI Security
기본 정보
CircleCI는 템플릿을 정의하여 코드와 실행 시기를 지정할 수 있는 지속적 통합 플랫폼입니다. 이를 통해 테스트 자동화 또는 배포를 예를 들어 리포지토리 마스터 브랜치로 직접 자동화할 수 있습니다.
권한
CircleCI는 github 및 bitbucket과 관련된 권한을 상속합니다. 내 테스트에서는 github 리포지토리에 쓰기 권한이 있으면 CircleCI에서 해당 프로젝트 설정을 관리할 수 있음을 확인했습니다(새로운 ssh 키 설정, 프로젝트 api 키 가져오기, 새로운 CircleCI 구성으로 새 브랜치 생성 등).
그러나 CircleCI 프로젝트로 리포지토리를 변환하려면 리포지토리 관리자여야 합니다.
환경 변수 및 비밀
문서에 따르면 워크플로 내에서 환경 변수에 값 로드하는 다양한 방법이 있습니다.
내장 환경 변수
CircleCI에서 실행되는 모든 컨테이너에는 항상 문서에 정의된 특정 환경 변수가 있습니다. 예를 들어 CIRCLE_PR_USERNAME
, CIRCLE_PROJECT_REPONAME
, CIRCLE_USERNAME
등이 있습니다.
평문
명령어 내에서 평문으로 선언할 수 있습니다:
run environment 내에서 명확한 텍스트로 선언할 수 있습니다.
build-job 환경 내에서 명시적으로 선언할 수 있습니다.
당신은 컨테이너 환경 내에서 명확한 텍스트로 선언할 수 있습니다.
프로젝트 비밀
이러한 것들은 프로젝트에 의해서만 접근 가능한 비밀입니다 (모든 브랜치에서). 이들은 https://app.circleci.com/settings/project/github/<org_name>/<repo_name>/environment-variables 에서 선언된 것을 볼 수 있습니다.
"변수 가져오기" 기능을 사용하면 다른 프로젝트에서 변수를 가져와 이 프로젝트에 가져올 수 있습니다.
컨텍스트 비밀
이러한 것들은 조직 전체에 대한 비밀입니다. 기본적으로 모든 저장소가 여기에 저장된 모든 비밀에 액세스할 수 있습니다:
그러나 다른 그룹(모든 구성원 대신)을 선택하여 특정 사람들에게만 비밀에 액세스할 수 있도록 할 수 있습니다. 이것은 현재 비밀의 보안을 높이는 가장 좋은 방법 중 하나입니다. 모두가 액세스할 수 있는 것이 아니라 일부 사람들만 액세스할 수 있도록 하는 것입니다.
공격
평문 비밀 검색
만약 VCS에 액세스할 수 있다면(github 같은) 각 저장소의 각 브랜치의 .circleci/config.yml
파일을 확인하고 거기에 저장된 잠재적인 평문 비밀을 검색할 수 있습니다.
비밀 Env Vars & 컨텍스트 열거
코드를 확인하여 각 .circleci/config.yml
파일에서 사용되는 모든 비밀 이름을 찾을 수 있습니다. 또한 이러한 파일에서 컨텍스트 이름을 얻거나 웹 콘솔에서 확인할 수 있습니다: https://app.circleci.com/settings/organization/github/<org_name>/contexts.
프로젝트 비밀 유출
프로젝트 및 컨텍스트 비밀을 모두 유출하려면 github 조직 전체에서 하나의 저장소에만 쓰기 액세스가 있어야 합니다 (그리고 기본적으로 모든 사람이 모든 컨텍스트에 액세스할 수 있어야 합니다).
"변수 가져오기" 기능을 사용하면 다른 프로젝트에서 변수를 가져와 이 프로젝트에 가져올 수 있습니다. 따라서 공격자는 모든 저장소에서 모든 프로젝트 변수를 가져와 그리고 모두 함께 유출할 수 있습니다.
모든 프로젝트 비밀은 항상 작업의 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 소유자인 경우 미검증된 오브를 허용하고 작업에서 백도어로 구성할 수 있습니다.
일부 작업에서 명령 삽입 취약점을 찾아 비밀을 수정하여 명령을 삽입할 수 있습니다.
Last updated