본문으로 건너뛰기
>_ITDITD웹 보안 플랫폼

보안 가이드

Trivy 공급망 침해 (2026년 3월): CI에서 Trivy를 쓰고 있다면 할 일

2026년 3월 19~20일 악성 Trivy v0.69.4가 배포되고 trivy-action과 setup-trivy 태그가 변조돼 CI의 비밀값이 노려졌습니다. Aqua Security의 공개 내용을 바탕으로 영향받은 버전과 시간대, 비밀값 교체, SHA 고정(커밋 ID로 액션 참조), CI 토큰 최소 권한을 정리합니다.

게시 2026-09-30 업데이트 2026-10-04 최종 확인 2026-09-30 12분 읽기

대상: GitHub Actions 등의 CI에서 Trivy(컨테이너 이미지·의존성 취약점 스캐너), aquasecurity/trivy-action, aquasecurity/setup-trivy를 쓰는 사람, 그리고 작업용 PC나 서버에서 Trivy 바이너리나 컨테이너 이미지를 쓰는 사람.

이 글은 Aqua Security의 공식 공개 내용과 Trivy 보안 권고를 바탕으로 하며, 공격 기법이나 침해 지표(IoC) 값은 다루지 않습니다.

CI 사용자가 지금 할 일

1

영향 기간에 Trivy 관련 워크플로가 실행됐는지 확인한다

Aqua는 2026년 3월 19~20일의 워크플로 실행 로그를 검토하라고 요청합니다. 권고에 적힌 기간(UTC)은 다음과 같습니다.

  • trivy-action: 3월 19일 약 17:43 ~ 3월 20일 약 05:40
  • setup-trivy: 3월 19일 약 17:43 ~ 약 21:44
  • Trivy v0.69.4: 3월 19일 18:22 ~ 약 21:42
  • Docker Hub 이미지 v0.69.5, v0.69.6: 3월 22일 15:43 ~ 3월 23일 약 01:40

조직에 워크플로가 많다면 aquasecurity/trivy-action과 aquasecurity/setup-trivy를 참조하는 것을 검색하고, 실행 기록을 이 기간으로 걸러 보세요.

2

버전만이 아니라 참조 방식으로 판단한다

권고에서 중요한 것은 구성 요소를 어떻게 참조했는가입니다.

  • trivy-action — 영향 있음: 0.35.0 이외의 태그(0.0.1~0.34.2), 기간 중 version: latest를 명시한 경우, 2025년 4월 9일 이전 커밋에 대한 SHA 고정. 영향 없음: 0.35.0 태그, 2025년 4월 9일 이후의 안전한 커밋에 대한 SHA 고정.
  • setup-trivy — 영향 있음: SHA로 고정하지 않은 모든 사용. 영향 없음: 안전한 커밋에 대한 SHA 고정.
  • Trivy 본체 — 영향 있음: v0.69.4(기간 중의 latest 포함. GitHub, deb, rpm, get.trivy.dev, GHCR, ECR Public, Docker Hub)와 Docker Hub의 v0.69.5, v0.69.6. 영향 없음: v0.69.3 이하, 다이제스트로 참조한 이미지, 소스에서 빌드한 것, 공식 Homebrew 포뮬러.
3

영향을 받았다면 잡이 읽을 수 있던 비밀값을 전부 교체한다

Aqua는 침해된 버전이 실행됐을 가능성이 조금이라도 있다면 영향받은 파이프라인이 접근할 수 있던 모든 비밀값을 노출된 것으로 봐야 한다고 밝혔습니다. 클라우드 인증 정보(AWS, GCP, Azure), Git 인증 정보, 컨테이너 레지스트리 인증 정보, SSH 키, Kubernetes 토큰, 환경 변수 및 기타 자동화용 비밀값입니다.

npm 배포 토큰은 실제로 침해된 것으로 취급하라고 요청하며, 탈취된 토큰이 npm에 악성 코드를 퍼뜨리는 데 쓰이고 있다고 설명합니다. 자체 호스팅 러너라면 러너에 저장된 데이터베이스 인증 정보, TLS 개인 키, VPN 설정도 대상으로 들고 있습니다.

4

오래된 키를 먼저 모두 무효화하고, 새 키를 한꺼번에 발급한다

이 단계는 Trivy 자신의 근본 원인에서 나온 것입니다. Aqua에 따르면 3월 1일의 교체는 한꺼번에 이뤄지지 않았고, 며칠에 걸친 교체 기간 동안 공격자가 아직 유효한 토큰으로 새로 발급된 비밀값까지 가져갔을 수 있습니다.

