Repository navigation
security(ci): 외부 Actions 를 전부 commit SHA 로 고정한다 (closes 847) [base: ci/848-single-gate] - #1039
Merged
Merged
Conversation
워크플로가 태그·브랜치로 액션을 부르면 그 참조가 가리키는 코드는 사후에 바뀔 수 있다. v7 태그는 옮겨 달 수 있고 @master 는 매 run 이 다른 코드다. 우리 러너에서 저장소 토큰을 들고 도는 코드이므로 리비전이 불변이어야 한다. - 부동 참조 8종을 40자리 commit SHA 로 고정하고 옆에 원래 release tag 를 남긴다. actions/checkout v7.0.1 · actions/setup-java v5.7.0 · actions/upload-artifact v4.6.2/v7.0.1 · actions/github-script v9.0.0 · docker/setup-buildx-action v4.3.0 · docker/build-push-action v7.3.0 · dvdandroid/action-android-lint v1.3 - supply-chain-policy.test.mjs 에 정책 4건 추가. 외부 uses 는 전부 SHA 여야 하고, 고정된 참조는 어느 release 에서 온 것인지 주석으로 남겨야 하며, 이 저장소의 composite action 도 같은 규칙을 따른다. 같은 저장소를 가리키는 ./ 참조는 대상이 아니다(리비전이 이 저장소의 것이다). @master 였던 dvdandroid/action-android-lint 는 v1.3 태그가 master HEAD 와 같은 커밋이라 동작 변화 없이 고정된다. 직접 Gradle command 로 바꾸는 선택지는 모듈별 lint 위반 인라인 코멘트(#279)를 잃으므로 택하지 않았다. 실측: - 고정 후 미고정 외부 uses 0건 (로컬 ./ 참조 제외) - 정책이 실제로 막는지 fixture 로 확인 — checkout 을 @v7 로 되돌리면 테스트가 'mock-cleanup-check.yml: actions/checkout@v7' 로 실패하고, 원복하면 통과한다 - actionlint · repository-quality.sh (17 workflows, 4 shell scripts) 통과 - node --test .github/scripts/*.test.mjs → 85/85 Dependabot 은 이미 github-actions ecosystem 을 주간 추적하고 auto-merge 설정이 없어(supply-chain-policy 가 고정) 고정 SHA 의 새 release 를 PR 로만 올린다. 저장소 설정(SHA pinning required · allowed actions 정책 · secret scanning · push protection)은 이 PR 이 develop 에 들어간 뒤 적용한다. 워크플로가 전부 호환되기 전에 켜면 CI 가 통째로 막힌다. closes #847
…y/847-action-pinning
…y/847-action-pinning
This was referenced Aug 24, 2026
Sadturtleman
approved these changes
Aug 25, 2026
Sadturtleman
left a comment
Collaborator
There was a problem hiding this comment.
승인합니다. 정책 테스트가 «태그·브랜치·짧은 SHA 거부» 를 fixture 로 실제 실패시켜 확인한 점, 고정 참조에 release 주석을 요구한 점이 이 변경의 값이라고 봅니다.
머지 순서만 알려 둡니다 — 제가 방금 승인한 #1096(Android Lint 리포터 → job summary) 과 같은 파일에서 부딪힙니다.
$ git merge-tree --write-tree origin/security/847-action-pinning origin/fix/1093
CONFLICT (content): .github/workflows/lint.yml
CONFLICT (modify/delete): .github/workflows/deployment-decision.yml
lint.yml— 이 PR 이dvdandroid/action-android-lint@master를@21c9fa65(v1.3)로 고정하는 자리를 #1096 은 액션 자체를 걷어냅니다(도커 액션이 매 run reviewdog 을 내려받다 실패하면 위반 0건에도 red). 나중에 들어가는 쪽이 «고정할 대상이 없어짐» 으로 정리하면 됩니다.deployment-decision.yml— #1076 계열이 이 파일을 지웁니다.
둘 다 해소 방향이 명확해 blocking 으로 세지 않았습니다.
Contributor
|
이 PR 은
|
…n-pinning # Conflicts: # .github/workflows/android-managed-device.yml # .github/workflows/deployment-decision.yml # .github/workflows/lint.yml # .github/workflows/unit-test.yml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
워크플로가 태그·브랜치로 액션을 부르면 그 참조가 가리키는 코드는 사후에 바뀔 수 있다.
v7태그는 옮겨 달 수 있고@master는 매 run 이 다른 코드다. 우리 러너에서 저장소 토큰을 들고 도는 코드이므로 리비전이 불변이어야 한다.Repository Actions 설정은 지금
allowed_actions=all,sha_pinning_required=false, secret scanning·push protection 모두 비활성이다.변경 — 부동 참조 8종 고정
actions/checkout@v7@3d3c42e5…# v7.0.1actions/setup-java@v5@b6effb05…# v5.7.0actions/upload-artifact@v4@ea165f8d…# v4.6.2actions/upload-artifact@v7@043fb46d…# v7.0.1actions/github-script@v9@3a2844b7…# v9.0.0docker/setup-buildx-action@v4@37fe6310…# v4.3.0docker/build-push-action@v7@53b7df96…# v7.3.0dvdandroid/action-android-lint@master@21c9fa65…# v1.311개 워크플로, 29줄. codeql·dependency-review·dependency-submission·firebase-wif-canary 는 이미 고정돼 있었다.
@master였던 android-lintv1.3태그가 master HEAD 와 같은 커밋이라 동작 변화 없이 고정된다. 이슈가 제시한 다른 선택지(직접 Gradle command 로 교체)는 모듈별 lint 위반의 인라인 코멘트(#279)를 잃으므로 택하지 않았다. 다만 이 액션은 마지막 커밋이 2025-08-26 이고 별 22개다 — 유지보수가 활발하지 않다는 점은 알고 고정한다. 고정돼 있으므로 업스트림이 방치돼도 우리 CI 동작은 바뀌지 않는다.정책으로 고정 — 회귀하면 CI 가 잡는다
supply-chain-policy.test.mjs에 4건 추가.uses는 전부 40자리 commit SHA./참조(로컬 액션·reusable workflow)는 대상이 아니다 — 리비전이 이 저장소의 것이다정책이 실제로 막는지 fixture 로 확인했다.
mock-cleanup-check.yml의 checkout 을@v7로 되돌리면로 실패하고, 원복하면 12/12 통과한다. 태그·브랜치·짧은 SHA(
@3d3c42e)가 각각 거부되는 것도 단위 fixture 로 고정했다.검증
uses0건actionlint·scripts/repository-quality.sh(17 workflows, 4 shell scripts) 통과node --test .github/scripts/*.test.mjs→ 85/85 통과Dependabot 은 이미
github-actionsecosystem 을 주간 추적하고 auto-merge 설정이 없다(그 성질도 supply-chain-policy 가 고정하고 있다). 고정 SHA 의 새 release 는 PR 로만 올라온다.남은 것 — 저장소 설정은 머지 후다
이 PR 은 워크플로 쪽만 다룬다. 다음 네 가지는 develop 에 들어간 뒤 적용해야 한다. 워크플로가 전부 호환되기 전에 켜면 CI 가 통째로 막히기 때문이다.
sha_pinning_required활성화이 단계들은 저장소 전체에 영향을 주고 팀원의 push 를 막을 수 있어 PR 로 처리하지 않았다. 머지 후 적용하고 재조회 결과를 #847 에 남긴다.
리뷰어에게
pr-validation.yml을 포함해 워크플로 전체가 고정 대상이라 그 위에 쌓았다.actions/upload-artifact가 v4 와 v7 로 갈려 있다(unit-test.yml안에서도 두 major 가 섞여 있다). 이번엔 major 를 유지한 채 각각 최신 패치로 고정만 했다 — 버전 통일은 동작 변경이라 이 PR 범위 밖이다.Closes #847