flawopen.com/참고자료/Cosign 검증 우회
Cosign GHSA-fx35-mq7g-6g98: 레거시 Bundle 검증 우회
입장할 때 티켓과 공식 신분증의 이름을 모두 확인하는 곳을 떠올려 보세요. 취약한 레거시 Bundle 경로는 별도의 키를 신분증으로 잘못 취급해 이름 확인 없이 티켓을 받아들일 수 있었습니다. 서명이 수학적으로 유효해도 필요한 워크플로 ID가 입증된 것은 아닙니다.
Cosign Blob 검증에서 실패한 부분
GHSA-fx35-mq7g-6g98은 레거시 JSON `--bundle`과 함께 ID 및 issuer 플래그(또는 정규식 변형)를 사용해 keyless 검증하는 `cosign verify-blob`, `cosign verify-blob-attestation`에 영향을 줍니다. Bundle의 `cert` 필드를 X.509 인증서로 파싱하지 못하면 영향을 받는 버전은 이를 공개 키로 다시 읽었습니다. 이로 인해 내부 서명 검증기가 설정되고 후속 경로에서 인증서 체인 검증과 `CheckCertificatePolicy`가 생략되어 ID 및 issuer 제약이 적용되지 않았습니다. 내장된 키에 대한 서명이 유효하면 검증이 성공할 수 있었습니다. Bundle 키가 명시적으로 지정한 `--key`를 덮어쓸 수도 있었습니다. 공지에 따르면 컨테이너 이미지 검증과 표준 Sigstore protobuf Bundle 경로는 영향을 받지 않습니다. 알려진 CVE는 없으며 상위 공지는 High, CVSS 7.4, CWE-295, CWE-347로 분류합니다.
검증 우회 흐름
CI 작업이 아티팩트와 레거시 JSON Bundle을 받음
아티팩트와 Bundle은 릴리스 워크플로, 캐시, 미러 또는 다른 파이프라인 입력에서 올 수 있습니다. 정책 검사가 끝날 때까지 둘 다 신뢰할 수 없는 입력으로 취급해야 합니다.
취약한 파서가 인증서가 있어야 할 자리에 키를 허용함
영향을 받는 버전은 X.509 파싱 실패 뒤 공개 키 fallback을 실행했습니다. 그 결과 서명 검증기가 설정되고 keyless 인증서 정책 검사가 생략됐습니다.
필요한 워크플로 ID를 증명하지 않고 서명 검증이 통과함
고정된 인증서 ID와 OIDC issuer를 확인하지 않고도 검증이 성공할 수 있습니다. 종료 코드만 확인하는 파이프라인은 승인되지 않은 아티팩트를 사용할 수 있습니다.
수정된 Cosign 버전과 서명자 ID를 고정하세요
두 예시는 동일한 정확한 GitHub Actions ID와 OIDC issuer를 고정합니다. 취약한 명령은 영향받는 Cosign 버전을 사용하며 레거시 JSON Bundle에서 파서가 검증을 우회할 수 있었습니다. 강화 명령은 수정 버전과 정규식 대신 정확한 값 옵션을 사용합니다. 검토한 버전과 digest로 CI의 Cosign을 고정하세요. 이 명령은 아티팩트를 검증하며 악성 Bundle을 만들거나 시연하지 않습니다.
# Risk: affected versions accept legacy JSON bundles in this path
# cosign v2.6.4 or earlier, or v3.1.2 or earlier
cosign verify-blob release.tar.gz \
--bundle release.sigstore.json \
--certificate-identity-regexp "^https://github\.com/acme/service/\.github/workflows/release\.yml@refs/heads/main$" \
--certificate-oidc-issuer-regexp "^https://token\.actions\.githubusercontent\.com$"
# Require Cosign v2.6.5+ or v3.1.3+ in the pinned CI toolchain
cosign verify-blob release.tar.gz \
--bundle release.sigstore.json \
--certificate-identity "https://github.com/acme/service/.github/workflows/release.yml@refs/heads/main" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
수정 및 배포 체크리스트
- ✓`cosign verify-blob` 또는 `cosign verify-blob-attestation`을 실행하는 CI 작업을 조사하고 다운로드된 도구 및 컨테이너 내부를 포함해 실제 버전을 확인하세요.
- ✓영향을 받는 v2 설치는 v2.6.5 이상, v3 설치는 v3.1.3 이상으로 업데이트하세요. 지원되는 버전을 선택하고 출처와 digest를 고정하세요.
- ✓예상 서명 워크플로에 정확한 `--certificate-identity`와 `--certificate-oidc-issuer`를 설정하세요. 무관한 ID를 허용하는 `.*` 정책은 피하세요.
- ✓가능하면 레거시 JSON Bundle을 표준 Sigstore Bundle 형식으로 이전하세요. 공지는 해당 형식의 검증 경로가 영향받지 않는다고 설명합니다. 배포 중 도구와 버전의 동작을 확인하세요.
- ✓아티팩트와 Bundle의 출처 정보를 연결하고 모든 검증 오류에서 실패하도록 하며, 같은 통제된 작업에서 검증에 성공한 경우에만 게시하세요.
- ✓영향받는 버전으로 검증한 아티팩트가 이후 게시 또는 배포됐는지 확인하세요. 보관된 아티팩트를 수정 버전 Cosign과 예상 ID 정책으로 다시 검증하고 출처 불일치를 조사하세요.
- Sigstore Cosign security advisory GHSA-fx35-mq7g-6g98
- Cosign fix PR #5040 — removal of raw-key fallback
- Sigstore CI Quickstart — keyless signing and verification
- Cosign releases — patched versions