패키지 설치, 당신의 모든 비밀을 노출시킬 수 있습니다!

by DD
2개월 전
조회수 2

의존성 패키지(Dependency Packages) 설치 과정에서 실행되는 코드가 환경 변수, API 키 등 민감 정보(Sensitive Information)를 탈취할 수 있음

CI/CD 환경(CI/CD Environment)에서 패키지 설치 시, 빌드 및 배포에 사용되는 비밀 정보(Secrets)가 노출될 위험이 높음

패키지 잠금(Package Lock), CI 액션 고정(Pin CI Actions), 빌드/런타임 비밀 분리(Separate Build-time and Runtime Secrets) 등 구체적인 보안 대책 제시

Trivy, LiteLLM 등 실제 공급망 공격(Supply Chain Attack) 사례를 통해 보안 취약점(Security Vulnerabilities)의 심각성을 강조

의존성 패키지 공격 경로와 작동 방식

의존성 패키지 공격은 패키지 설치 시 실행되는 스크립트를 악용하여 이루어진다. 특히, `npm`의 `preinstall`, `install`, `postinstall` 스크립트나 `pip`의 일반 설치 방식은 임의 코드 실행을 허용한다. 공격자는 이러한 취약점을 통해 환경 변수, 설정 파일, 클라우드 자격 증명 등 현재 프로세스에서 접근 가능한 모든 정보(All Accessible Information)를 탈취한다. 데이터 미저장 정책(Zero-Retention Policy)을 준수하는 환경에서도 이러한 공격은 유효하며, 아웃바운드 네트워크 요청을 통해 탈취된 정보를 외부로 전송한다.

CI/CD 환경에서의 위험성

CI/CD 환경은 빌드, 테스트, 배포 과정에서 다양한 비밀 정보를 사용하므로 공격의 주요 표적이 된다. 하나의 `.env` 파일에 모든 비밀 정보를 저장하는 방식은 광범위한 공격 표면(Broad Attack Surface)을 초래하며, 패키지가 설치되는 과정에서 이러한 정보가 노출될 위험이 있다. 데이터 격리 아키텍처(Data Isolation Architecture)를 적용하지 않으면, 빌드 단계에서 필요한 정보 외에 불필요한 정보까지 노출되어 보안 사고로 이어질 수 있다. 따라서, 빌드 타임과 런타임에 사용되는 비밀 정보를 분리하는 것이 중요하다.

공급망 공격(Supply Chain Attack) 사례 분석

실제 사례로, Aqua의 Trivy 공격과 LiteLLM의 악성 패키지 배포 사건이 언급되었다. Trivy 공격은 CI 환경의 신뢰된 경로를 악용하여 런너의 비밀 정보를 탈취했으며, LiteLLM은 Trivy 의존성을 통해 환경 변수, SSH 키, 클라우드 자격 증명 등을 수집하여 외부로 전송했다. 이러한 사건들은 의존성 관리(Dependency Management)의 중요성을 강조하며, 패키지 잠금, CI 액션 고정, 아웃바운드 트래픽 모니터링 등 구체적인 방어 전략의 필요성을 보여준다.

보안 강화를 위한 구체적인 방어 전략

의존성 패키지 보안을 강화하기 위해, 패키지 잠금 파일(`package-lock.json`, `requirements.txt`)을 사용하여 의존성 트리를 고정하고, CI 액션을 특정 커밋 SHA에 고정해야 한다. 또한, 빌드 타임과 런타임에 사용되는 비밀 정보를 분리하여 각 환경에 필요한 최소한의 정보만 노출하도록 해야 한다. 특히, 신뢰도가 낮은 패키지나 직접 Git에서 설치하는 패키지는 더욱 주의해야 하며, 아웃바운드 트래픽을 모니터링하여 의심스러운 통신을 감지해야 한다. 이러한 조치들은 공격 표면(Attack Surface)을 줄이고, 잠재적인 보안 사고의 영향을 최소화하는 데 기여한다.

Every Package You Install Can Read Your Secrets