대상 비밀값을 목록으로 만들었다면 오래된 키를 먼저 함께 무효화한 뒤 새 키를 발급하세요. 키를 하나씩 교체하면 아직 유효한 오래된 키로 새 키를 읽을 여지가 남습니다. 대가로 짧은 서비스 중단을 계획해 두세요.

5

권고의 점검 항목으로 GitHub 조직과 Trivy를 실행한 기기를 확인한다

Aqua는 점검할 항목으로, 대체 유출 경로가 쓰였다면 GitHub 조직에 만들어진 저장소, 그리고 개발자 PC처럼 CI 밖에서 v0.69.4가 실행된 기기에 남은 파일을 들고 있습니다. 영향 가능성이 있다면 아래에 링크한 Aqua의 공개 내용과 권고의 점검 목록을 따르세요(이 글은 지표 값을 옮겨 싣지 않습니다).

6

안전이 확인된 버전으로 옮긴다

Aqua는 안전한 버전으로 Trivy v0.69.2와 v0.69.3, trivy-action v0.35.0, setup-trivy v0.2.6을 들고 있습니다. 권고에 따르면 trivy-action의 옛 태그(0.0.1~0.34.2)는 삭제돼 같은 이름으로 다시 만들 수 없기 때문에, 원래의 정상 커밋을 가리키는 v 접두사 태그(예: v0.34.0)로 다시 공개됐습니다(일부는 복구되지 않음). 아직 옛 버전을 참조하고 있다면 참조를 바꿔야 합니다.

CI 설정에서 점검할 것

액션을 커밋 SHA로 고정하는 기본 원칙은 TanStack, Nx Console, GitHub로 이어진 연쇄에서 다룹니다. 여기서는 Trivy 사고가 새로 보여 준 점에 집중합니다.

1

SHA로 고정한 액션이 내부에서 태그로 부르는 것을 확인한다

권고에 따르면 trivy-action은 2025년 4월 9일에 병합된 풀 리퀘스트에서 내부 구성 요소 참조를 SHA 고정으로 바꿨습니다. 그보다 이전 커밋에 trivy-action을 고정한 사람은, 안전한 trivy-action이 악성 setup-trivy를 태그로 부르는 상태였습니다.

다른 액션을 조합해 만든 액션(컴포지트 액션)을 쓴다면, 고정한 커밋의 action.yml을 열어 내부의 uses: 줄이 SHA로 고정돼 있는지 확인하세요. 그렇지 않다면 더 새로운 커밋으로 옮기거나, 내부 구성 요소를 내 워크플로에서 직접 SHA로 고정해 부르세요.

2

SHA 고정을 개인에게 맡기지 말고 조직 설정에서 의무화한다

2025년 8월 GitHub는 허용 액션 정책에 액션을 전체 커밋 SHA로 고정하도록 요구하는 옵션을 추가했습니다. 엔터프라이즈, 조직, 저장소 단위로 설정할 수 있으며, 고정되지 않은 액션을 쓰는 워크플로는 실패합니다. 같은 정책으로 특정 액션이나 버전을 차단할 수도 있어서, 이번 같은 사고 때 영향받은 버전을 조직 전체에서 막는 수단도 됩니다.

3

'Immutable' 배지만 믿지 않는다

권고에 따르면 Trivy v0.69.3과 trivy-action 0.35.0이 피해를 피한 것은 공개 전에 GitHub의 불변 릴리스(immutable releases)가 켜져 있었기 때문입니다. 하지만 Aqua는 변조된 태그 옆에도 "Immutable" 배지가 표시됐다며, 믿을 수 있는 방어 수단은 배지가 아니라 전체 커밋 SHA 고정이라고 밝혔습니다. 배지는 릴리스가 공개된 시점의 상태를 나타냅니다.

4

바이너리는 버전을 고정하고 서명을 검증하며, 이미지는 다이제스트로 참조한다

권고에서 다이제스트(@sha256:…)로 참조한 이미지는 영향을 받지 않았습니다. latest나 버전 태그만으로 내려받았다면 기간 중에 악성 빌드를 받았을 것입니다. Trivy 권고는 Sigstore 서명과 서명 타임스탬프로 바이너리와 이미지를 검증하는 방법도 안내합니다. CI가 내려받는 도구는 버전을 명시하고, 가능하면 다이제스트나 체크섬으로 고정하세요.

5

스캐너는 배포용 비밀값이 없는 잡에서 실행한다

