TechFeedTechFeed
Security

Supply Chain 공격 방어 가이드 — npm, pip, 컨테이너 보안

한 줄 요약: Supply chain 공격은 의존성 패키지, 빌드 도구, 컨테이너 이미지를 통해 악성 코드가 배포 파이프라인에 침투하는 공격이다. lockfile 고정, SBOM 생성, 이미지 서명 검증을 조합하면 실질적 방어가 가능하다. Supply chain 공격은 소프트웨어 개발 및 배포 파이프라인의 어느 단계에서나 발생할 수 있다. 주요 공격 벡터는 다음과 같다.

by

한 줄 요약: Supply chain 공격은 의존성 패키지, 빌드 도구, 컨테이너 이미지를 통해 악성 코드가 배포 파이프라인에 침투하는 공격이다. lockfile 고정, SBOM 생성, 이미지 서명 검증을 조합하면 실질적 방어가 가능하다.


2021년 ua-parser-js, 2020년 event-stream 사건처럼 수백만 개 프로젝트가 의존하는 오픈소스 패키지가 악의적으로 수정된 사례가 반복되고 있다. 공격자는 소셜 엔지니어링으로 메인테이너 권한을 탈취하거나, 오타 스쿼팅(typosquatting)으로 유사 패키지명을 등록해 개발자를 속인다. 이 가이드는 npm, pip, 컨테이너 환경의 실질적 방어 전략을 다룬다.


Supply Chain 공격 유형과 실제 사례

Supply chain 공격은 소프트웨어 개발 및 배포 파이프라인의 어느 단계에서나 발생할 수 있다. 주요 공격 벡터는 다음과 같다.


Supply Chain 공격 유형과 실제 사례 — 보안 아키텍처 다이어그램
Supply Chain 공격 방어 가이드 — npm, pip, 컨테이너 보안 — 보안 아키텍처 다이어그램 (출처: 공식 문서 및 벤치마크 데이터 기반)
event-stream 사건 (2018): npm 주간 다운로드 200만 건의 event-stream 패키지 메인테이너 권한이 신뢰할 수 없는 기여자에게 이전됐다. 해당 기여자는 특정 Bitcoin 지갑을 대상으로 잔액을 탈취하는 코드를 flatmap-stream 의존성에 숨겨 배포했다. 직접적인 코드보다 간접 의존성을 통한 공격이라 탐지가 매우 어려웠다.

npm 보안 강화 실전 가이드

npm 환경에서 supply chain 공격을 방어하는 핵심은 lockfile 고정 + audit + 패키지 검증의 조합이다.


npm 보안 강화 실전 가이드 — 위협 모델 시각화
Supply Chain 공격 방어 가이드 — npm, pip, 컨테이너 보안 — 위협 모델 시각화 (출처: 공식 문서 및 벤치마크 데이터 기반)
Bash — npm audit 및 취약점 확인
# 취약점 스캔 npm audit # 자동 수정 가능한 취약점 패치 npm audit fix # 세부 리포트 (JSON 형식) npm audit --json > audit-report.json # 심각도 레벨 지정 (critical/high만 실패 처리) npm audit --audit-level=high # CI에서 사용: 취약점 발견 시 빌드 실패 npm audit --audit-level=critical || exit 1
Bash — lockfile 무결성 검증
# CI에서는 반드시 npm ci 사용 (package-lock.json 기반 정확 설치) # npm install은 lockfile을 변경할 수 있어 위험 npm ci # lockfile 변경 여부 검사 (CI 파이프라인에서 활용) npm install git diff --exit-code package-lock.json || { echo "package-lock.json이 변경됐습니다. 의도하지 않은 의존성 변경 확인 필요" exit 1 }
Bash — .npmrc로 레지스트리 고정 및 보안 설정
# .npmrc 설정 (프로젝트 루트 또는 홈 디렉토리) # 공식 npm 레지스트리만 허용 registry=https://registry.npmjs.org/ # 스크립트 자동 실행 비활성화 (postinstall 악성 스크립트 방지) ignore-scripts=true # 패키지 설치 시 integrity 체크 강제 package-lock=true # audit 서버 설정 audit-registry=https://registry.npmjs.org/
ignore-scripts 주의: ignore-scripts=true를 설정하면 일부 패키지(node-sass, sqlite3 등 네이티브 모듈)가 빌드 실패할 수 있다. 이 경우 신뢰하는 패키지만 선택적으로 스크립트 실행을 허용하는 방식(npm install --ignore-scripts 후 개별 실행)을 검토하자.

