비밀 키 유출은 항상 코드 오류나 취약한 라이브러리 때문만은 아닙니다. 때로는 CI 실행 중에 비밀 키를 관리하는 방식 때문에 문제가 발생하기도 하는데, CVE-2025-30066은 이러한 문제가 어떻게 발생할 수 있는지 보여주는 대표적인 사례입니다. GitHub Actions tj-actions/changed-files는 변경된 파일을 감지하는 데 널리 사용되는데, 이 액션에서 비밀 키 유출 문제가 발생했습니다. pull requests비밀 유출의 조용한 통로가 되었습니다. 무슨 일이 일어났는지, 그리고 어떻게 보안을 강화할 수 있는지 알아보겠습니다. CI/CD 비밀 pipeline.
CVE-2025-30066에서 무슨 일이 일어났나요?
2025년 3월 중순, tj-actions/changed-files가 해킹당했습니다. 공격자는 기존 버전 태그(v45.0.7까지)를 악성 링크를 가리키도록 변경했습니다. commit이로 인해 개발자들이 알아채지 못하는 사이에 액션의 동작 방식이 변경되었습니다. 새로운 버전이 출시된 것이 아니라, 눈에 보이지 않는 태그 수정만 이루어졌습니다.
해당 페이로드는 단순하지만 위험했습니다. 원격에서 Base64로 인코딩된 Python 스크립트를 가져와 실행기 메모리를 스캔하여 자격 증명을 로그에 기록하거나 유출하는 방식이었습니다. 이는 tj-actions/changed-files의 논리적 코드 결함이 아니라, 재사용 가능한 액션을 사용하는 CI 워크플로 내에서 비밀 정보 유출이 발생할 수 있는 방식을 악용한 결과였습니다. CVE-2025-30066은 버퍼 오버플로에 관한 것이 아니라, 비밀 정보 유출을 가능하게 한 CI 설계 결함에 관한 것이었습니다.
영향: tj-actions/changed-files의 영향을 받는 버전을 사용하는 모든 저장소는 비밀 정보 유출 위험에 노출되었으며, 특히 파일 패턴이나 CI 출력에서 민감한 토큰이나 파일을 안전하지 않게 처리하는 경우 더욱 그러했습니다.
이것이 재사용 가능한 액션에 의존하는 워크플로에 영향을 미치는 이유는 무엇일까요?
DevSecOps 워크플로 tj-actions/changed-files에 크게 의존하여 다음을 수행합니다.
- Automate pull request 체크 무늬
- 특정 경로에서 변경된 파일을 식별합니다.
- 중복되는 CI 작업을 피하세요
하지만 이러한 워크플로는 종종 한 가지를 간과합니다. 바로 글로브 패턴에 민감한 데이터가 포함될 수 있다는 점입니다. 개발자들은 tj-actions/changed-files가 기본적으로 안전하게 작동한다고 생각합니다. 그러나 글로브 패턴을 사용하면 민감한 데이터가 포함될 수 있습니다. 설정/** 그리고 비밀은 여기에 저장됩니다. configs/secrets.env방금 CI 출력이나 로그에 비밀 파일을 추가하셨군요. 이건 액션의 버그가 아니라, 그냥 생긴 현상입니다. CI/CD 기밀 정보 유출로 이어지는 설계 결함. CVE-2025-30066이 이에 대한 명확한 예입니다.
기밀 유출은 어떻게 발생했는가 (취약점 분석)
CVE-2025-30066의 근본적인 문제점을 분석해 보겠습니다.
- Globbing 패턴은 다음과 같습니다. **/*.env 의도치 않게 비밀 파일들을 일치시켰습니다.
- tj‑actions/changed‑files는 해당 비밀 정보를 변경된 파일로 처리했습니다.
- 비밀 정보가 단계별 출력, 로그 또는 하위 작업에 남게 되었습니다.
이 문제는 비밀 정보가 버전 관리되는 경로에 저장되었기 때문에 발생했으며(좋지 않은 방식), CI 설정에서 해당 정보를 글로빙(globbing)에서 명시적으로 제외하지 않았기 때문입니다(이 또한 좋지 않은 방식). 따라서 이는 코드 버그가 아니라, CI 설계상의 미흡함으로 인해 tj-actions/changed-files 출력에서 비밀 정보가 유출된 것입니다.
실제 공격 경로: CI 작업에서 자격 증명 노출까지
tj-actions/changed-files를 통해 비밀 정보 유출을 초래한 CI 설정 예시:
If configs/secrets.env 변경됨 :
- tj‑actions/changed‑files에 의해 플래그가 지정되었습니다.
- 포함되었습니다 단계.변경됨.출력.모든변경됨파일
- 이후 단계에서 해당 정보가 기록되거나 스크립트로 전달되어 비밀 정보가 유출되었습니다.
이번 정보 유출은 CI 로직이 비밀 정보를 일반 파일처럼 취급했기 때문에 발생했습니다. 버퍼 오버플로 때문이 아니라, 결함 있는 CI 설계에서 tj-actions/changed-files를 잘못 사용한 것이 정보 유출의 원인입니다.
전파는 다음과 같은 출력으로 발생합니다:
If secrets.env 해당 목록에 있는 경우 파일 이름과 내용이 빌드 로그에 나타날 수 있습니다. 다음과 같은 조건부 로직도 마찬가지입니다.
민감한 유물을 노출시킬 수 있습니다. 이것은 CI/CD 비밀 정보 유출을 허용한 것은 액션 코드의 결함이 아니라 설계상의 문제입니다.
재사용 가능한 워크플로우를 안전하게 사용하고 누출을 방지하는 방법
tj-actions/changed-files를 버릴 필요는 없습니다. 비밀 유지를 최우선으로 하는 재사용 가능한 액션을 사용해야 합니다.
비밀 관리 모범 사례
- 비밀 정보는 절대로 버전 관리하지 마세요.
- 민감한 경로와 일치하는 글로브 패턴을 피하십시오.
- 환경 변수 기반 비밀 키(GITHUB_ENV, 볼트, GitHub Secrets)를 사용하세요.
CI/CD 구성 Guardrails
- 액션은 태그가 아닌 변경 불가능한 SHA에 고정해야 합니다(절대 태그 사용 금지). @v45)
- tj-actions/changed-files 출력 결과를 오염된 것으로 간주하고, 정제하거나 필터링합니다.
- 검증된 경우에만 출력을 설정합니다.
⚠️ 안전하지 않은 예시:
위 내용은 바로 기밀 유출 및 CVE-2025-30066의 원인이 되는 악용 사례입니다.
안전한 대안:
이렇게 하면 다음을 피할 수 있습니다. CI/CD tj-actions/changed-files를 통해 비밀 정보가 유출되는 설계 결함.
또한 :
- 비밀 정보가 노출될 수 있는 로깅을 비활성화하거나 제한하십시오.
- GitHub의 숨겨진 마스킹 기능을 사용하세요
- 빌드 로그 및 아티팩트에 대한 접근을 제한합니다.
Quick Secrets - 안전한 CI 사용 체크리스트
| 모범 사례 |
|---|
| 버전 관리되는 파일에 비밀 정보를 저장하지 마세요. |
| 자격 증명에는 볼트 또는 GitHub Secrets를 사용하세요. |
| tj-actions/changed-files를 항상 변경 불가능한 SHA에 고정하십시오. |
| tj-actions/changed-files의 출력물을 필터링하거나 정제합니다. |
| 글로브 패턴에 비밀 경로를 절대 포함시키지 마세요. |
| 민감한 데이터가 노출될 수 있는 로그를 숨기거나 제한합니다. |
| 감사 과정에서 상속된 CI 구성이 자주 확인됩니다. |
Xygeni의 역할: 대규모 CI 비밀 유지 강화
제니 확보 CI/CD pipelines는 ~에 집중함으로써 실생활에서 비밀이 어떻게 다뤄지고, 사용되고, 드러나는가 DevOps 워크플로는 단순히 코드를 스캔하는 것만이 아니라, 실제 운영 환경에서 비밀 관리 모범 사례를 적용하는 것을 의미합니다. pipeline 분석.
안전하지 않은 출력 사용 감지
- GitHub Actions를 스캔합니다. 용도 echo, run 및 출력은 ${{ steps.*.outputs.* }}입니다. 민감한 값이 포함될 수 있습니다.
- 비밀 정보가 의도적으로든 실수로든 직접적으로 참조되거나 인쇄되는 경우를 식별합니다.
유출된 비밀 모니터링
- 로그 및 단계별 출력에서 높은 엔트로피 값(API 키, 토큰)을 감지합니다.
- 비밀 정보가 나타나면 알림을 발생시킵니다. pipeline 로그는 하위 단계에서 가려지더라도 마찬가지입니다.
잘못 구성된 액션 사용
- 모든 GitHub Actions 활동을 추적합니다. pipeline손상된 버전 사용을 감지하기 위한 도구(예: tj-actions/changed-files@v45)
- 잠재적인 비밀 정보를 포함하는 파일 일치 패턴을 감사합니다. **/*.env, *.key 또는 .env.*
정책 기반 CI Guardrails
- 타사 작업에 대한 SHA 고정을 강제합니다.
- 로그에 비밀 정보를 포함시킬 수 있는 안전하지 않은 파일 글로브 사용을 차단합니다.
- 방지 pipeline워크플로 출력의 일부로 민감한 값을 내보내는 것을 방지합니다.
Xygeni는 워크플로우를 위협 표면의 일부로 간주함으로써 비밀 정보 보호가 단순한 모범 사례가 아닌 내장된 방어 체계가 되도록 보장합니다.
결론: 비밀 유출은 사소한 행동 오용에서 시작될 수 있다
CVE-2025-30066은 라이브러리 버그가 아니었습니다. CI/CD tj-actions/changed-files를 잘못 사용해서 발생한 설계 오류. DevSecOps 팀이 얻어야 할 교훈:
- CI에서 모든 glob/파일 참조를 잠재적인 메모리 누수 지점으로 간주하십시오.
- 비밀 정보가 실수로 포함되었는지 확인하기 위해 정기적으로 워크플로를 감사합니다.
- 보안 저장소 또는 환경 변수를 사용하여 비밀 키를 관리하고, 버전 관리 시스템에 비밀 키를 절대 저장하지 마십시오.
- 워크플로 출력물을 모두 정제하거나 필터링합니다.
- 감사 가능성을 유지하기 위해 중요한 워크플로 활동을 기록합니다.
CI는 코드입니다. 워크플로도 코드입니다. 로그와 출력도 코드입니다. 모든 단계에서 비밀 정보를 보호하세요. 그렇지 않으면 해커 없이도 악의적인 사용자만으로도 비밀 정보 유출이라는 심각한 문제가 발생할 수 있습니다. CI/CD 디자인 선택.