Aqua에 따르면 악성 코드는 정상 스캔보다 먼저 실행됐고 스캔 결과는 정상으로 보였기 때문에 알아차리기 어려웠습니다. 스캔에는 보통 클라우드나 레지스트리에 대한 쓰기 권한이 필요 없습니다. 스캔은 배포용 비밀값을 받지 않는 별도 잡에서 실행하고, permissions:는 읽기 전용으로 설정하세요.

Aqua에 따르면 대체 유출 경로는 개인 액세스 토큰(PAT)이 워크플로에 전달됐을 때만 동작했고, 기본 GITHUB_TOKEN으로는 실패했습니다. 스캔 단계에 개인 토큰을 넘기고 있지 않은지 확인하세요.

무슨 일이 있었나 (Aqua Security의 공개 내용 기준)

아래는 모두 Aqua Security의 공개 내용(3월 22일 첫 게시, 4월 1일까지 업데이트)과 Trivy 보안 권고에 적힌 내용입니다. 시간은 UTC입니다.

  1. 2026년 2월 말

    Trivy의 GitHub Actions 환경의 설정 오류가 악용돼 권한 있는 접근 토큰이 빠져나감.
  2. 3월 1일

    Trivy 팀이 이 사고를 공개하고 인증 정보를 교체. Aqua에 따르면 교체가 한꺼번에 이뤄지지 않았고, 공격자는 아직 유효한 인증 정보로 접근을 유지.
  3. 3월 19일 약 17:43

    trivy-action 태그 77개 중 76개와 setup-trivy 태그 7개 전부가 악성 커밋을 가리키도록 바뀜. 동시에 침해된 서비스 계정이 릴리스 자동화를 실행해 악성 Trivy v0.69.4를 공개(18:22부터 배포물 제공).
  4. 3월 19일 약 20:38

    Trivy 팀이 공격을 파악·차단하고 배포 채널에서 악성 배포물을 제거.
  5. 3월 20일

    안전한 버전, 사용자 안내, 침해 지표 공개.
  6. 3월 21일

    보안 권고 GHSA-69fq-xp46-6x23(CVE-2026-33634) 공개.
  7. 3월 22일

    Docker Hub에 악성 이미지 v0.69.5, v0.69.6이 올라옴(별도로 침해된 Docker Hub 인증 정보 사용). 같은 날 Aqua의 내부 저장소가 GitHub에 무단으로 공개됨. Aqua는 공격자가 첫 차단 이후 접근을 되찾았다고 설명.
  8. 3월 23일

    Aqua가 외부 사고 대응 업체를 조사에 투입. Aqua의 다른 스캐너인 KICS의 GitHub Action에서도 병행된 침해가 확인됨.
  9. 4월 1일

    Aqua가 조사가 거의 마무리 단계이며, 상용 제품이 영향을 받았다는 징후는 여전히 없다고 발표.
76 / 77
변조된 trivy-action 태그 (안전했던 것은 0.35.0뿐)
7 / 7
변조된 setup-trivy 태그
약 12시간
trivy-action 태그가 변조돼 있던 시간 (권고)
징후 없음
Aqua Platform의 Trivy를 포함한 상용 제품 영향 (Aqua)
Aqua Security가 공개한 내용
영향 대상
Trivy v0.69.4(바이너리, deb/rpm, 컨테이너 이미지), Docker Hub의 v0.69.5와 v0.69.6, 0.35.0을 제외한 모든 trivy-action 태그, 모든 setup-trivy 태그
코드가 한 일
CI 러너와 기기에서 클라우드, SSH, Kubernetes, Docker, Git, 데이터베이스 인증 정보와 .env 파일을 수집해 암호화한 뒤 외부로 보냄. 정상 스캔보다 먼저 실행돼 결과는 정상으로 보였음
원인
2월 말 GitHub Actions 설정 오류를 통해 권한 있는 토큰이 빠져나갔고, 3월 1일의 교체가 원자적이지 않아 접근이 유지됨
Aqua의 대응
모든 채널에서 악성 배포물 삭제, 변조된 태그를 삭제하거나 검증된 커밋으로 다시 지정, 오픈소스 조직의 모든 자동화·서비스 계정·토큰 잠금, 장기 인증 정보 의존 축소, 불변 릴리스 검증과 출처 증명(provenance attestation) 도입
영향 없음
Aqua Platform의 Trivy를 포함한 상용 제품(GitHub와 분리된 인프라에서 빌드되며, 비밀값과 서명 시스템을 공유하지 않음)