pip/Python 환경 보안 강화

Python 생태계도 npm과 유사한 supply chain 위협에 노출돼 있다. PyPI에서 2022~2024년 사이 수백 개의 악성 패키지가 제거됐다. requirements.txt 해시 고정과 pip-audit 도구를 활용한 방어가 핵심이다.


Bash — pip 보안 강화
# requirements.txt에 해시 고정 (pip-compile 활용) pip install pip-tools pip-compile --generate-hashes requirements.in -o requirements.txt # 해시 검증과 함께 설치 pip install --require-hashes -r requirements.txt # pip-audit으로 취약점 스캔 pip install pip-audit pip-audit pip-audit --requirement requirements.txt # 결과 JSON 저장 pip-audit --format json -o audit.json # Safety 도구 (OSV 데이터베이스 기반) pip install safety safety check
requirements.txt — 해시 고정 예시
# pip-compile --generate-hashes로 생성된 형식 requests==2.31.0 --hash=sha256:58cd2187423839b4b35c9da0e4fa8d4af5ccf6c8e8ed8a71bfbbb7e7b04eb8e9 --hash=sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1 certifi==2024.2.2 --hash=sha256:abc12345...

SBOM 생성과 컨테이너 이미지 보안

SBOM(Software Bill of Materials)은 소프트웨어에 포함된 모든 컴포넌트와 의존성 목록이다. Log4Shell 같은 취약점 발생 시 영향받는 시스템을 즉시 파악하는 데 필수적이다. 미국 NIST와 EU Cyber Resilience Act에서 SBOM 제출을 의무화하는 방향으로 가고 있다.


pip/Python 환경 보안 강화 — 취약점 분석 플로우차트
Supply Chain 공격 방어 가이드 — npm, pip, 컨테이너 보안 — 취약점 분석 플로우차트 (출처: 공식 문서 및 벤치마크 데이터 기반)
Bash — Syft로 SBOM 생성 (Node.js/컨테이너)
# Syft 설치 (macOS) brew install anchore/syft/syft # Node.js 프로젝트 SBOM 생성 (SPDX 형식) syft . -o spdx-json > sbom.spdx.json # CycloneDX 형식 syft . -o cyclonedx-json > sbom.cyclonedx.json # Docker 이미지 SBOM 생성 syft ubuntu:22.04 -o table # Grype로 SBOM 취약점 스캔 brew install anchore/grype/grype grype sbom:./sbom.spdx.json
Bash — 컨테이너 이미지 보안 스캔 (Trivy)
# Trivy 설치 (macOS) brew install aquasecurity/trivy/trivy # 이미지 취약점 스캔 trivy image nginx:latest # CRITICAL/HIGH만 출력 trivy image --severity CRITICAL,HIGH node:20-alpine # 파일시스템 스캔 (프로젝트 디렉토리) trivy fs . # CI에서 사용: 취약점 발견 시 빌드 실패 trivy image --exit-code 1 --severity CRITICAL myapp:latest # Cosign으로 이미지 서명 검증 brew install cosign cosign verify --certificate-identity-regexp='https://github.com/' --certificate-oidc-issuer='https://token.actions.githubusercontent.com' cgr.dev/chainguard/node:latest

방어 체크리스트와 CI/CD 통합

아래 체크리스트를 팀의 개발 프로세스와 CI/CD 파이프라인에 통합하면 supply chain 공격에 대한 실질적 방어선을 구축할 수 있다.


YAML — GitHub Actions 보안 강화 예시
name: Secure Build on: [push, pull_request] jobs: security: runs-on: ubuntu-latest permissions: contents: read security-events: write steps: # 타사 액션은 커밋 SHA로 고정 (태그 아님) - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 - name: Setup Node.js uses: actions/setup-node@8f152de45cc393bb48ce5d89d36a731955982216 # v4.0.0 with: node-version: '20' cache: 'npm' # lockfile 기반 정확 설치 - run: npm ci # 취약점 스캔 - run: npm audit --audit-level=high # SBOM 생성 - name: Generate SBOM uses: anchore/sbom-action@78fc58e266e87a38d4194b2137a3d4e9baf7b82e # v0.15.0 with: format: spdx-json artifact-name: sbom.spdx.json

참고 자료:



supply-chain보안npm-auditSBOM컨테이너보안의존성

함께 보면 좋은 문제 해결

관련 포스트