읽는 법: 피해 규모는 공개되지 않았다

Aqua는 Trivy가 오픈소스이기 때문에 사용자 전체 기록이 없고, 모든 사용자에게 직접 알릴 방법이 없다고 밝혔습니다. 영향받은 조직 수는 공개되지 않았으며, 이 사이트는 추정치를 싣지 않습니다.

Aqua의 공개 내용에는 공격자와 분석을 도운 외부 업체의 이름도 나오지만, 이 사이트의 방침에 따라 사고를 공개한 조직만 실명으로 적습니다. 판단은 눈에 띄는 숫자가 아니라 내 워크플로가 영향 기간에 영향받은 참조 방식으로 실행됐는가로 하세요.

어느 단계에서 막을 수 있었나

1. 2월 말 ~ 3월 1일

토큰 유출, 교체에 며칠 걸림

↓

교훈 (내 조직에서)

전부 멈춘 뒤 한꺼번에 재발급

2. 3월 19일: 태그 변조

같은 태그 이름이 악성 커밋을 가리킴

↓

막을 수 있었던 설정

정책으로 SHA 고정 강제, 내부 구성 요소도 고정

3. 악성 v0.69.4와 latest

모든 공식 채널로 배포

↓

막을 수 있었던 설정

버전 명시, 다이제스트, 서명 검증

4. 내 CI 잡

스캔 전에 비밀값 수집

↓

피해 줄이기

스캔 잡에 비밀값·개인 토큰을 두지 않음

Aqua Security의 공개 내용과 권고를 바탕으로 재구성한 경로. 각 단계의 오른쪽은 피해를 막거나 줄일 수 있었던 사용자 쪽 설정입니다.

영향받은 참조 방식 (권고 기준)

  • trivy-action@0.34.2 같은 태그 참조(0.35.0 이외 전부)
  • version: latest 명시(바이너리 노출 기간 중)
  • 2025년 4월 9일 이전 커밋에 대한 SHA 고정(내부의 setup-trivy를 태그로 호출)
  • SHA로 고정하지 않은 모든 setup-trivy 참조
  • latest나 0.69.4 같은 이미지 태그

영향받지 않은 참조 방식

  • trivy-action@0.35.0(공개 전에 불변 릴리스가 켜져 있었음)
  • 2025년 4월 9일 이후의 안전한 커밋에 대한 SHA 고정
  • 안전한 커밋에 SHA로 고정한 setup-trivy
  • 다이제스트로 참조한 이미지
  • Trivy v0.69.3 이하, 소스에서 빌드한 것, 공식 Homebrew 포뮬러

이 사이트의 시각: 침해가 의심되면 키는 한꺼번에 교체한다

키 교체는 보통 중요도가 낮은 것부터 하나씩, 서비스를 멈추지 않고 진행합니다. 중단을 피하는 것은 실제 이점이지만, Trivy 사고는 이 방식이 아직 접근 권한을 가진 공격자를 끊어 내지 못한다는 것을 보여 줍니다. Aqua에 따르면 며칠에 걸친 교체 동안 아직 유효한 토큰으로 새로 발급된 비밀값까지 가져갔을 수 있고, 그것이 3주 뒤의 악성 릴리스로 이어졌습니다.

침해가 의심될 때는 다음 순서로 교체하세요. (1) 모든 키와 그 키를 읽을 수 있는 위치를 목록으로 만든다, (2) 오래된 키를 함께 무효화한다, (3) 그다음에야 새 키를 발급한다, (4) 오래된 키가 실제로 실패하는지 확인한다. 짧은 중단을 계획해 두세요. 오래된 키와 새 키를 나란히 운영하는 평소 방식은 아무것도 유출되지 않았다는 전제에 서 있습니다.

한 가지 더. 취약점 스캐너는 방어 도구이기 때문에, CI에서 다른 어떤 것보다 많은 곳에서 넓은 권한으로 실행되기 쉽습니다. 그렇다고 방심하지 말고, 비밀값을 읽을 수 없는 잡에서 실행하세요.

출처 (공개 기록)

이 글의 사실관계는 아래 공개 자료를 따릅니다. 공격 기법, IoC 값, 공격자를 특정하는 정보는 다루지 않았습니다.

  • Aqua Security, "Trivy Supply Chain Attack: What You Need to Know"(2026년 3월 22일 첫 게시, 4월 1일 업데이트) — aquasec.com
  • Trivy 보안 권고 "Trivy ecosystem supply chain temporarily compromised", GHSA-69fq-xp46-6x23(CVE-2026-33634, 3월 21일 공개, 3월 30일 업데이트) — github.com
  • Trivy, "Trivy Security incident 2026-03-19"(GitHub Discussions, Trivy 팀의 상황 업데이트) — github.com
  • GitHub Changelog, "GitHub Actions policy now supports blocking and SHA pinning actions"(2025년 8월 15일) — github.blog
  • GitHub Docs, "Secure use reference"(서드파티 액션 사용) — docs.github.com

업데이트 기록

2026-09-30: 첫 공개. Aqua Security의 공개 내용(4월 1일 업데이트)과 Trivy 보안 권고(3월 30일 개정)를 바탕으로 작성.

다음에 읽을 글

FAQ

Q어떤 Trivy 버전이 영향을 받았나요?
A

Trivy 보안 권고 GHSA-69fq-xp46-6x23(CVE-2026-33634)에 따르면 영향받은 것은 Trivy v0.69.4(GitHub, deb, rpm, get.trivy.dev로 배포된 바이너리와 GHCR, ECR Public, Docker Hub의 컨테이너 이미지. 노출 기간에는 latest 태그도 이 버전을 가리킴)와 Docker Hub에 올라온 컨테이너 이미지 v0.69.5, v0.69.6입니다. v0.69.3 이하, 다이제스트로 참조한 이미지, 소스에서 빌드한 바이너리, 공식 Homebrew 포뮬러는 영향을 받지 않았습니다.

Qtrivy-action을 쓰고 있습니다. 영향을 받았나요?
A

권고에 따르면 0.35.0 이외의 태그(0.0.1~0.34.2)를 참조했거나, 바이너리 노출 기간에 version: latest를 명시했거나, 2025년 4월 9일 이전 커밋에 SHA로 고정했다면 영향을 받았습니다. 0.35.0 태그와 2025년 4월 9일 이후의 안전한 커밋에 대한 SHA 고정은 영향을 받지 않았습니다. 태그가 변조된 기간은 2026년 3월 19일 약 17:43(UTC)부터 3월 20일 약 05:40(UTC)까지입니다.

Qsetup-trivy를 쓰고 있습니다. 영향을 받았나요?
A

권고에 따르면 SHA로 고정하지 않은 사용은 모두 영향을 받았습니다. 태그 7개(v0.2.0~v0.2.6) 전부가 3월 19일 약 17:43부터 21:44(UTC) 사이에 악성 커밋을 가리키도록 바뀌었습니다. 안전한 커밋에 대한 SHA 고정은 영향을 받지 않았고, v0.2.6은 안전한 내용으로 다시 만들어졌습니다.

Q영향을 받았다면 무엇을 해야 하나요?
A

Aqua는 침해된 버전이 내 환경에서 실행됐을 가능성이 조금이라도 있다면, 영향받은 파이프라인이 접근할 수 있던 모든 비밀값을 노출된 것으로 보고 즉시 교체해야 한다고 밝혔습니다. 클라우드 인증 정보(AWS, GCP, Azure), Git 인증 정보, 컨테이너 레지스트리 인증 정보, SSH 키, Kubernetes 토큰, 환경 변수 및 기타 자동화용 비밀값이 대상입니다. npm 배포 토큰은 실제로 침해된 것으로 취급하라고 밝혔습니다.

Q원인은 무엇이었나요?
A

Aqua에 따르면 2026년 2월 말 공격자가 Trivy의 GitHub Actions 환경의 설정 오류를 악용해 권한 있는 접근 토큰을 빼냈습니다. 이 사고는 3월 1일에 공개되고 인증 정보가 교체됐지만, 교체가 한꺼번에(원자적으로) 이뤄지지 않고 며칠이 걸렸으며, 공격자가 아직 유효한 토큰으로 새로 교체된 비밀값까지 얻었을 수 있습니다. Aqua는 이것이 3월 19일의 악성 릴리스로 이어졌다고 설명합니다.

QAqua Security의 상용 제품도 영향을 받았나요?
A

Aqua는 Aqua Platform에 포함된 Trivy를 비롯해 상용 제품이 영향을 받았다는 징후는 없다고 밝혔습니다. 상용 플랫폼은 GitHub와 분리된 환경에서 빌드·운영되며, 저장소, CI/CD 인프라, 비밀값, 서명 시스템을 공유하지 않고, 오픈소스 릴리스는 보안 검토 관문을 거친 뒤에만 받아들인다고 설명합니다. 이 설명은 오픈소스 Trivy를 직접 쓰는 경우에는 해당하지 않습니다.